Zookeeper数据同步机制是怎样的
Zookeeper数据同步机制详解
一、数据同步的核心角色
Zookeeper集群中的服务器分为三类:Leader(领导者,负责处理所有写请求并协调数据同步)、Follower(跟随者,处理读请求并向Leader转发写请求)、Observer(观察者,类似Follower但不参与Leader选举,仅同步数据)。其中,Leader是数据同步的核心发起者,Follower和Observer统称为Learner(学习者),负责接收Leader同步的数据。
二、数据同步的整体流程
数据同步的触发时机包括:集群启动完成Leader选举、Learner服务器重启、Leader服务器处理完写请求后。整体流程可分为以下步骤:
- Learner向Leader注册:Learner启动后,向Leader发送
ACKEPOCH
消息(包含自身最后处理的ZXID、当前epoch等信息),完成注册。 - Leader初始化同步参数:Leader从
ACKEPOCH
消息中提取Learner的peerLastZxid
(Learner最后处理的ZXID),并从自身内存数据库的committedLog
(已提交事务日志队列)中获取minCommittedLog
(最小ZXID)和maxCommittedLog
(最大ZXID),作为同步的基准。 - 选择同步策略:Leader根据
peerLastZxid
与minCommittedLog
、maxCommittedLog
的关系,选择以下四种同步方式之一。 - 执行同步:Leader向Learner发送同步指令(如
DIFF
、SNAP
),并传输相应的数据(事务提案或全量快照);Learner接收数据并应用到本地内存数据库,完成后向Leader发送ACK
确认。 - 过半确认与完成:若集群中超过半数的Learner完成同步,Leader会向所有Learner发送
UPTODATE
指令,通知集群已具备对外服务能力;Learner收到后终止同步流程。
三、四种数据同步策略
1. 直接差异化同步(DIFF同步)
适用场景:peerLastZxid
介于minCommittedLog
和maxCommittedLog
之间(即Learner缺失部分已提交事务,但无冲突数据)。
流程:Leader向Learner发送DIFF
指令,随后依次发送peerLastZxid
之后的事务提案(Proposal);Learner按顺序应用这些提案,完成数据同步。
2. 先回滚再差异化同步(TRUNC+DIFF同步)
适用场景:Learner包含一条Leader没有的事务记录(即peerLastZxid
不在Leader的committedLog
中,但有更早的事务记录)。
原因:这种情况通常发生在Leader选举前,某台服务器处理了事务但未成功同步给多数节点,导致事务未提交却留在了Learner的本地日志中。
流程:Leader首先要求Learner回滚到Leader
上存在的、最接近peerLastZxid
的ZXID(即Leader
的committedLog
中最大的小于peerLastZxid
的ZXID);回滚完成后,再执行DIFF同步(发送后续事务提案)。
3. 仅回滚同步(TRUNC同步)
适用场景:peerLastZxid
大于maxCommittedLog
(即Learner处理的事务比Leader的最新事务更晚,但Leader的committedLog
中没有对应记录)。
原因:这种情况较少见,可能是Learner在Leader选举前处理了未提交的事务。
流程:Leader直接要求Learner回滚到maxCommittedLog
对应的ZXID(即Leader的最新已提交事务),无需发送额外的事务提案。
4. 全量同步(SNAP同步)
适用场景:
peerLastZxid
小于minCommittedLog
(即Learner的数据远远落后于Leader,缺失大量事务);- Leader没有
committedLog
(如Leader刚启动且未处理任何事务),且peerLastZxid
不等于Leader
的lastProcessedZxid
(Leader恢复后的最大ZXID)。
流程:Leader向Learner发送SNAP
指令,随后将内存中的全量数据(包括节点树、数据内容、会话信息等)序列化后传输给Learner;Learner接收后反序列化并载入本地内存,完成同步。
四、数据同步的关键保障机制
1. Zxid(事务ID)
Zookeeper通过全局递增的ZXID(64位数字,高32位为epoch、低32位为计数器)标识事务顺序。每个写请求都会生成唯一的ZXID,确保事务的全局有序性,是数据同步的重要依据。
2. 过半策略(Quorum)
Leader在同步数据时,需等待超过半数的Learner完成同步(如3节点集群需2节点同步,5节点集群需3节点同步),才会向所有Learner发送UPTODATE
指令。过半策略保证了集群的容错性(最多容忍(n-1)/2
节点故障)和数据一致性(多数节点认可的数据即为最终数据)。
3. 版本号控制
Zookeeper为每个ZNode(数据节点)维护版本号(version
,数据内容版本;cversion
,子节点版本;aversion
,ACL版本)。客户端修改数据时,需携带当前版本号;Leader会检查版本号是否匹配,若不匹配则拒绝修改(需客户端重新获取最新数据后重试),避免数据冲突。
4. 快照(Snapshot)
Leader定期将内存中的全量数据写入磁盘(生成快照文件,如snapshot.2c021384ce
,后缀为生成时的ZXID)。快照用于全量同步,避免了每次同步都需要传输全部数据,提高了同步效率。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Zookeeper数据同步机制是怎样的
本文地址: https://pptw.com/jishu/728360.html