• SID:服务器ID。用来唯一标识一台 ZooKeeper集群中的机器,每台机器不能重 复,和myid一致。
  • ZXID:事务ID。ZXID是一个事务ID,用来 标识一次服务器状态的变更。
  • Epoch:每个Leader任期的代号。没有 Leader时同一轮投票过程中的逻辑时钟值是 相同的。每投完一次票这个数据就会增加

    消息广播:两阶段性提交

    1、client客户端发起一个写请求,leader将其转化为事务提案(proposal),并分配一个全局zxid
    2、往follower进行广播:每个follower是一个队列,并且zxid采用FIFO排队发送
    3、follower收到提案后,一阶段写入 并回复ACK
    4、leader收到半数以上的follower ACK之后,认为消息发送成功,向client发送commit
    5、leader向所有follower广播commit信息,同时leader、follower都完成两阶段事务提交。

    崩溃恢复:leader选举&数据恢复

    leader选举:第一次启动

  • 投票过半数时,服务器 id 大的胜出

image.png

leader选举:leader崩溃或网络原因leader与过半节点失去连接

  • 保留commit的事务提案,丢弃leader向follower写请求但是没向client commit的事务提案
  • EPOCH大的直接胜出、

    • EPOCH相同,zxid(事务提案ID)大的胜出 、
      • zxid相同,sid(服务器ID)大的胜出

        数据恢复

  • 目的:确保集群中过半follower已同步leader的数据

  • 过程:follower把落后的事务提案进行同步,leader才把该follower加入 可用的follower列表