ZooKeeper中的数据同步

非 Y 不嫁゛ 提交于 2020-01-28 03:48:51

数据同步的过程就是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服务器接收到该全量数据后,会对其反序列化后载入内存数据库中。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!