前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件。
我们上个小节介绍了ZooKeeper的读写流程,那这个数据到底是如何存储到系统里面的呢,本小节就来介绍它。
ZooKeeper通过事务日志(Txn Log)和内存数据树(DataTree)的双重机制保证数据持久化与一致性,具体流程如下:
客户端发起写请求:客户端向ZooKeeper集群发送写请求(如setData)。若连接Follower,请求将被转发至Leader 。
Leader分配ZXID:Leader生成全局唯一事务ID(ZXID),格式为epoch(高32位) + 计数器(低32位)
(如0x80000000c
)
#16进制
| epoch (高32位) | 计数器 (低32位) |
epoch:表示当前 Leader 的任期编号,每次选举出新的 Leader 时,epoch 值会递增。
计数器:每个写操作递增一次,用于保证同一 Leader 期间的操作顺序。
2025-05-11 20:33:00,253 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.q.CommitProcessor@606] - Processing request:: sessionid:0x100039dc3f20000 type:create cxid:0x2 zxid:0x200000002 txntype:1 reqpath:n/a
2025-05-11 20:33:00,254 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.q.Leader@1273] - Proposing:: sessionid:0x100039dc3f20000 type:create cxid:0x2 zxid:0x200000002 txntype:1 reqpath:n/a
2025-05-11 20:33:00,282 [myid:] - DEBUG [SyncThread:2:o.a.z.s.q.CommitProcessor@594] - Committing request:: sessionid:0x100039dc3f20000 type:create cxid:0x2 zxid:0x200000002 txntype:1 reqpath:n/a
2025-05-11 20:33:00,282 [myid:] - DEBUG [CommitProcessor:2:o.a.z.s.FinalRequestProcessor@148] - Processing request:: sessionid:0x100039dc3f20000 type:create cxid:0x2 zxid:0x200000002 txntype:1 reqpath:n/a
2025-05-11 20:33:00,282 [myid:] - DEBUG [CommitProcessor:2:o.a.z.c.PathTrie@312] - abcd
#事务id,当然这个是简写过的
zxid:0x200000002
1. 事务日志(Txn Log)写入Leader行为:当Leader接收到写请求时,它会将事务操作(如创建节点、设置数据等)转换为事务日志条目,并写入本地事务日志文件(例如log.XXXX)。这一步骤确保了即使系统崩溃,也能从日志中恢复数据变更。Follower行为:Followers接收到Leader广播的提案(Proposal)后,也会将相同的事务日志条目写入自己的本地磁盘。完成后,Followers会向Leader发送ACK确认消息。
2. 内存数据树更新多数派ACK:一旦Leader收到来自多数派(即超过半数)Followers的ACK确认,它就知道这个事务已经被足够多的节点记录,可以安全地应用到内存中的数据树(DataTree)。数据树变更:Leader和Followers都会将事务应用到它们的内存数据树,更新相应的节点属性和数据版本,例如事务ID(mzxid)和修改时间(mtime)。
3. 事务提交确认Commit指令:在Leader确认事务已经被多数派记录并应用到内存数据树后,它会向所有节点广播Commit指令。最终数据生效:收到Commit指令后,所有节点会正式提交事务,使数据变更生效。此时,客户端的写请求完成,可以返回成功响应。
批量刷盘(Batching)ZooKeeper默认采用异步刷盘策略,通过批量写入事务日志减少磁盘I/O次数,提升吞吐量 ,可通过forceSync
参数强制每次写入同步刷盘(牺牲性能换取更高一致性)。
快照(Snapshot)生成当事务日志达到阈值(如100MB)或时间窗口到期时,生成内存数据树的快照文件(snapshot.XXXX
),用于快速恢复数据 。
机制 | 作用 |
---|---|
ZXID全局有序 | 保证事务顺序性,用于崩溃恢复时回放日志顺序一致。 |
半数确认(Quorum) | 确保集群在部分节点故障时仍可提交事务,实现高可用。 |
事务日志与快照分离 | 事务日志记录操作流水,快照记录完整状态,两者结合降低恢复时间。 |
流程示意图(简版)
客户端 → Follower转发 → Leader
↓
生成ZXID → 写入事务日志(磁盘)
↓
广播提案 → Followers写入事务日志(磁盘)
↓
半数ACK → 提交Commit → 更新DataTree(存)
↓
触发快照生成(异步) → 返回客户端成功
ZooKeeper通过事务日志优先写入磁盘 + 内存数据树更新的双阶段机制,结合异步刷盘和快照备份,在保障强一致性的同时优化性能。半数以上节点的持久化确认(Quorum)是数据安全的核心保障 。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有