前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ZooKeeper-事务日志(Txn Log)‌和‌内存数据树(DataTree)

ZooKeeper-事务日志(Txn Log)‌和‌内存数据树(DataTree)

作者头像
运维小路
发布于 2025-05-13 01:27:57
发布于 2025-05-13 01:27:57
6400
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件

我们上个小节介绍了ZooKeeper的读写流程,那这个数据到底是如何存储到系统里面的呢,本小节就来介绍它。

ZooKeeper写操作数据落盘流程详解

ZooKeeper通过‌事务日志(Txn Log)‌和‌内存数据树(DataTree)‌的双重机制保证数据持久化与一致性,具体流程如下:


一、客户端请求处理

客户端发起写请求:‌客户端向ZooKeeper集群发送写请求(如setData)。若连接Follower,请求将被转发至Leader ‌。

Leader分配ZXID‌:Leader生成全局唯一事务ID(ZXID),格式为epoch(高32位) + 计数器(低32位)(如0x80000000c)‌

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#16进制 
| epoch (32) | 计数器 (32) |

epoch:表示当前 Leader 的任期编号,每次选举出新的 Leader 时,epoch 值会递增。

计数器:每个写操作递增一次,用于保证同一 Leader 期间的操作顺序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#事务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)‌

确保集群在部分节点故障时仍可提交事务,实现高可用。

‌事务日志与快照分离‌

事务日志记录操作流水,快照记录完整状态,两者结合降低恢复时间。

流程示意图(简版)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制





客户端 → Follower转发 → Leader
                        ↓
                生成ZXID → 写入事务日志(磁盘)
                        ↓
               广播提案 → Followers写入事务日志(磁盘)
                        ↓
               半数ACK → 提交Commit → 更新DataTree(存)
                        ↓
             触发快照生成(异步) → 返回客户端成功

总结

ZooKeeper通过‌事务日志优先写入磁盘‌ + ‌内存数据树更新‌的双阶段机制,结合‌异步刷盘‌和‌快照备份‌,在保障强一致性的同时优化性能。半数以上节点的持久化确认(Quorum)是数据安全的核心保障 ‌。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验