<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ZooKeeper on 追风笔记</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/</link><description>Recent content in ZooKeeper on 追风笔记</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Tue, 25 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/index.xml" rel="self" type="application/rss+xml"/><item><title>ZooKeeper 数据模型与 ZAB 协议</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/model-zab/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/model-zab/</guid><description>&lt;p&gt;ZooKeeper 的可靠性来源于其简洁的数据模型与强一致的 ZAB 协议。理解二者是正确使用 ZK 的前提。&lt;/p&gt;&#10;&lt;h2 id="数据模型-znode"&gt;数据模型 znode&#10;&lt;/h2&gt;&#10;&lt;p&gt;ZK 维护一棵类似文件系统的层级树，每个节点称为 &lt;strong&gt;znode&lt;/strong&gt;，可同时承载数据与子节点。其类型决定了生命周期与并发语义：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;持久节点 / 临时节点&lt;/strong&gt;：临时节点随 session 断开自动删除，是分布式锁、选主的基础。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;普通节点 / 顺序节点&lt;/strong&gt;：顺序节点创建时自动追加单调递增序号。&lt;/li&gt;&#10;&lt;li&gt;每个 znode 带有 &lt;code&gt;version&lt;/code&gt;、&lt;code&gt;cversion&lt;/code&gt;、&lt;code&gt;aversion&lt;/code&gt;，修改时版本自增，提供乐观锁语义。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="session-与-watcher"&gt;Session 与 Watcher&#10;&lt;/h2&gt;&#10;&lt;p&gt;客户端与服务器建立 &lt;strong&gt;session&lt;/strong&gt;，通过心跳保活，session 超时则服务器清理其临时节点。客户端可对节点注册 &lt;strong&gt;Watcher&lt;/strong&gt;，节点发生变化（数据写、子节点变）时收到一次性通知，需重新注册才能继续监听。&lt;/p&gt;&#10;&lt;h2 id="zab-协议"&gt;ZAB 协议&#10;&lt;/h2&gt;&#10;&lt;p&gt;ZAB（ZooKeeper Atomic Broadcast）是为 ZK 设计的崩溃恢复原子广播协议，保证所有事务以相同顺序被所有副本应用。&lt;/p&gt;&#10;&lt;h3 id="崩溃恢复与选主"&gt;崩溃恢复与选主&#10;&lt;/h3&gt;&#10;&lt;p&gt;集群启动时或 Leader 宕机进入恢复阶段：选举产生新 Leader，并让各 Follower 补齐到与 Leader 相同的状态。选主依赖 &lt;code&gt;zxid&lt;/code&gt;（事务 id）与 &lt;code&gt;myid&lt;/code&gt;，zxid 越大代表数据越新，优先当选。&lt;/p&gt;&#10;&lt;h3 id="消息广播"&gt;消息广播&#10;&lt;/h3&gt;&#10;&lt;p&gt;正常阶段采用类似 2PC 的广播：Leader 为每个写请求分配递增 &lt;code&gt;zxid&lt;/code&gt; 并发起提议，Follower 写本地日志后 ACK，Leader 收到多数派 ACK 即提交并通知应用。&lt;/p&gt;</description></item><item><title>ZooKeeper 分布式协调实战</title><link>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/coordination/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://4f0a9a3b.wangpeng.pages.dev/tech/zookeeper/coordination/</guid><description>&lt;p&gt;ZooKeeper 提供原语级的协调能力，几乎所有分布式协调需求都可基于「临时节点 + 顺序节点 + Watcher」组合实现。&lt;/p&gt;&#10;&lt;h2 id="选主master-election"&gt;选主（Master Election）&#10;&lt;/h2&gt;&#10;&lt;p&gt;每个候选者在 &lt;code&gt;/election&lt;/code&gt; 下创建临时顺序节点，序号最小的即成为 Master。非最小节点监听其前一个节点，前驱消失时重新判断自己是否最小，从而实现故障自动转移：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-96c7e587-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="text" data-td-line-count="4"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-96c7e587-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/election&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── /n_0000000001 (master)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── /n_0000000002 (watch 001)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── /n_0000000003 (watch 002)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="配置中心"&gt;配置中心&#10;&lt;/h2&gt;&#10;&lt;p&gt;将配置写入持久节点，客户端读取并注册 Watcher，配置变更时收到通知后热更新，无需重启应用。注意配置节点应控制体积，避免单次推送过大。&lt;/p&gt;&#10;&lt;h2 id="分布式锁"&gt;分布式锁&#10;&lt;/h2&gt;&#10;&lt;p&gt;基于「临时顺序节点 + 监听前驱」实现公平排他锁，比简单 &lt;code&gt;create&lt;/code&gt; 抢锁更健壮、可避免惊群。&lt;/p&gt;&#10;&lt;h3 id="羊群效应herd-effect"&gt;羊群效应（Herd Effect）&#10;&lt;/h3&gt;&#10;&lt;p&gt;若所有客户端都监听同一个锁节点，释放时会被同时唤醒并争抢，产生大量无效请求。正确做法是&lt;strong&gt;只监听比自己序号小的前一个节点&lt;/strong&gt;，形成链式唤醒，将 O(N) 通知降为 O(1)。&lt;/p&gt;&#10;&lt;h3 id="临时节点的坑"&gt;临时节点的坑&#10;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;客户端 GC 停顿或网络抖动可能导致 session 超时，临时节点被误删而锁提前释放。需结合合理的 &lt;code&gt;sessionTimeout&lt;/code&gt; 与心跳。&lt;/li&gt;&#10;&lt;li&gt;持锁方崩溃后锁自动释放，但业务未提交，需保证操作幂等。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="与-etcd-的取舍"&gt;与 etcd 的取舍&#10;&lt;/h2&gt;&#10;&lt;p&gt;etcd 基于 Raft，提供更强一致与租约（lease）、Watch 增量推送，API 更简单，云原生场景（Kubernetes）更主流；ZK 生态成熟、客户端丰富，但在超大规模 Watch 下存在性能瓶颈。新项目可优先考虑 etcd，存量 Dubbo/Hadoop 体系仍常用 ZK。&lt;/p&gt;</description></item></channel></rss>