<?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>/tags/zookeeper/</link>
    <description>Recent content in ZooKeeper on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 14 Oct 2026 21:40:00 +0800</lastBuildDate><atom:link href="/tags/zookeeper/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ZooKeeper 顺序节点计数器溢出导致 ClickHouse 复制表无法写入</title>
      <link>/posts/clickhouse-zookeeper-sequence-overflow/</link>
      <pubDate>Wed, 14 Oct 2026 21:40:00 +0800</pubDate>
      
      <guid>/posts/clickhouse-zookeeper-sequence-overflow/</guid>
      <description>复制表的 INSERT 某一刻起全部失败，三个副本报同一个错，读不受影响：
Code: 244. DB::Exception: Unexpected logical error while adding block 0 with ID &amp;#39;…&amp;#39;: Node exists, path /clickhouse/tables/&amp;lt;uuid&amp;gt;/01/log/log-. (UNEXPECTED_ZOOKEEPER_ERROR) 原因是 ZooKeeper 里给复制日志编号的计数器到了 int32 上限。这句报错出自 clickhouse-lab 的实验 28：在 ClickHouse 25.3.14.14 和 Apache ZooKeeper 3.8.4 上，把一张复制表的计数器推到上限，复现了这个问题，也验证了只用 SQL 就能恢复。
失败的是在 log/ 下建复制日志那一步 ClickHouse 提交一个 part 时，把几件事放进同一个 ZooKeeper 事务：登记这个 part、记下去重用的块哈希、在 log/ 下建一条复制日志（ReplicatedMergeTreeSink.cpp:865）。报错的 path 指向 log/log-，说明失败的是建复制日志这一件。log/ 下的条目是顺序节点，ClickHouse 只给前缀 log-，序号由 ZooKeeper 追加，按理不会重名。log/ 里放的是什么、另外两个副本怎么照着它拉 part，写入路径那篇写过。
ZooKeeper 的序号来自父节点上的一个 int32 ZooKeeper 的文档说，这个序号来自父节点维护的一个有符号 4 字节整数，「the counter will overflow when incremented beyond 2147483647」（ZooKeeper Programmer&amp;rsquo;s Guide）。3.</description>
    </item>
    
  </channel>
</rss>
