说说zookeeper【贰】_ZAB协议


上篇文章:说说zookeeper【壹】_什么是zookeeper


上文中我们对zookeeper的基础知识进行了介绍,本文说说zookeeper遵循的ZAB协议。


ZAB协议


ZAB协议全称是Zookeeper Atomic Broadcast(zookeeper原子消息广播协议),是zookeeper数据一致性的核心算法。该协议的核心是:


所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为leader服务器,余下的服务器称为follower服务器。leader服务器负责将一个客户端事务请求转换成一个事务(Proposal,协议),并将该Proposal分发给集群中所有的follower服务器,之后leader服务器需要等待所有follower服务器的反馈,一旦超过半数的follower服务器记录到本地事务日志并进行了正确的反馈后,那么leader就会再次向所有的follower服务器分发commit消息,要求其将前一个proposal进行提交。

说到这里我们再补充一下zookeeper集群中的三个角色:leader、follower和observer。leader通过leader选举产生,leader服务器为客户端提供读和写服务,另外follower和observer提供读服务,区别在于observer机器不参与leader选举,也不参与写操作的过半即成功策略。observer可在不影响写性能的情况下提升集群的读性能。


ZAB协议两种基本模式:崩溃恢复和消息广播。


崩溃恢复


当整个服务框架在启动过程汇总,或是当leader服务器出现网络中断、崩溃推出与重启等异常情况时,ZAB协议就会进入恢复模式并选举产生新的leader服务器。当选举产生了新的leader服务器,同时集群中已经有过半的机器与该leader服务器完成了数据同步之后,就退出恢复模式。


Leader选举


主要步骤如下:


1.每个server状态为LOOKING,都发起一个投票,包含服务器的myid(server编号)和ZXID(事务id),最初都是投给自己;

2.接收各个server发来的投票,优先选出ZXID最大的服务器(说明已执行的事务最多,状态和之前的leader最接近),如果相同,则选择myid最大的;

3.统计投票,如果集群内有一半以上服务器接收投票,则认定投票中myid对应的服务器为新的leader;

4.每个server改变自己状态,follower服务器改变状态为FOLLOWING,leader服务器改变为LEADING。


消息广播


当集群中已经有过半的follower服务器完成了和leader服务器状态同步,那么整个服务框架就可以进入消息广播模式了。当一台一样遵守ZAB协议的服务器启动后加入到集群中时,如果此时集群中已经存在一个leader服务器在负责进行消息广播,那么新加入的服务器就会自觉地进入数据恢复模式:找到leader所在的服务器,并与其进行数据同步,然后一起参与到消息广播流程。非leader服务器几手到客户端的事务请求会转发给leader服务器,leader服务器再生成事务提案并发起一轮广播协议。


ZAB协议确保已经在leader服务器上提交的事务最终被所有服务器都提交。让具有最高事务编号的机器作为leader,可省去leader服务器检查proposal的提交和丢弃工作了。


三个角色


分别为Leader、Follower和Observer。在zookeeper运行期间,服务器会有四种状态,分别为LOOKING(Leader选举期间)、LEADING(leader服务器状态)、FOLLOWING(Follower服务器状态)和OBSERVING(Observer服务器状态)。


Leader角色是整个zookeeper事务请求的唯一调度和处理者,保证事务顺序,也是集群内部各服务器的调度者。


follower处理客户端非事务请求(读),事务请求会转发给leader服务器处理,会参与proposa投票和leader选举。


observer是zookeeper3.3版本引入的新角色,观察zookeeper集群的最新状态变化并将这些状态变更同步过来,对非事务请求会处理,事务请求转发给leader。但是不参与投票和leader选举。

猜你喜欢

转载自blog.csdn.net/xinzun/article/details/79683468