哨兵leader选举
选举时机:
该主节点客观下线(超过quorum数量的Sentinel节点认为该redis节点主观下线)
选举算法:
1、哨兵确认集群主节点主观下线后,请求别的哨兵投票给自己。
2、被请求的哨兵如果没有投票给其它哨兵,则投1票。
3、如果一个哨兵的票数达到最低票数(quorum和Sentinel节点数/2+1的最大值,一般是半数以上哨兵节点),则成为leader。
意义:很明显是看哪个哨兵对故障的反应快。成为leader很正常。
主节点选举
选举时机:
该主节点客观下线(超过quorum数量的Sentinel节点认为该redis节点主观下线)
哨兵的leader选举完成,由哨兵leader来选择。
选举算法:
1、过滤故障节点;
2、选择优先级slave-priority最大的follow;都相同则往下
3、选择复制偏移量大的。都相同则往下
4、选择runid最小的。
意义:基本上是看哪个follow复制偏移量大。大的成为leader没毛病。
数据一致性:
leader选举成功之后,会把数据强制同步到follow。
redis cluster选举
选举时机:
该主节点客观下线(半数以上持有槽的主节点认为该主节点主观下线)
选举算法:
1、从节点发现自己的主节点不可用;
2、从节点有一个延迟选举时间,延迟选举时间根据从节点数据的复制偏移量来确定,偏移量大的先发起选举。
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
(SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。)
3、从节点currentEpoch加1,并广播发送其他主节点进行投票。
4、从节点发起投票后,会等待至少两倍NODE_TIMEOUT时长接收投票结果,不管cluster-node-timeout为何值,也至少会等待2秒。
5、只有持有槽的主节点才可以投票,且在同一个epoch内只会投一票。
6、从节点收到响应的投票信息,会比较currentEpoch,小于自己的直接丢弃,一旦获得半数主节点的票,则声明自己赢得选举。
7、如果slave在两倍的cluster-node-timeout(集群节点不可用的最大超时时间,默认15s)时间内(至少2秒)未赢得选举,则放弃本次选举,然后在四倍cluster-node-timeout时间(至少4秒)后重新发起选举。
意义:延迟选举时间很明显是为了让偏移量大的slave更容易赢得选举。