Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ZooKeeper-数据读写流程

ZooKeeper-数据读写流程

作者头像
运维小路
发布于 2025-05-12 02:58:55
发布于 2025-05-12 02:58:55
4100
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

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

上个小节我们介绍了Zookeeper的选举流程,本小节来讲解一个读写流程,作为集群对外提供服务,而我们的客户端连接的时候也会把所有的地址都写到配置文件里面,那么读写数据的时候他具体是怎么实现的呢?

Zookeeper读流程

我这里使用一个测试python程序来连接到集群进行测试,代码里面写了3个Zookeeper地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zk_hosts = '192.168.31.140:2181,192.168.31.141:2181,192.168.31.142:2181'

执行写入程序,从下面的网络连接可以看到,我们虽然写了3个zk地址,但是实际上他只会随机连接其中一个,如果连接失败,他则重新选择一个进行连接(业务程序不受影响,从PID来看,他没有变化)。

我们前面介绍了zk的2个角色,leader是可读可写的,follower只读,如果我的客户端连接刚好连接到follower以后,他是如何来出来我的的写请求呢?下面都是修改了日志级别才看到的日志情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed -i 's/INFO/DEBUG/g' logback.xml

连接leader 写日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#leader日志 
2025-04-19 15:39:38,194 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.SessionTrackerImpl@309] - Checking session 0x200003287770000
2025-04-19 15:39:38,194 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.ZooKeeperServer@2012] - Permission requested: 2 
2025-04-19 15:39:38,194 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.ZooKeeperServer@2013] - ACLs for node: [31,s{'world,'anyone}]
2025-04-19 15:39:38,194 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.ZooKeeperServer@2014] - Client credentials: ['ip,'192.168.31.120]
2025-04-19 15:39:38,195 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.PrepRequestProcessor@1136] - Digest got from data tree is: 2535257766
2025-04-19 15:39:38,195 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.q.CommitProcessor@606] - Processing request:: sessionid:0x200003287770000 type:setData cxid:0x3 zxid:0x800000021 txntype:5 reqpath:n/a
#Leader发起投票请求
2025-04-19 15:39:38,195 [myid:] - DEBUG [ProcessThread(sid:2 cport:-1)::o.a.z.s.q.Leader@1273] - Proposing:: sessionid:0x200003287770000 type:setData cxid:0x3 zxid:0x800000021 txntype:5 reqpath:n/a
2025-04-19 15:39:38,214 [myid:] - DEBUG [LearnerHandler-/192.168.31.140:54388:o.a.z.s.q.CommitProcessor@594] - Committing request:: sessionid:0x200003287770000 type:setData cxid:0x3 zxid:0x800000021 txntype:5 reqpath:n/a
2025-04-19 15:39:38,215 [myid:] - DEBUG [LearnerHandler-/192.168.31.142:59648:o.a.z.s.q.Leader@1022] - outstanding is 0
2025-04-19 15:39:38,215 [myid:] - DEBUG [CommitProcessor:2:o.a.z.s.FinalRequestProcessor@148] - Processing request:: sessionid:0x200003287770000 type:setData cxid:0x3 zxid:0x800000021 txntype:5 reqpath:n/a
2025-04-19 15:39:38,215 [myid:] - DEBUG [CommitProcessor:2:o.a.z.c.PathTrie@312] - mydata
2025-04-19 15:39:38,215 [myid:] - DEBUG [CommitProcessor:2:o.a.z.s.DataTree@1815] - Digests are matching for Zxid: 800000021, Digest in log and actual tree: 3757378326
2025-04-19 15:39:38,215 [myid:] - DEBUG [CommitProcessor:2:o.a.z.s.FinalRequestProcessor@202] - sessionid:0x200003287770000 type:setData cxid:0x3 zxid:0x800000021 txntype:5 reqpath:n/a

大体意思是先对请求进行鉴权以及显示客户端信息,领导者(Leader)正在提议这个setData请求,准备提交给集群中的其他服务器。并且其他服务器同意,最终写入这个数据。

连接foller请求日志

可以发现他并没发起投票请求,确实也没看到转发的日志。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#follower日志
2025-04-19 15:44:07,421 [myid:] - DEBUG [FollowerRequestProcessor:1:o.a.z.s.q.CommitProcessor@606] - Processing request:: sessionid:0x10000328b4e0000 type:setData cxid:0x3 zxid:0xfffffffffffffffe txntype:unknown reqpath:/mydata
2025-04-19 15:44:07,497 [myid:] - DEBUG [QuorumPeer[myid=1](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):o.a.z.s.q.CommitProcessor@594] - Committing request:: sessionid:0x10000328b4e0000 type:setData cxid:0x3 zxid:0x80000002f txntype:5 reqpath:n/a
2025-04-19 15:44:07,497 [myid:] - DEBUG [CommitProcessor:1:o.a.z.s.FinalRequestProcessor@148] - Processing request:: sessionid:0x10000328b4e0000 type:setData cxid:0x3 zxid:0x80000002f txntype:5 reqpath:/mydata
2025-04-19 15:44:07,498 [myid:] - DEBUG [CommitProcessor:1:o.a.z.c.PathTrie@312] - mydata
2025-04-19 15:44:07,498 [myid:] - DEBUG [CommitProcessor:1:o.a.z.s.DataTree@1815] - Digests are matching for Zxid: 80000002f, Digest in log and actual tree: 1443723835
2025-04-19 15:44:07,498 [myid:] - DEBUG [CommitProcessor:1:o.a.z.s.FinalRequestProcessor@202] - sessionid:0x10000328b4e0000 type:setData cxid:0x3 zxid:0x80000002f txntype:5 reqpath:/mydata

ZooKeeper写请求流程图

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





graph TD
    subgraph 客户端直连Leader
        A1[Client] -->|1. 写请求 /mydata| B1[Leader]
        B1 -->|2. 生成ZXID, 广播Proposal| C1[Followers]
        C1 -->|3. 回复ACK| B1
        B1 -->|4. 收到多数ACK后提交Commit| C1
        C1 -->|5. 应用事务到DataTree| D1[数据持久化]
        B1 -->|6. 返回成功| A1
    end

    subgraph 客户端连接Follower
        A2[Client] -->|1. 写请求 /mydata| B2[Follower]
        B2 -->|2. 转发请求到Leader| B1
        B1 -->|3. 生成ZXID, 广播Proposal| C2[Followers]
        C2 -->|4. 回复ACK| B1
        B1 -->|5. 提交Commit| C2
        C2 -->|6. 应用事务到DataTree| D2[数据持久化]
        B1 -->|7. 通知Follower提交完成| B2
        B2 -->|8. 返回成功| A2
    end

详细流程说明

场景1:客户端直连Leader
  1. 客户端发送写请求‌:客户端直接向Leader节点(如myid=2)发送setData请求(路径/mydata)。
  2. Leader发起提案(Proposal)‌:Leader生成全局唯一事务ID(ZXID,如0x800000012),通过‌ZAB协议‌将提案(Proposal)广播给所有Followers。
  3. Followers回复ACK‌:Followers接收提案后,检查数据合法性,并向Leader发送ACK确认。
  4. Leader提交事务(Commit)‌:Leader收到‌多数派(Quorum)‌的ACK后,向所有Followers发送Commit指令。
  5. 数据持久化‌:Leader和Followers将事务应用到本地DataTree,并记录到事务日志(Txn Log)。
  6. 返回客户端成功‌:Leader直接向客户端返回写操作成功。
场景2:客户端连接Follower
  1. 客户端发送写请求‌:客户端向Follower节点(如myid=3)发送setData请求。
  2. Follower转发请求‌:Follower识别到写请求无法本地处理,将请求转发给Leader。
  3. Leader处理提案(同场景1的步骤2-5)‌:Leader生成ZXID、广播提案、收集ACK、提交事务,并通知所有Followers提交完成。
  4. Follower响应客户端‌:Follower收到Leader的Commit通知后,更新本地数据,并向客户端返回成功。

关键差异点

‌步骤‌

‌客户端直连Leader‌

‌客户端连接Follower‌

‌请求入口‌

Leader直接接收请求

Follower接收请求并转发

‌网络路径‌

客户端→Leader→Followers

客户端→Follower→Leader→Followers

‌客户端响应延迟‌

较低(减少一次转发)

较高(增加转发和回传时间)

‌适用场景‌

客户端已知Leader地址

客户端通过负载均衡或随机连接访问集群

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
ZooKeeper-事务日志(Txn Log)‌和‌内存数据树(DataTree)
前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件。
运维小路
2025/05/13
640
ZooKeeper-事务日志(Txn Log)‌和‌内存数据树(DataTree)
ZooKeeper源码分析:Quorum请求的整个流程
Quorum请求是转发给Leader处理,并且需要得一个Follower Quorum确认的请求。这些请求包括:
星哥玩云
2022/07/04
6640
ZooKeeper源码分析:Quorum请求的整个流程
Kafka异常复盘NotLeaderForPartitionException【实战笔记】
监控及Kafka Manager显示节点数量正常。问题集群有6个节点,3个副本。查看日志发现,都在大量输出选举的日志,日志中暂时没有发现明显的ERROR和FATAL日志。类似内容如下:
瓜农老梁
2019/08/30
8.7K0
Kafka异常复盘NotLeaderForPartitionException【实战笔记】
Zookeeper-选举Leader流程
作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/05/12
730
Zookeeper-选举Leader流程
zookeeper源码分析(3)— 一次会话的创建过程
在一次会话的创建过程中,需要客户端首先发送创建会话请求,服务端集群创建会话成功后会将响应发送给客户端。
Monica2333
2020/06/22
1.7K0
Zookeeper-案例 (多AZ高可用容灾)
前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件。
运维小路
2025/05/22
930
Zookeeper-案例 (多AZ高可用容灾)
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
当我们向zk发出一个数据更新请求时,这个请求的处理流程是什么样的?zk又是使用了什么共识算法来保证一致性呢?带着这些问题,我们进入今天的正文。
泊浮目
2023/12/25
2460
查看zookeeper事务日志
(1)Zookeeper的事务日志文件位置,在配置文件zoo.cfg的dataDir指定。 我的配置如下
程裕强
2021/09/08
1.4K0
手摸手教你阅读和调试大型开源项目 ZooKeeper
Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源、有趣、入门级的 ZooKeeper 教程,面向有编程基础的新手。
HelloGitHub
2021/05/08
5690
手摸手教你阅读和调试大型开源项目 ZooKeeper
Zookeeper总结
(tickTime也是一个配置项。是Server内部控制时间逻辑的最小时间单位) 如果客户端发来的sessionTimeout超过min-max这个范围,server会自动截取为min或max.
XING辋
2019/05/08
9190
Zookeeper总结
ZooKeeper数据存储与数据同步机制
ZooKeeper中,数据存储分为两部分,内存数据(ZKDatabase)与磁盘数据(事务日志 + 事务快照)。
Flink实战剖析
2022/11/21
1.7K0
ZooKeeper数据存储与数据同步机制
Zookeeper-监控(Monitor)
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/05/18
720
Zookeeper-监控(Monitor)
Apache ZooKeeper - FourLetterCommands运维命令
除了 JConsole 监控控制台之外,ZooKeeper 还提供了一些命令,可使我们更加灵活地统计监控 ZooKeeper 服务的状态信息。
小小工匠
2021/08/17
4110
zookeeper使用详解(命令、客户端、源码)
  zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式协调、配置管理、分布式锁,并且有个watch节点监听常常能听到。接下来我要系统的学下zookeeper的功能和原理,一起走进zookeeper的世界
老梁
2019/09/10
2.5K0
zookeeper使用详解(命令、客户端、源码)
初始ZooKeeper与集群搭建实例
Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,应用于分布式应用的协作服务,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。
星哥玩云
2022/07/04
2410
Zookeeper核心原理
  » 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票
用户4283147
2022/10/27
4020
Zookeeper核心原理
ZooKeeper和ZAB协议
ZooKeeper是一个提供高可用,一致性,高性能的保证读写顺序的存储系统。ZAB协议为ZooKeeper专门设计的一种支持数据一致性的原子广播协议。
用户2937493
2019/09/11
5820
Zookeeper的事务日志和数据
1、事务日志log,对应代码类:org.apache.zookeeper.server.persistence.FileTxnLog 2、快照日志snapshot,对应代码类:org.apache.zookeeper.server.persistence.FileTxnSnapLog
tunsuy
2022/10/27
1.3K0
zookeeper分布式协调详解
ZooKeeper的数据模型,在结构上和标准文件系统的非常相似,都是采用这种树形层次结构,ZooKeeper树中的每个节点被称为:Znode。和文件系统的目录树一样,ZooKeeper树中的每个节点可以拥有子节点:
leobhao
2022/06/28
6510
zookeeper分布式协调详解
Zookeeper系列(4):搭建Zookeeper集群
假如集群只有两台服务器,那么其中任意一台服务器发生故障,集群就不可用了(集群中可用节点数量需要大于一半才可用),由于存在两个单点故障,因此两个服务器还不如单个服务器稳定。
布禾
2021/04/30
3.5K0
Zookeeper系列(4):搭建Zookeeper集群
相关推荐
ZooKeeper-事务日志(Txn Log)‌和‌内存数据树(DataTree)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验