ZooKeeper中的数据同步

数据同步的过程就是Leader服务器将那些没有在Learner服务器上提交过的事物请求同步给Learner服务器。

ZooKeeper集群数据同步通常分为四类,分别是直接差异化同步(DIFF同步)、先回滚再差异化同步(TRUNC + DIFF同步)、仅回滚同步(TRUNC同步)和全量同步(SNAP同步)

  • peerLastZxid:该Learner服务器最后处理的ZXID。

  • minCommittedLog:Leader服务器提议缓存队列committedLog中的最下ZXID。

  • maxCommittedLog:Leader服务器提议缓存队列committedLog中的最大ZXID。

1、直接差异化同步(DIFF同步)

场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间。

Leader服务器会首先向Learner发送一个DIFF指令。然后,在Proposal同步过程中,针对每个Proposal,Leader服务器都会通过发送两个数据包来完成,分别是PROPOSAL内容数据包和COMMIT指令数据包——这和ZooKeeper运行时Leader和Follower之间的事物请求的提交过程是一致的。在发送完差异化数据之后,将Learner加入到forwardingFollowers或observingLearners队列中,随后会立即发送一个NEWLEADER指令。

Learner首先接收到一个DIFF指令,然后会依次将接收到的数据包应用到内存数据库中。紧接着,Learner会接收到NEWLEADER指令,此时Learner就会反馈给Leader一个ACK消息,表明自己确实完成了一个对提议缓存队列中Proposal的同步。

一旦满足“过半策略”后,Leader服务就会向所有已经完成数据同步的Learner发送一个UPTODATE指令,用来通知Learner已经完成了数据同步,同时集群中已经有过半机器完成了数据同步,集群已经具备了对外服务的能力。

2、先回滚再差异化同步化(TRUNC + DIFF同步)

场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间;Leader服务器在已经将事务记录到了本地事务日志中,但是没有成功发起Proposal流程就挂了。

当Leader服务器发现某个Learner包含了一条自己没有的事务记录,那么即需要让该Learner进行事务回滚——回滚到Leader服务器上存在的,同时也是最接近peerLastZxid的ZXID。

3、进回滚同步(TRUNC同步)

场景:peerLastZxid大于maxCommittedLog。

Leader会要求Learner回滚到ZXID值为maxCommittedLog对应的事务操作。

4、全量同步(SNAP同步)

场景1:peerLastZxid小于minCommittedLog。

场景2:Leader服务器上没有提议缓存队列,peerLastZxid不等于lastProcessZxid。

Leader会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将它们序列化后传输给Learner。Learner服务器接收到该全量数据后,会对其反序列化后载入内存数据库中。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值