zookeeper leader选举 博客分类: 架构
主要参照 https://www.cnblogs.com/leesf456/p/6107600.html
有时间还可以看下源码确认下
选举主要有两种
1. 服务启动时选举
2. 运行期选举
1. 服务启动时选举
因为服务启动时,初始状态一致(epoch)相同,所以启动阶段选举比较简单
1)各个服务器节点,广播自己的优先级标识 (sid,zxid)
2)服务器节点收到其他广播消息后,跟自己的优先级对比,自己优先级低,则变更当前节点投票的优先级(sid,zxid)
,并广播变更后的结果
3)当任意一个服务器节点收到的投票数,超过了法定数量
(quorum),则,升级为 Leader,并广播结果。
2. 运行期选举
总结下:增轮次->先选自己(自己的sid,自己的zxid)->收集投票后revote->决定leader并变更状态
epoch用来标记任期或者称为轮次,保证选举在最高的同一个轮次,实际就是用来保证一致性的
每个投票中包含了两个最基本的信息,所推举服务器的SID和ZXID,投票(Vote)在Zookeeper中包含字段如下
id:被推举的Leader的SID。
zxid:被推举的Leader事务ID。
electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中,该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。
peerEpoch:被推举的Leader的epoch。
state:当前服务器的状态。
1. 自增选举轮次。Zookeeper规定所有有效的投票都必须在同一轮次中,在开始新一轮投票时,会首先对logicalclock(其实就是epoch,选举轮次,是zxid的高32位的值)进行自增操作。
2. 初始化选票。在开始进行新一轮投票之前,每个服务器都会初始化自身的选票,并且在初始化阶段,每台服务器都会将自己推举为Leader。
3. 发送初始化选票。完成选票的初始化后,服务器就会发起第一次投票。Zookeeper会将刚刚初始化好的选票放入sendqueue中,由发送器WorkerSender负责发送出去。
4. 接收外部投票。每台服务器会不断地从recvqueue队列中获取外部选票。如果服务器发现无法获取到任何外部投票,那么就会立即确认自己是否和集群中其他服务器保持着有效的连接,如果没有连接,则马上建立连接,如果已经建立了连接,则再次发送自己当前的内部投票。
5. 判断选举轮次。在发送完初始化选票之后,接着开始处理外部投票。在处理外部投票时,会根据选举轮次来进行不同的处理。
· 外部投票的选举轮次大于内部投票。若服务器自身的选举轮次落后于该外部投票对应服务器的选举轮次,那么就会立即更新自己的选举轮次(logicalclock),并且清空所有已经收到的投票,然后使用初始化的投票来进行PK以确定是否变更内部投票。最终再将内部投票发送出去。
· 外部投票的选举轮次小于内部投票。若服务器接收的外选票的选举轮次落后于自身的选举轮次,那么Zookeeper就会直接忽略该外部投票,不做任何处理,并返回步骤4。
· 外部投票的选举轮次等于内部投票。此时可以开始进行选票PK。
6. 选票PK。在进行选票PK时,符合任意一个条件就需要变更投票。
· 若外部投票中推举的Leader服务器的选举轮次大于内部投票,那么需要变更投票。
· 若选举轮次一致,那么就对比两者的ZXID,若外部投票的ZXID大,那么需要变更投票。
· 若两者的ZXID一致,那么就对比两者的SID,若外部投票的SID大,那么就需要变更投票。
7. 变更投票。经过PK后,若确定了外部投票优于内部投票,那么就变更投票,即使用外部投票的选票信息来覆盖内部投票,变更完成后,再次将这个变更后的内部投票发送出去。
8. 选票归档。无论是否变更了投票,都会将刚刚收到的那份外部投票放入选票集合recvset中进行归档。recvset用于记录当前服务器在本轮次的Leader选举中收到的所有外部投票(按照服务队的SID区别,如{(1, vote1), (2, vote2)...})。
9. 统计投票。完成选票归档后,就可以开始统计投票,统计投票是为了统计集群中是否已经有过半的服务器认可了当前的内部投票,如果确定已经有过半服务器认可了该投票,则终止投票。否则返回步骤4。
10. 更新服务器状态。若已经确定可以终止投票,那么就开始更新服务器状态,服务器首选判断当前被过半服务器认可的投票所对应的Leader服务器是否是自己,若是自己,则将自己的服务器状态更新为LEADING,若不是,则根据具体情况来确定自己是FOLLOWING或是OBSERVING。
以上10个步骤就是FastLeaderElection的核心,其中步骤4-9会经过几轮循环,直到有Leader选举产生。
推荐阅读
-
zookeeper 数据存储 和 写入 博客分类: 架构
-
zookeeper leader选举 博客分类: 架构
-
Hbase介绍 博客分类: 架构
-
lvs+nginx+动态DNS 博客分类: 架构
-
Zookeeper入门 - Hello World.md 博客分类: Zookeeper zookeeperhelloworld例子demo
-
OSI七层与TCP/IP五层网络架构详解 博客分类: 网络安全
-
zookeeper 客户端操作 博客分类: zookeeper zookeeperCL客户端命令zookeeper linux命令
-
代码从无到有,工程如何起步,搭建项目原型的步骤 博客分类: 系统架构 系统架构代码搭建项目工程系统代码
-
zookeeper信息查看工具 博客分类: zookeeper zookeeper插件客户端信息查看
-
【转】Zookeeper-Watcher机制与异步调用原理 博客分类: Zookeeper Zookeeper