redis专题十四:redis的哨兵模式
一、哨兵模式简介
1.1 问题
之前专题,我们已经构建了一个简单的主从结构的集群,可是,如果当master宕机了,那其关联的slave就没法正常工作了;这个时候,需要从slave中选取一个来当master才行;

那这个过程需要做哪些事情呢?
- 将宕机的master下线
- 选取一个slave作为master
- 通知所有的slave连接新的master
- 重新启动新的master和slave
- 有可能出现的全量复制 * N + 部分复制 * N
那么,这里将面临几个问题:
- 谁来确认master宕机了?
- 找一个主?怎么找?
- 修改配置后,原来的master恢复了怎么办?
解决这些问题的关键:哨兵。哨兵就像是一个监工,监控着整个集群的运行。
1.2 哨兵的定义
哨兵(sentinel),是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时,通过投票机制选举新的master并将所有的slave连接到新的master。那么我们的集群就转变为:

1.3 哨兵的作用
- 时刻监控master和slave是否正常运行
- 当被监控的服务器出现问题,向其他服务器发送通知
- 自动故障转移:断开master和slave的连接,选取一个slave作为master,将其他的slave连接到新的master,并告知客户端新的服务器地址
注意:哨兵也是一台redis服务器,只是不提供数据服务,通常哨兵数量配置为单数(防止选举时打平的尴尬局面);
二、启用哨兵
作为哨兵的服务器也有自己的配置文件:例如sentinel.conf(可自定义)
启动哨兵:redis-sentinel sentinel.conf
| 配置举例 | 说明 |
| sentinel monitor mymaster 127.0.0.1 6379 2 |
表明要监控的master主机,mymaster是自定义的master主机的名字; 127.0.0.1和6379是监控主机的IP和端口;2代表如果有两个哨兵认为 它挂了,那它就挂了。 |
| sentinel down-after-milliseonds mymaster 30000 |
master连接30秒没响应就代表master挂了;注意这里的参数mymaster 和上面自定义保持一致就行 |
| sentinel parallel-syncs mymaster 1 |
当master挂的时候,新的master上线后,最多有多少个slave可以和master 进行数据同步,设置越小性能越好,速度越快; 这个数字越小,完成failover所需的时间就越长, 但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。 |
| sentinel failover-timeout mymaster 1800000 | 在同步的时候,多长时间同步完,算是有效,这里是180秒,即三分钟 |
三、哨兵的工作原理
哨兵最重要的就是实现主从切换;主从切换主要经历三个阶段:监控、通知、故障转移
3.1 监控阶段
监控阶段主要做的就是同步各个节点的状态信息。
- 获取各个sentinel状态(是否在线)
- 获取master的状态,包括master的属性(runid,role,各个slave的详细信息)
- 获取所有slave的状态,包括slave的属性(runid,role,offset等)

各个sentinel之间组成一个小的网络,相互发送消息,其中一个的消息都会发给其他;
3.2 通知阶段
可以看是一个信息的长期维护阶段;不管哪个sentinel获取到某个阶段状态的信息,都会告知其他的sentinel。维护信息对等。
3.3 故障转移阶段
- 当一个sentinel向master发送指令,master没有响应,多次尝试未果之后,标记master状态为:SRI_S_DOWN,接着,这个sentinel告诉其他sentinel,当其他sentinel收到之后,也去向master发送消息,得到结果后传递给其他sentinel,有一半以上的sentinel认为这个master挂了,这个master就是真的挂了,这时候标记master状态:SRI_O_DOWN。注意:当一个sentinel认为master挂了,称为主观下线;一半以上认为挂了,称为客观下线;
- 接下来,要下线掉这个宕机的master,那么这么多的sentinel,由谁去处理呢?sentinel之间通过投票之后,选举出一个代表
- 选举出来的sentinel在剩下的slave中选取一个作为master,选取规则包括:在线的、响应快的、优先级等;
- sentinel发送指令,向新的master发送:salveof no one,向其他的slave发送:slave 新masterIp 新masterPort
这一篇就到这里,下一篇写redis的集群。

浙公网安备 33010602011771号