Redis学习笔记系列(十一)——Redis集群之哨兵模式

8.2 哨兵模式

8.2.1 哨兵架构

如下图所示,哨兵模式沿用了主从复制的基础架构,但是在主从复制的基础上添加了一些哨兵,来监控各节点的健康状态以及进行自动处理故障。

哨兵架构图

哨兵,顾名思义,就是来为Redis集群站哨的,一旦发现问题能做出相应的应对处理。其功能包括

  • 监控主从节点是否正常运行。
  • 当主节点出现故障时,能自动将一个从节点转换为主节点,当主节点恢复之后只能作为从节点。
  • 多个哨兵可以监控同一个Redis,哨兵之间也会自动监控。
8.2.2 实现原理
  1. 在配置文件中通过 sentinel monitor <master-name> <ip> <redis-port> <quorum> 来定位Master节点的IP、端口,一个哨兵可以监控多个Master数据库,只需要提供多个该配置项即可。哨兵启动后,会与要监控的Master节点建立两条连接:
  • 一条连接用来订阅Master的_sentinel_:hello频道与获取其他监控该Master哨兵的节点信息
  • 另一条连接定期向Master发送INFO等命令获取Master本身的信息

与Master建立连接后,哨兵会执行三个操作:

  • 定期(一般10s一次,当Master被标记为主观下线时,改为1s一次)向Master和Slave发送INFO命令
  • 定期向Master和Slave的_sentinel_:hello频道发送自己的信息
  • 定期(1s一次)向Master、Slave和其他哨兵发送PING命令

发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。所以说哨兵只需要配置Master数据库信息就可以自动发现其Slave信息。获取到Slave信息后,哨兵也会与Slave建立两条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等。

接下来哨兵向主从数据库的_sentinel_:hello频道发送信息与同样监控这些数据库的哨兵共享自己的信息,发送内容为哨兵的IP、端口、运行id、配置版本、Master名字、Master的IP、端口还有Master的配置版本。这些信息有以下用处:

  • 其他哨兵可以通过该信息判断发送者是否是新发现的哨兵,如果是的话会创建一个到该哨兵的连接用于发送PING命令。
  • 其他哨兵通过该信息可以判断Master的版本,如果该版本高于自己记录的版本,将会更新。
  • 当实现了自动发现Slave和其他哨兵节点后,哨兵就可以通过定期发送PING命令定时监控这些数据库和节点有没有停止服务。

如果被PING的数据库或者节点超时(通过 sentinel down-after-milliseconds master-name milliseconds 配置)未回复,哨兵认为其主观下线(sdown,s就是subjectively —— 主观地)。如果下线的是Master,哨兵会向其它哨兵发送命令询问它们是否也认为该Master主观下线,如果达到一定数目(即配置文件中的quorum)投票,哨兵会认为该Master已经客观下线(odown,o就是objectively —— 客观地),并选举领头的哨兵节点对主从系统发起故障恢复。若没有足够的sentinel进程同意Master下线,Master的客观下线状态会被移除,若Master重新向sentinel进程发送的PING命令返回有效回复,Master的主观下线状态就会被移除。

哨兵认为Master客观下线后,故障恢复的操作需要由选举的领头哨兵来执行,选举采用Raft算法

  • 发现Master下线的哨兵节点(记为A)向每个哨兵发送命令,要求对方选自己为领头哨兵;
  • 如果目标哨兵节点没有选过其他人,则会同意选举A为领头哨兵;
  • 如果有超过一半的哨兵同意选举A为领头,则A当选;
  • 如果有多个哨兵节点同时参选领头,此时有可能存在一轮投票无竞选者胜出,此时每个参选的节点等待一个随机时间后再次发起参选请求,进行下一轮投票竞选,直至选举出领头哨兵。

领头哨兵被选举出来后,领头者开始对系统进行故障恢复,从出现故障的Master的从数据库中挑选一个来当选新的Master,选择规则如下:

  • 所有在线的Slave中选择优先级最高的,优先级可以通过slave-priority配置
  • 如果有多个最高优先级的Slave,则选取复制偏移量最大(即复制越完整)的当选
  • 如果以上条件都一样,选取id最小的Slave

挑选出需要继任的Slave后,领头哨兵向该数据库发送命令使其升级为Master,然后再向其他Slave发送命令接受新的Master,最后更新数据。将已经停止的旧的Master更新为新的Master的从数据库,使其恢复服务后以Slave的身份继续运行。

8.2.3 搭建过程

安装状态如下:

主机名 IP
master / sentinel 192.168.6.3
slave1 / sentinel 192.168.6.4
slave2 / sentinel 192.168.6.5
  1. 主从节点的配置文件redis.conf,请参考上一节的内容。
  2. 修改哨兵节点的配置文件sentinel.conf,并将配置文件复制到bin目录下。
# 关闭保护模式
bind 0.0.0.0
protected-mode no

# 启动端口
port 26379

# 后台启动sentinel
daemonize yes

# 监控Master节点
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.6.4 6379 2

# 如果哨兵节点5s后没有收到`PING`信号的回复,即认为Master节点主观下线,默认为30s。
sentinel down-after-milliseconds mymaster 5000

# 配置Master节点的连接密码
sentinel auth-pass mymaster Passw0rd
  1. 在三个节点上分别启动sentinel。
redis-server sentinel.conf --sentinel
  1. 启动成功后,每个节点上都会看到两个redis进程。
ps aux | grep redis
# hadoop   12334  0.3  0.4  69708  4644 ?        Ssl  12:46   0:11 ./redis-server 0.0.0.0:26379 [sentinel]
# hadoop     19138  0.2  0.5 150096  5056 ?        Ssl  13:26   0:01 ./redis-server 0.0.0.0:6379
  1. 故障转移演示
    进入主节点的redis客户端。
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.6.4,port=6379,state=online,offset=740922,lag=1
slave1:ip=192.168.6.5,port=6379,state=online,offset=740922,lag=1
master_replid:f0202b49b5d88ad57ed0bde33ffbc3b260924330
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:179
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:179

现在,我们模拟master挂掉的场景。

127.0.0.1:6379> shutdown
not connected> 

我们恢复旧的Master节点,即重启,查看其状态,会发现该节点已成为从节点。

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.6.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:738442
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5406a2471b20a04ccefa7e9ebf2298c8c771316f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:738442
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:536466
repl_backlog_histlen:201977

进入Slave1查看,发现Slave1节点已自动升级为Master。

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.6.5,port=6379,state=online,offset=740922,lag=1
slave1:ip=192.168.6.3,port=6379,state=online,offset=740922,lag=1
master_replid:5406a2471b20a04ccefa7e9ebf2298c8c771316f
master_replid2:a79ad1e7ee52520b208645df4abe70163042bf73
master_repl_offset:741059
second_repl_offset:432766
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:350776
repl_backlog_histlen:390284
8.2.4 优缺点分析

优点:

  • 哨兵模式基于主从复制模式,所以主从复制模式有的优点,哨兵模式也有
  • 哨兵模式下,Master挂掉可以自动进行切换,系统可用性更高

缺点:

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