Zookeeper工作机制

本文详细介绍了Zookeeper的选举机制,包括新集群的选举和leader挂掉后的重新选举过程,强调了zxid在选举中的重要性。同时,讲解了Zookeeper的写数据流程,描述了从客户端请求到数据最终写入的步骤和确认机制。此外,还提及了监听器的工作原理。
摘要由CSDN通过智能技术生成

ZK的选举机制的原理过程

选举的总原则:当zk集群中任意一台机器得到选票数超过机器总数的一半以上,它就是当前集群的leader。

1. 新搭建的集群(没有数据)
举例说明:以5台机器为例
前提:集群配置没问题!1,2,3,4,5 顺时启动

  1. server1 启动

此时它会给自己投票,因为当前票数没有过半,它的
投票结果出于(LOOKING)

  1. server2 启动

此时先给自己投一票,然后server2和server1进行通信,相互交换选票,此时发现给自有一票,那么进行myid的比较,2 >
1,server2选举胜出,server1会把票投给server2。这个时候还没有选出leader,票数没有达到半数以上。选举结果任然出于LOCkING。这时候把选票结果恢复到原始状态,server1和server2都有一票

  1. server3 启动

先给自己投票,然后就与server1和server2进行通信,大家交换选票,因为给自都是1票,所以比较myid,
此时server3胜出,server1和server2将自己的选票投给server3,此时server3累计3票,最后判断当前票数知否超过集群的总数的一半。由此就把
leader选出了,就是server3。

  1. server4 启动

由于当前集群已经产生了leader,它就不参与选举,自动成为follower

  1. server5 启动

由于当前集群已经产生了leader,它就不参与选举,自动成为follower
注意:当启动顺序不确定时,选举结果可能受影响,但是选举额机制原理不变

2. 集群工作中,leader突然挂了,在当前机器存活数过半以上, 要重新选举出leader。

– 以上情况出现,会从现有存活的机器中再选出一个leader,此时集群每台机器zxid就不一样,这种情况的选举就以两个条件去投票,就是 (myid,zxid)。
此时就会选择当前集群中zxid值最大的为leader。如果极端情况下,zxid的值一样,此时会比较myid。
结论:某种意义上,zxid值最大的就可以代表当前
集群中数据最完整的一台机器。

3.ZK写数据的过程
当客户端发起一个写数据的请求,就会随机连接一台zk服务器

  1. 通常情况下,不会连接leader,如果连接是leader,则当前server就会广播要进行数据写操作
    此时其他server会对leader进行响应,如果leader接收到过半机器响应,此时再次广播进行数据
    写操作。写成功后每个server会继续想leader进行ack响应。最后就将结果有当前和客户端做交互的
    server进行数据写入成的通知。
  1. 如果请求不是直接发给leader,这时候就由当前已连接的follower和leader进行汇报,再有leader进行广播写数据请求,接收到到其他server的回应,然后leader继续广播写数据的请求,这时候其他server完成数据写入,并且响应leader,一切完成后,当前和客户端做交互的server进行数据写入成的通知。

监听器原理

监听原理详解:
1) 首先有一个main()线程;
2) 在main线程中创建zookeeper客户端,这时就会有两个线程,一个负责网络通信(connet),一个负责监听(listener);
3) 通过connect线程将注册的监听事件发送给zookeeper;
4) 在zookeeper的注册监听器列表中将注册的监听事件添加到列表中;
5) zookeeper监听到有数据或者是路径发生变化时,就会将这个消息发送到listener线程;
6) listener线程内部调用process方法();

选举机制

选举机制由节点启动的顺序、myid、数据的zxid、服务器的数量有关。
大致顺序为:
1)zxid大的当选(99%情况下都是相等的);
2)根据节点启动的顺序,比较myid,在未到达半数的服务器数量以前,所有节点的票都将投给myid大的服务器,一旦到达了半数以上的服务器被启动(此时可以对外提供服务)时,myid最大的节点当选leader,其余的服务器为follower。

写数据流程

1) Client 向zookeeper申请写数据,发送一个写请求;
2) 如果这个服务器不是leader,则该服务器将接收到的请求转发给leader;
3) leader将这个写的请求广播给所有的follower服务器,所有的服务器将写的事件写入队列中,并向leader发送准备就绪的成功消息;
4) 当leader收到了半数以上的服务器返回了成功的消息以后,则说明该写的操作可以执行,则leader向所有的follower发送提交消息,所有的服务器收到信息以后则执行队列中的写操作;
5) 对应的服务器完成写操作以后会通知client,数据写入成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值