上篇文章《paxos与一致性》说到zab是在paxos的基础上作了重要的改造,解决了一系列的问题,这一篇咱们就来讲下这个zab。html
zab协议的全称是ZooKeeper Atomic Broadcast即zookeeper“原子”“广播”协议。它规定了两种模式:崩溃恢复和消息广播算法
何时进入?服务器
这三种状况ZAB都会进入恢复模式网络
干了什么?架构
选举产生新的Leader服务器,同时集群中已有的过半的机器会与该Leader完成状态同步,这些工做完成后,ZAB协议就会退出崩溃恢复模式框架
何时进入?分布式
集群状态稳定,有了leader且过半机器状态同步完成,退出崩溃恢复模式后进入消息广播模式大数据
干了什么?架构设计
正常的消息同步,把平常产生数据从leader同步到learner的过程设计
上面写得比较简单,再总结一下,zab协议规定的两种模式在实际操做中经历了三个步骤,如上图,下面我再详细地说下这两个过程都干了些什么
进入崩溃恢复模式说明集群目前是存在问题的了,那么此时就须要开始一个选主的过程。
zookeeper使用的默认选主算法是FastLeaderElection,它是标准的Fast Paxos算法实现,可解决LeaderElection选举算法收敛速度慢的问题(上篇文章也有提到过)。
投票的依据就是下面的两个id,投票便是给全部服务器发送(myid,zxid)信息
myid:用户在配置文件中本身配置,每一个节点都要配置的一个惟一值,从1开始日后累加。
zxid:zxid有64位,分红两部分:
高32位是Leader的epoch:选举时钟,每次选出新的Leader,epoch累加1
低32位是在这轮epoch内的事务id:对于用户的每一次更新操做集群都会累加1。
注意:zk把epoch和事务id合在一块儿,每次epoch变化,都将低32位的序号重置,这样作是为了方便对比出最新的数据,保证了zxid的全局递增性。(其实这样也会存在问题,虽然几率小,这里就先不说了后面的文章会详细讲)。
第一轮投给本身,以后每一个服把上述全部信息发送给其余全部服,票箱中只会记录每一投票者的最后一票
服务器会尝试从其它服务器获取投票,并记入本身的投票箱内。若是没法获取任何外部投票,则会确认本身是否与集群中其它服务器保持着有效链接。若是是,则再次发送本身的投票;若是否,则立刻与之创建链接。
因为全部有效的投票都必须在同一轮次中。每开始新一轮投票自身的logicClock自增1。
对比自身的和接收到的(myid,zxid)
选完后广播选出的(myid,zxid)
过半服务器选了同一个,则投票结束,根据投票结果更新自身状态为leader或者follower
上面说过zookeeper是一个原子广播协议,在这个崩溃恢复的过程就体现了它的原子性,zookeeper在选主过程保证了两个问题:
(myid,zxid)的选票设计恰好解决了这两个问题。
如上图,client端发起请求,读请求由follower和observer直接返回,写请求由它们转发给leader。
Leader 首先为这个事务分配一个全局单调递增的惟一事务ID (即 ZXID )。
而后发起proposal给follower,Leader 会为每个 Follower 都各自分配一个单独的队列,而后将须要广播的事务 Proposal 依次放入这些队列中去,而且根据 FIFO策略进行消息发送。
每个 Follower 在接收到这个事务 Proposal 以后,都会首先将其以事务日志的形式写入到本地磁盘中去,而且在成功写入后反馈给 Leader 服务器一个 Ack 响应。
当 Leader 服务器接收到超过半数 Follower 的 Ack 响应后,就会广播一个Commit 消息给全部的 Follower 服务器以通知其进行事务提交,同时
Leader 自身也会完成对事务的提交。
zookeeper-操做与应用场景-《每日五分钟搞定大数据》
zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
zookeeper-paxos与一致性-《每日五分钟搞定大数据》
最近这几篇理论性的东西太多,下一篇写点简单的代码,zookeeper分布式锁的实现。感谢阅读。欢迎关注公众号:大叔据!