叙述ZAB集群数据同步的过程

zookeeper中的事务都是由一个全局唯一的ID称为zxid,zxid由两部分组成:一部分为leader周期epoch,一部分为递增计数器。从算法的角度描述数据同步的过程:
1.1 对于准leader,集群中的所有follower向准leader发送一个自己最后接收的事务的epoch值
1.2 当准leader收到集群中过半的follower发送的epoch之后,在其中选出最大的epoch值e,加一得到e1,并将这个e1发送到集群中过半的follower。
1.3 当follower收到准leader发送的epoch值后与自己的epoch值比较,若小于,则将自己的epoch更新为e1,并向准leader发送ACK信息,包括epoch值与历史事务集合
1.4 当准leader收到ACK信息后,会在所有历史事务集合中选择一个历史事务集合作为初始化事务集合,该历史事务集合满足其zxid最大。
正式同步:
2.1 准leader将epoch与初始化事务集合发给集合中过半的follower。
leader会为每一个follower分配一个队列,并将那些没有被各个follower同步的事务以proposal的形式发送给各个follower,并在后面追加commit消息,表示该事务已经被提交。
2.2 当follower收到后,接收初始化事务集合里的事务,并执行,反馈给准leader表明自己已处理
2.3 准leader收到后给follower发送commit消息,follower收到commit后提交事务完成数据同步。
注:在zookeeper选举中,通过投票(内部投票和外部投票)。同步过程与上面相似,但是会简单一些,因为选举得到的leader就是zxid最大的机器。若zxid一致则选取的是myid最大的机器。

你可能感兴趣的:(叙述ZAB集群数据同步的过程)