Zookeeper如何实现数据一致性
Zookeeper使用ZAB算法实现,Zookeepr并没有完全采用Paxos算法,而是使用原子广播协议,(Zookeeper Atomic Broadcast)
三个阶段:发现,同步和广播
ZAB保证了同一时刻只能有一个主进程来进行状态变更
协议过程
选举leader
每个follower广播自己事务队列中最大事务编号maxId
获取集群中其他follower发出来的maxId,选取出最大的maxId所属的follower,投票给改follower,选它为leader。
统计所有投票,获取投票数超过一半的follower被推选为leader
同步数据
各个follower向leader发送自己保存的任期E
leader,比较所有的任期,选取最大的E,加1后作为当前的任期E=E+1
将任务E广播给所有follower
follower将任期改为leader发过来的值,并且返回给leader事务队列L
leader从队列集合中选取任期最大的队列,如果有多个队列任期都是最大,则选取事务编号n最大的队列Lmax。将Lmax最为leader队列,并且广播给各个follower。
follower接收队列替换自己的事务队列,并且执行提交队列中的事务。
至此各个节点的数据达成一致,zookeeper恢复正常服务。
广播
leader节点接收到请求,将事务加入事务队列,并且将事务广播给各个follower。
follower接收事务并加入都事务队列,然后给leader发送准备提交请求。
leader 接收到半数以上的准备提交请求后,提交事务同时向follower 发送提交事务请求
follower提交事务。