<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>选主 on 追风笔记</title><link>https://4f0a9a3b.wangpeng.pages.dev/tags/%E9%80%89%E4%B8%BB/</link><description>Recent content in 选主 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/tags/%E9%80%89%E4%B8%BB/index.xml" rel="self" type="application/rss+xml"/><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>