选举机制(FastLeaderElection算法):sid最大且被超过集群中超过半数的机器拥护就会成为leader. 所以只有两种情况无法选出leader: 整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2) 整个集群超过半数机器挂掉。 所谓的偶数问题...
每个机器节点加入,都发起一次vote。
zookeeper server节点接受到新一轮的vote,都返回上一轮的leader选举的最后vote结果。如果处于looking,比如第一次加入的机器,则vote自己
发起vote的机器,收集完所有server的vote结果(包括自己),统计一下结果,并且判断一下是否超过半数java代码 if (result.winningcount > (self.getvotingview().size() / 2)) 注意:这里的>号,所以如果单台机器启动,无法通过给自己vote,使自己成为leader。一定要>=2台机器的参与
如果没有超过半数,则记录一下本次的投票结果。下一次vote时,就直接投给上一轮票数最高的vote,继续进入步骤3
说明: myid序号大的在vote选举时比较有优势,同样的票数winner会是myid最大的server,从而保证每次的vote必然会产生一个唯一的winner。
fastleaderelection算法:
每个机器节点加入,都向外部建议自己做为leader。zookeeper server接受到请求后,进行一个抉择: java代码 if ((newzxid > curzxid) || ((newzxid == curzxid) && (newid > curid))) 判断当前的zxid和myid是否大于当前vote,如果是则更新之,并同样广播给所有的server。注意: notification中有个epoch标志,表明当前发起的vote的传递的次数。比如a发给b,b更新了自己的vote后,再发给c。这时发的通知中epoch=2。 有点类似图论里的概念,如果notice.epoch < 当前最后一次更新vote的epoch,则不做任何处理。一个逐步收敛的有向环图单个机器上收到了其他所有机器的vote结果后,判断出最后的winner结果="" leader处理:="" 启动learnercnxacceptor,监听follower的请求。针对每个链接的follower,开启一个新线程learnerhandler进行处理="" 然后针对所有的learnerhandler,while(true)进行心跳检查ping。针对每次ping结果,针对有ack响应的结果进行vote统计,如果发现超过半数失败,则退出当前的leader模式,这样又是发起新一轮的选举="" follower处理:="" 建立socket,链接到leader="" server上发起一次syncwithleader同步请求,此时leader会根据当前的最大的zxid对比客户端的zxid,发送diff/trunc/snap指令给follower上,保证follower和leader之间的数据一致性。同步完成后,就进入while(true){read="" ,="" process}的工作模式,开始接受leader的指令并处理ping="" :="" 响应ackproposal="" :="" 记录到自己的缓冲队列pendingtxns中,等待sync指令后刷新到zkdatabase中。有点类似2pc阶段事务commit="" :="" 刷新pendingtxns中的对应记录sync="" :="" 客户端的同步request请求observer处理:建立socket,链接到leader="" server上发起一次syncwithleader同步请求同="" 步完成后,进入while(true){read="" ,="" process}的工作模式,和follower有点不同,主要在于其不处理proposal/commit等2pc阶段。只接受="">
Hadoop|
Apache Pig|
Apache Kafka|
Apache Storm|
Impala|
Zookeeper|
SAS|
TensorFlow|
人工智能基础|
Apache Kylin|
Openstack|
Flink|
MapReduce|
大数据|
云计算|
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....