Zookeeper 事务ID


每个zookeeper 事务都有一个全局唯一的事务ID,ZXID。ZXID 高32 位是leader 周期epoch,低32 位是递增计数器。


第一阶段(准leader 生成初始化事务集合)


  1. 所有follower 向准leader 发送自己最后接收的事务的epoch;
  2. 准leader 选取最大的epoch,加1得到e1,将e1 发送给follower;
  3. follower 收到准leader 发送的epoch 值之后,与自己的epoch 值作比较,若小于,则将自己的epoch 更新为e1,并向准leader 发送反馈ACK信息(epoch 信息、历史事务集合);
  4. 准leader 接收到ACK 消息之后,会在所有历史事务集合中选择其中一个历史事务集合作为初始化事务集合,该事务集合满足ZXID最大;

第二阶段(数据同步)


  1. 准leader 将epoch 与 初始化事务集合发送给集群中过半的follower;每个follower 会分配到一个队列,leader 会将那些没有被各个follower 同步的事务以proposal 形式发送给各个follower,并在后面追加commit 消息,表示事务已被提交;
  2. follower 接收后,会执行初始化事务集合中的事务(执行过跳过,未执行执行),反馈给leader 表明自己已经处理(追上来了)
  3. leader 收到后过半反馈后,发送commit 消息;
  4. follower 接收到commit 消息后,提交事务;