一、选举原理
首先每一个节点都有一个myid,节点一启动,就会进行查找leader,如果没有找到,就会进行投票,
它会接受到其它节点的投票信息,然后拿自己的和收到的投票格式进行对比(先比较zxid,如果zxid一样,则比较myid大小,谁(节点)的zxid大,并且超过半数,谁就是leader)
投票格式为(myId,zxid),即选举机制保证了leader为所有机器的最大事务
一、zab协议
Zookeeper 的核心是原子广播机制,这个机制保证了各个 server 之间的同步,保证了多节点数据的一致性。
实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。
- 恢复模式
- 当服务启动或者在领导者崩溃后,Zab就进入了恢复模式(当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了)
- 进入选举(文章后面有详细讲解zk的选举原理),然后进行数据同步
选举出来的 Leader 服务器拥有集群中所有机器 ZXID 最大的事务 当 Follower 连接上 Leader 之后,Follower 服务器会根据自己服务器上最后被提交的 ZXID 和 leader上的 ZXID 进行比对,比对结果要么回滚,要么和 Leader 同步
- 广播模式
一旦 leader 已经和多数的 follower 进行了状态同步后,它就可以开始广播消息了,即进入广播状态。 这时候当一个 server 加入 ZooKeeper 服务中,它会在恢复模式下启动,发现 leader,并和 leader 进行状态同步。待到同步结束,它也参与消息广播 广播模式(半数机制): 客户端发起请求(命令) 第一阶段:leader向各节点发起提议,foller节点接收到提议,写本地数据(先不进行commit),发送ack确认响应leader。 第二阶段:leader收到半数以上的ack确认后,自己本地再进行提交,把commit命令广播所有节点,确认事务都已经被过半的 Follwer 提交了,最后才会响应给客户端成功标志。
注:以上为本人总结,如有错误之处,望不吝指出,非常感谢!
如果对您起到了一点点帮助,请给予我一点鼓励,在下方点个小小的赞,谢谢