保证数据的一致性有两种情况,一种是重新选取出新 leader 后的数据同步,还有一种是 leader 处理完事务请求后与 follow 保持数据一致。
首先是重新选取出新 leader 后的数据同步,通过 FastLeaderElection 选举算法选出 leader,选出 leader 之后,leader 需要与其他节点进行同步,当超过一半的 follow 与 leader 进行同步完成后,leader 才能成为真正的 leader,然后 follow 会带上自己最大的 ZXID 尝试与 leader 连接,来确定数据是否同步。
其次是 leader 处理完事务请求后与 follow 保持数据一致。事务请求全部是由 leader 处理的,当 leader 收到请求后,会将事务请求转化为事务 Proposal,由于 leader 会为每一个 follow 创建一个队列,所以 leader 会将事务放入响应队列中,按顺序处理事务请求,来保证事务的顺序性。之后会在队列中顺序向其他节点广播该提案。follow 收到后会将其以事务的形式写入到本地日志中,并向 leader 发送反馈 ack,leader 会等待其他 follow 的回复,当收到一半以上的 follow 响应时,leader 会向其他节点发送 commit 消息,同时 leader 提交该提案。当 follow 将数据同步完成之后,leader 会将该 follow 加入到真正可用的 follow 列表中。