Redis哨兵

Sentinel是Redis的高可用性(high availability)解决方案

由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

实际上这意味着使用哨兵模式,可以创建一个不用人为干预而应对各种故障的Redis部署。

哨兵模式的功能列表

  • 监听:哨兵不断的检查master和slave是否正常的运行。

  • 通知:当监控的某台Redis实例发生问题时,可以通过API通知系统管理员和其他的应用程序。

  • 自动故障转移:如果一个master不正常运行了,哨兵可以启动一个故障转移进程,将一个slave升级成为master,其他的slave被重新配置使用新的master,并且应用程序使用Redis服务端通知的新地址。

  • 配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址。如果发生故障,哨兵将报告新地址。

启动并初始化Sentinel

$ redis-sentinel /path/to/your/sentinel.conf
或者
$ redis-server /path/to/your/sentinel.conf --sentinel

当一个Sentinel启动时,它需要执行以下五个步骤:

  • 初始化服务器
  • 将普通的Redis服务器使用的代码替换成Sentinel专用代码
  • 初始化Sentinel状态
  • 根据给定的配置文件,初始化Sentinel监视的主服务器列表
  • 创建连接主服务器的网络连接

Redis的master和slave主从设定可以通过slaveof命令操作,举个🌰:

redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> slaveof 127.0.0.1 6379

通过Mac的HomeBrew安装Redis的话,默认配置文件在/usr/local/etc/redis-sentinel.conf目录
复制出两份相同文件,修改port端口号,简单的配置如下

port 26379
# monitor后面的mymsater标志master和它的slave,最后一个参数2表示quoram设置
sentinel monitor mymaster 127.0.0.1 6379 2
# 在这个时间范围内不能接收响应,master将会被标记为故障
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

默认运行在26379端口号,本地服务开多个哨兵的话,将26379改成26380、26381尝试。

启动日志如下:

2285:X 24 Mar 23:34:17.514 # Sentinel ID is 0440e012ba17a7a5b4b517cab3589e764bbc03e3
2285:X 24 Mar 23:34:17.514 # +monitor master mymaster 127.0.0.1 6379 quorum 2

如果启动三个Sentinel后,你就能从日志中看到已经成功启动了三个Sentinel,并且都是监听同一个Master服务器:

2409:X 24 Mar 23:40:27.673 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
2409:X 24 Mar 23:40:27.905 * +sentinel sentinel 1c60d45db8d9f17f0be5a0ccc2dc62fb57de2d4b 127.0.0.1 26380 @ mymaster 127.0.0.1 6379
2409:X 24 Mar 23:40:29.123 * +sentinel sentinel 0440e012ba17a7a5b4b517cab3589e764bbc03e3 127.0.0.1 26379 @ mymaster 127.0.0.1 6379

Sentinel的API

通过redis-cli -p 26379登录Sentinel(因为Sentinel就是一个特殊的Redis服务器)

检查master是否正常监控

redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "127.0.0.1"
 5) "port"
 6) "6379"
 7) "runid"
 8) "737b3c33842f4c251b65494b4bf356ce2af8ad8c"
 # flags 是 master。如果master down了,我们在这里希望看到 s_down 或者 o_down。
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "466"
19) "last-ping-reply"
20) "466"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "6396"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "1492980"
29) "config-epoch"
30) "0"
# 表示该Master下有一个slave(例如:我刚才在6380端口启动的)
31) "num-slaves"
32) "1"
# 表示Sentinel已经检测到这个Master另外两个Sentinel
33) "num-other-sentinels"
34) "2"
# 集群配置
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

获取当前master地址

127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6379"

故障转移测试

关掉Master服务器

$ redis-cli -p 6379 shundown

Sentinel哨兵的打印日志:

2379:X 25 Mar 00:27:52.341 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
2379:X 25 Mar 00:27:52.341 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

重新启动6379的Redis

$ redis-server --port 6379

2604:M 25 Mar 00:29:38.000 # Server initialized
2604:M 25 Mar 00:29:38.000 * DB loaded from disk: 0.000 seconds
2604:M 25 Mar 00:29:38.000 * Ready to accept connections
2604:S 25 Mar 00:29:48.168 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
2604:S 25 Mar 00:29:48.168 * SLAVE OF 127.0.0.1:6380 enabled (user request from 'id=2 addr=127.0.0.1:58752 fd=8 name=sentinel-fe82d064-cmd age=10 idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=0 qbuf-free=32768 obl=36 oll=0 omem=0 events=r cmd=exec')
2604:S 25 Mar 00:29:48.371 * Connecting to MASTER 127.0.0.1:6380
2604:S 25 Mar 00:29:48.371 * MASTER <-> SLAVE sync started
2604:S 25 Mar 00:29:48.371 * Non blocking connect for SYNC fired the event.
2604:S 25 Mar 00:29:48.371 * Master replied to PING, replication can continue...
2604:S 25 Mar 00:29:48.372 * Trying a partial resynchronization (request 14da919a7f784c20260fe79893734941b6098734:1).
2604:S 25 Mar 00:29:48.373 * Full resync from master: d2b5bdafe3c3fd8c7f8e0dfe7e0159e33c9a40fb:608136
2604:S 25 Mar 00:29:48.373 * Discarding previously cached master state.
2604:S 25 Mar 00:29:48.464 * MASTER <-> SLAVE sync: receiving 190 bytes from master
2604:S 25 Mar 00:29:48.464 * MASTER <-> SLAVE sync: Flushing old data
2604:S 25 Mar 00:29:48.464 * MASTER <-> SLAVE sync: Loading DB in memory
2604:S 25 Mar 00:29:48.465 * MASTER <-> SLAVE sync: Finished with success

从上面可以看出,6379服务器挂掉后,哨兵可以启动一个故障转移进程,将一个slave(例如:6380)升级成为master。接着6379启动后,哨兵系统会将6379设定为master(6380)的slave,开始复制master的数据。

通过测试,发现当主服务器出现故障的时候,会自动让从服务器成为主服务器,继续正常的工作,如果挂掉的主服务器重新启动的话,会让它成为新任主服务器的slave,完成故障转移。

还有很多API就不列举了,详细可看第一个参考资料。


小结:

这把学习记录了哨兵系统的简单介绍,还有如何使用,以及它是如何完成故障转移的详细过程,感觉还是好多坑没填🐶


参考资料
[1]Redis哨兵-实现Redis高可用---Redis中文网
[2]Redis设计与实现第二版---黄健宏

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容