什么是哨兵模式
在主从复制模式下,当主节点宕机后,需要人工来切换主节点,通知客户端等操作,比较麻烦。哨兵就是代替人工自动完成这一系列操作的,主要有三个功能:监控、选主、通知
监控
哨兵每秒发送ping给主节点,判断是否还存活,如果这个哨兵没有收到主节点的响应,这个哨兵就判断主节点主观下线(因为可能主节点并没有下线,而是这个哨兵和主节点网络故障)
- 主观下线:某个哨兵自己认为主节点已经下线
- 客观下线:大部分哨兵都认为主节点已经下线
当某个哨兵认为主节点主观下线后,就会询问其他哨兵与主节点的连接情况,如果认为主观下线的哨兵超过了配置文件中的 quorum 值,就可以判断主节点客观下线了。
Leader哨兵
客观下线后,哨兵需要选一个新的主节点,哨兵有很多个,但选主和通知只需要一个哨兵就可以了,所以在选主之前,需要选择一个Leader哨兵。
哨兵如何选举成为 Leader?
Leader哨兵会由其他哨兵投票选出,成为Leader哨兵需要同时满足两个条件
- 拿到半数以上的赞成票
- 拿到的票数 >= 配置文件中的
quorum值
例如一共有3个哨兵,配置的quorum = 2,那么需要拿到2张票就可以成为Leader哨兵
故障转移
故障转移时,新主节点的选取只能在旧主节点的从节点中选取,步骤如下:
- 在从节点的挑选一个主节点
- 通知其他从节点连接新的主节点
- 通知客户端连接新的主节点
- 继续监控旧主节点,一旦上线就把它设置为新主节点的从节点
选主
哨兵会按如下规则选择一个主节点
- 网络状态好的,如果某个节点经常掉线,就会被排除
salve-priority值最大的,在redis.conf中配置- 复制进度最新的,也就是
slave_repl_offset最接近master_repl_offset的 - ID号较小的,每个节点都有的唯一标识
哨兵发送slave no one 将从节点设置为新主节点
从节点连接到新主节点
哨兵发送slaveof new master 将其他从节点连接到新主节点
通知客户端连接新主节点
这主要通过Redis的发布订阅来实现的,主从切换完成后,哨兵就会向客户端发送+switch-master 新主节点ip 来通知客户端,已完成主从切换了,
旧主节点变为从节点
当哨兵监控到旧主节点上线后,就发送salveof new master命令,让它连接到新的主节点
哨兵如何知道其他哨兵的IP
启动哨兵时,只需要配置主节点IP,并没有配置其他哨兵的IP,哨兵如何知道其他哨兵的IP?在主从集群上,有一个__sentinel__:hello的频道,哨兵就可以通过这个频道和其他哨兵通信