Redis Sentinel主从高可用方案简析( 二 )


从主观下线状态切换到客观下线状态并没有使用严格的法定人数算法(strong quorum algorithm), 而是使用了流言协议: 如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线 。如果之后其他 Sentinel 不再报告主服务器已下线, 那么客观下线状态就会被移除 。
客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器Slave或者其他 Sentinel 永远不会达到客观下线条件 。
客观下线状态的判断条件
sentinel monitor master 127.0.0.1 6379 2 那么有两个sentinel认为主服务器已经下线状态,当前的sentinel就可以认为主服务器客观下线了 。
不同的sentinel判断客观下线的条件可能不同
1、sentinel monitor master 127.0.0.1 6379 2 两个sentinel认为主服务器已经下线状态,当前的sentinel就可以认为主服务器客观下线了 。
2、sentinel monitor master 127.0.0.1 6379 5 两个sentinel认为主服务器已经下线状态,并不会将主服务器客观下线,只有5个sentinel认为主服务器已经下线了,当前的sentinel才可以认为主服务器客观下线了 。
四、选取领头的sentinel
当sentinel发现主库客观下线时候会进行【领头sentinel】选举进行故障恢复,其选举算法采用Raft算法,其设计思想类似与zookpeer的选举机制的zab比较类似,所有在线的sentinel都可以参与选举,都有机会被选为领头的sentinel 。选举过程大体如下:
1、 发现主库客观下线的哨兵节点(这里称为A)向每个哨兵节点发送命令【SENTINEL is-master-down-by-addr】,并且命令中包含自己的运行ID(runid),要求对方选举自己为领头哨兵(leader);
2、 如果目标哨兵没有选举过其他人,则同意将A选举为领头哨兵;回复一条命令,回复中的leader_runid参数和leader_epoch参数,分别记录了领头sentinel的运行ID和配置纪元;
3、 如果A发现有超过半数且超过quorum参数值的哨兵节点同意选自己成为领头哨兵,则A哨兵成功选举为领头哨兵 。
4、 Sentinel设置局部领头Sentinel的规则是先到先得,最先向目标sentinel发送设置的源sentinel将成为领头sentinel,而之后接受到的所有设置请求会被拒绝;
5、当有多个哨兵节点同时参与领头哨兵选举时,出现没有任何节点当选可能,此时每个参选节点等待一个随机时间进行下一轮选举,直到选出领头哨兵 。




推荐阅读