ZooKeeper快速领导选举(Fast Leader Elec

2020-10-07  本文已影响0人  LittleMagic

前言

假期马上就要过去了,还是写点什么找找状态比较好。翻看之前的文章,发现自己说过不少ZooKeeper的应用,但还没有真正涉及到它的原理,那么本文就找个切入点来聊聊吧。

Leader选举

众所周知,ZK是典型的Leader-Follower架构的分布式框架,通过ZooKeeper原子广播(ZooKeeper Atomic Broadcast, ZAB)协议来保证最终一致性。只有Leader能处理写请求,而Leader和Follower都能处理读请求。

一个ZK集群的示意图如下。注意图中没有Observer节点(即无投票权的Follower节点),无伤大雅。

既然Leader在整个ZK集群中处于中心地位,那么在ZK集群启动时,需要由所有节点共同选举出Leader节点,才能正常提供服务。同理,如果当前Leader失败,也需要尽快推举出新的Leader节点,避免处于“群龙无首”的状态。ZAB协议的第0个阶段就是Leader选举,而具体到ZK的实现上,称为快速领导选举(Fast Leader Election)机制,如下图所示。

图来自论文《ZooKeeper’s atomic broadcast protocol: Theory and practice》

ZAB协议的恢复和广播阶段今后再提,本文重点分析Fast Leader Election的相关内容。作为预备,先介绍ZK节点状态及与选举相关的信息。

ZK节点状态

一个ZK节点可能处于以下4种状态之一,在源码中以QuorumPeer#ServerState枚举来定义。

与选举相关的信息

这些信息体现在FastLeaderElection#Notification、FastLeaderElection#ToSend和Vote等数据结构中,看官可自行参考源码。

选举流程

Fas tLeader Election算法的主体位于FastLeaderElection#lookForLeader方法中,代码比较长,因此不贴出来了,只用文字叙述流程。

首先,自增本地的逻辑时钟logicalclock。

接下来给自己投一票(即该票中包含自己的sid、zxid等信息),并将该选票广播给其他节点。

投出这一票后,只要当前服务器处于LOOKING状态,就会循环执行收取其他选票、更新并广播自己的选票、计算投票结果的操作,直到可以确定Leader为止。具体叙述如下。

可见,Fast Leader Election流程的本质就是每个节点通过不断做出最优的选择并进行广播,最终使所有节点对Leader和Follower角色的认知收敛到一致。

下面通过画图来演示上文所述的选举流程。

选举流程示例

The End

上一篇下一篇

猜你喜欢

热点阅读