<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ZAB on 追风笔记</title><link>https://4f0a9a3b.wangpeng.pages.dev/tags/zab/</link><description>Recent content in ZAB 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/zab/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></channel></rss>