redis哨兵选举原理
Redis集群选举原理:
当slave发现自己的master挂了
将自己记录的currentEpoch加1,并向其他节点请求投票给自己成为master
其他节点收到请求,只有master会回应,判断请求的合法性,并投票,可能会有多个slave请求,每个master只能投一票
slave收集master的投票
当slave收到的投票超过半数后就可以成为master
广播消息通知其他节点
当slave发现自己的master挂了并不会立即进行请求投票,会有一定的延时,确保其他的master也意识到当前的master挂了,否则master可能会拒绝投票
延时计算公式Delay=500ms+random(0-500)ms+Slave_rank* 100ms(slave_rank为复制数据的等级,等级越小表示复制数据越多也是为了保证能让拥有最新数据的slave最先发起选举)
集群是否完整才能对外提供服务
当一个集群节点全都挂了的时候,整个redis是否还能使用,在redis.conf中配置cluster-required-full-converage为no,即使节点挂了集群仍然能提供服务
集群为什么至少三个节点而且推荐节点数为奇数?
因为选举需要收到大于master节点总数的一半,若只有两个master节点,其中一个挂了,是选举不出来新的master的
奇数个master节点是为了满足上述要求并且节省资源,三个master节点与四个master节点,当大家都挂了一个master的时候,都能进行选举,当挂了两个的是否都选举不了
哨兵leader选举流程:
sentinel会以每秒一次的频率向主从和其他sentienl发送ping命令,当超过设置的down-after-milliseconds后未收到的有效的响应会认为该master主观下线,接着向其他sentiel进行确认,接收到足够数量的后,sentinel会判定该服务器客观下线
该sentinel会想其他sentinel发送请求其他sentinel视自己为leader,每个sentinel每次选举会自增配置纪元,每个sentinel只能选择一次,当收到半数以上的票,sentinel会进行slave的选举
slave的选举.进行不健康的slave排除(主观下线的,大于5秒未回应的,与master节点失联的),对健康节点进行排序(设置的优先级,若相同进行下一步,选择偏移量大的从节点)
选举出的slave会执行slaveof no one成为主节点,向其他slave发送命令其成为新的master的slave,监视旧的master恢复后成为新的master的slave并进行同步