ZooKeeper_14_Leader选举
来源:互联网 发布:jira linux 破解版 编辑:程序博客网 时间:2024/04/30 07:23
Leader选举
leader选举是ZooKeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。
参数介绍:
myid:同SID,用来唯一标示一台ZooKeeper集群中的机器,每台机器不能重复,配置文件配置。
ZXID:事务ID,用来唯一标示一次服务器状态的变更。集群中每台机器的ZXID都是不一样的,这和ZooKeeper服务器对于客户端"更新请求"的处理逻辑有关。
服务器启动时期的Leader选举
我们默认ZooKeeper服务器最少两台,要是只有一台,还玩屁个Leader选举呀..
咱们假设有三台ZooKeeper服务器,启动了其中两台时:server1(myid:1)、server2(myid:2)、server3(myid:3)
在服务器集群初始化阶段,两台服务器启动之后,互相能进行通信之后,每台机器都试图找到一个Leader,于是便进入了Leader选举流程。
1. 每个Server会发出一个投票
由于是初始,对于server1 和 server2 来说,都会将自己作为leader服务器来进行投票(就是自己投给自己)
每次投票包含的基本参数有:所推举的服务器的myid和ZXID。
我们以(myid,ZXID)来表示.
因为是初始化阶段,server1和server2都会投给自己,即server1投票(1,0)、server2投票(2,0)
然后给自将这个投票发给集群中其他所有的机器。
2. 接收来自各个服务器的投票
每个服务器都会接收来自其他服务器的投票。
集群中的每个服务器在接收到投票后,首先会判断该投票的有效性,包括检查是否是本轮投票,是否来自LOOKING状态的服务器。
3. 处理投票
在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:
a. 优先检查ZXID。ZXID比较大的服务器优先作为Leader
b. 如果ZXID相同的话,那么就比较myid。myid比较大的服务器作为Leader服务器。
咱们来看下server1和server2实际是如何进行投票处理的。
对于server1来说,它自己的投票是(1,0),收到的投票为(2,0)
首先会对比两者的ZXID,因为是初始化阶段,都是0,所以无法决定谁是Leader。
接下来比较两者的myid,很显然,server1发现接收到的投票中的myid是2,大于自己,于是就把自己的投票更新为(2,0)
然后重新将投票发出去。
对于server2来说,不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次投票即可。
4. 统计投票
每次投票,服务器都会统计所有投票,判断是否有过半的机器接收到相同的投票信息。
对于server1和server2服务器来说,都统计出集群中已经有两台机器接受了(2,0)这个投票信息。
"过半":指大于集群机器数量的一半,即大于等于(n/2+1)。
对于这里由三台机器构成的集群,大于等于2台即为达到"过半"要求。
那么,当server1和server2都收到相同的投票信息(2,0)的时候,即认为已经选出了Leader。
5. 改变服务器状态
一旦确定了Leader,每个服务器都会更新自己的状态:如果是Follower,那么就变更为FOLLOWING,
如果是Leader,那么久变更为LEADING。
服务器运行期间的Leader选举
zookeeper集群正常运行中,一旦选出一个Leader,那么所有服务器的集群角色一般不会发生变化。
也就是说,leader服务器将一直作为集群的Leader,即使集群中有非leader角色的机器挂了或者有新机器加入,不会影响leader机器角色。
但是一旦Leader所在的机器挂了,那么整个集群将暂时无法对外服务,而是进入新一轮的Leader选举。
服务器运行期间的Leader选举和启动时期的Leader选举基本过程是一致的。
我们依旧假设有三台机器,server1、server2、server3,当前的Leadeer是server2,假设某一时刻,leader挂了...╮(╯▽╰)╭
1. 变更状态
当leader挂了之后,余下的非Observer服务器都会将自己服务器状态变更为LOOKING,然后开始进入Leader选举流程。
2. 每个Server会发出一个投票
这个过程中,需要生成投票信息(myid,ZXID)。
因为是运行期间,因此每个服务器上的ZXID可能不太一样,我们假设server1的ZXID:123、server3的ZXID:122
第一轮投票,server1和server3都是投给自己,即分别产生投票(1,123)和(3,122)
然后各自将这个投票发送给集群中所有的机器。
3. 接收来自各个服务器的投票
4. 统计投票
投票期的处理,和服务器启动期间的处理规则是一致的。
这个栗子中,server1的ZXID为123,server3的ZXID为122,很明显,server1会成为leader
5. 改变服务器状态
算法分析暂时不看
- ZooKeeper_14_Leader选举
- 选举
- 选举
- 选举
- 提前选举
- 选举地图
- 选举算法
- 选举计数
- 总统选举
- Master选举
- 投票选举
- 选举问题
- oj-选举
- 选举游戏
- 选举游戏
- Java社区选举结果
- DR/BDR选举过程
- “想尽办法”赢得选举
- SSM框架整合配置案例
- 将一个字符串转换成一个整数
- 习题 6.11 输出以下图案:*****
- Linux 操作系统
- 图像边缘检测初步
- ZooKeeper_14_Leader选举
- CCF模拟试题之中间数
- 配置hive以及自定义版本MySQL
- 第一个c程序
- 拼凑面额
- OOM分析
- 【清华集训2017模拟】Sequence
- HDU 1686 Oulipo——kmp
- 前端工程师必备的几个实用网站