zoukankan      html  css  js  c++  java
  • 2020-01-25:redis中,哨兵如何选举?

    福哥答案2020-01-25:

    [答案1:](https://bbs.csdn.net/topics/398982967)
    redis-sentinel故障转移的流程:
    1.当多个sentinel发现并确认了master有问题。
    2.接着会选举出一个sentinel作为领导。
    3.再选举出一个slave作为master。
    4.通知其余的slave,新的master是谁。
    5.通知客户端一个主从的变化。
    6.最后,sentinel会等待旧的master复活,然后将新master成为slave。

    [答案2:](https://blog.csdn.net/weixin_44324174/article/details/108939199)
    redis中的纪元(epoch):使用了类似于Raft算法term(任期)的概念称为epoch(纪元),用来给时间增加版本号。主要有两种:
    currentEpoch:它的作用在于,当集群的状态发生改变,某个节点为了执行一些动作需要寻求其他节点的统一时,就会增加currentEpoch的值。目前curretnEpoch只用于slabe的故障转移流程。
    configEpoch:这是一个集群节点配置相关的概念,每个集群节点都有自己独一无二的configepoch,所谓的节点配置,实际上是指节点所负责的槽位信息。每一个master在向其他节点发送包时,都会附带其configEpoch信息,以及一份表示它负责的slots信息。
    1、某个Sentinel认定master客观下线的节点后,该Sentinel会先看看自己有没有投过票,如果自己已经投过票给其他Sentinel了,在2倍故障转移的超时时间自己就不会成为Leader。相当于它是一个Follower。
    2、如果该Sentinel还没投过票,那么它就成为Candidate。
    3、和Raft协议描述的一样,成为Candidate,Sentinel需要完成几件事情
    1)更新故障转移状态为start
    2)当前epoch加1,相当于进入一个新term,在Sentinel中epoch就是Raft协议中的term。
    3)更新自己的超时时间为当前时间随机加上一段时间,随机时间为1s内的随机毫秒数。
    4)向其他节点发送is-master-down-by-addr命令请求投票。命令会带上自己的epoch。
    5)给自己投一票,在Sentinel中,投票的方式是把自己master结构体里的leader和leader_epoch改成投给的Sentinel和它的epoch。
    4、其他Sentinel会收到Candidate的is-master-down-by-addr命令。如果Sentinel当前epoch和Candidate传给他的epoch一样,说明他已经把自己master结构体里的leader和leader_epoch改成其他Candidate,相当于把票投给了其他Candidate。投过票给别的Sentinel后,在当前epoch内自己就只能成为Follower。
    5、Candidate会不断的统计自己的票数,直到他发现认同他成为Leader的票数超过一半而且超过它配置的quorum(quorum可以参考《redis sentinel设计与实现》)。Sentinel比Raft协议增加了quorum,这样一个Sentinel能否当选Leader还取决于它配置的quorum。
    6、如果在一个选举时间内,Candidate没有获得超过一半且超过它配置的quorum的票数,自己的这次选举就失败了。
    7、如果在一个epoch内,没有一个Candidate获得更多的票数。那么等待超过2倍故障转移的超时时间后,Candidate增加epoch重新投票。
    8、如果某个Candidate获得超过一半且超过它配置的quorum的票数,那么它就成为了Leader。
    9、与Raft协议不同,Leader并不会把自己成为Leader的消息发给其他Sentinel。其他Sentinel等待Leader从slave选出master后,检测到新的master正常工作后,就会去掉客观下线的标识,从而不需要进入故障转移流程。

    大致简单过程
    1、每个做主观下线的sentinel节点像其他sentinel节点发送命令,要求将自己设置为领导者。
    2、接收到的sentinel可以同意或者拒绝。
    3、如果该sentinel节点发现自己的票数已经超过半数并且超过了quorum。
    4、如果此过程选举出了多个领导者,那么将等待一段时重新进行选举。

    [答案3:](https://www.cnblogs.com/whnbky/p/14131286.html)
    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并进行同步。
    ***
    [评论](https://user.qzone.qq.com/3182319461/blog/1611528286)

  • 相关阅读:
    Oracle学习(一)SQL基础
    结构型设计模式(二)桥接模式
    dubbo学习(十)spring boot整合dubbo
    dubbo学习(九)dubbo监控中心
    结构型设计模式(一)适配器模式
    取石子游戏
    卡特兰数
    做题中踩过的坑。。。
    51Nod1130斯特林近似
    51Nod1089最长回文子串 V2(Manacher算法)
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14327453.html
Copyright © 2011-2022 走看看