概要
当redis集群的主节点故障时,Sentinel
集群将从剩余的从节点中选举一个新的主节点,有以下步骤:
- 故障节点主观下线
- 故障节点客观下线
Sentinel
集群选举Leader
Sentinel Leader
决定新主节点
选举过程
1、主观下线
Sentinel集群的每一个Sentinel节点会定时对redis集群的所有节点发心跳包检测节点是否正常。如果一个节点在down-after-milliseconds
时间内没有回复Sentinel节点的心跳包,则该redis节点被该Sentinel节点主观下线。
2、客观下线
当节点被一个Sentinel节点记为主观下线时,并不意味着该节点肯定故障了,还需要Sentinel集群的其他Sentinel节点共同判断为主观下线才行。
该Sentinel节点会询问其他Sentinel节点,如果Sentinel集群中超过quorum
数量的Sentinel节点认为该redis
节点主观下线,则该redis
客观下线。
如果客观下线的redis
节点是从节点或者是Sentinel节点,则操作到此为止,没有后续的操作了;如果客观下线的redis
节点为主节点,则开始故障转移,从从节点中选举一个节点升级为主节点。
3、Sentinel集群选举Leader
如果需要从redis集群选举一个节点为主节点,首先需要从Sentinel
集群中选举一个Sentinel
节点作为Leader
。
每一个Sentinel
节点都可以成为Leader
,当一个Sentinel
节点确认redis集群的主节点主观下线后,会请求其他Sentinel
节点要求将自己选举为Leader
。被请求的Sentinel
节点如果没有同意过其他Sentinel
节点的选举请求,则同意该请求(选举票数+1),否则不同意。
如果一个Sentinel
节点获得的选举票数达到Leader
最低票数(quorum
和Sentinel节点数/2+1
的最大值),则该Sentinel
节点选举为Leader
;否则重新进行选举。
4、Sentinel Leader
决定新主节点
当Sentinel
集群选举出Sentinel Leader
后,由Sentinel Leader
从redis从节点中选择一个redis节点作为主节点:
- 过滤故障的节点
- 选择优先级
slave-priority
最大的从节点作为主节点,如不存在则继续 - 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
- 选择
runid
(redis每次启动的时候生成随机的runid
作为redis
的标识)最小的从节点作为主节点
为什么Sentinel
集群至少3节点
一个Sentinel
节选举成为Leader
的最低票数为quorum
和Sentinel节点数/2+1
的最大值,如果Sentinel
集群只有2个Sentinel
节点,则
Sentinel节点数/2 + 1
= 2/2 + 1
= 2
即Leader
最低票数至少为2,当该Sentinel
集群中由一个Sentinel
节点故障后,仅剩的一个Sentinel
节点是永远无法成为Leader
。
也可以由此公式可以推导出,Sentinel
集群允许1个Sentinel
节点故障则需要3个节点的集群;允许2个节点故障则需要5个节点集群。