ZooKeeper 迁移到 ClickHouse Keeper:3 节点 quorum、converter 转换与 25.10 的默认变更
ClickHouse Keeper(clickhouse-keeper)用来替代 ZooKeeper,提供数据复制与分布式 DDL 执行的协调服务,客户端协议保持兼容。官方说明见 Keeper 指南 与 替代 ZooKeeper。
为什么替:ZAB vs RAFT
ZooKeeper 用 Java 实现,共识算法 ZAB 不为读提供线性一致性,每个节点本地服务读。Keeper 用 C++ 编写,采用 RAFT(NuRaft)实现,读写都能提供线性一致性;默认保证与 ZooKeeper 相同——写线性一致、读非线性一致。客户端/服务器协议兼容,任何标准 ZooKeeper 客户端都能与之交互。
关键差异:
- 服务器间协议不兼容,无法构建混合 ZooKeeper/Keeper 集群。
- 快照与日志格式与 ZooKeeper 不兼容,需要
clickhouse-keeper-converter转换。 - C++ 单二进制,无外部依赖。
- 快照/日志压缩更省磁盘。
- 没有默认包大小与节点数据大小限制(ZooKeeper 是 1 MB)。
- 没有 ZXID 溢出问题(ZooKeeper 每 20 亿事务会强制重启)。
- 分区后恢复更快;可选
quorum_reads提供线性一致读;同数据量下内存占用更少。
Keeper 既可嵌入 ClickHouse server(配置 ``),也可独立运行。
写入为主、内存效率重要、非 Java 生态、要管理 ClickHouse 集群,适合用它;读为主、需要读扩展、依赖 Java 组件,则不适合。
配置与运行
主要标签 ``:tcp_port(默认 2181)、tcp_port_secure、server_id(唯一)、log_storage_path、snapshot_storage_path、enable_reconfiguration、max_memory_usage_soft_limit、http_control、digest_enabled、create_snapshot_on_exit、hostname_checks_enabled、four_letter_word_white_list、enable_ipv6。
coordination_settings 默认值:
operation_timeout_ms10000min_session_timeout_ms10000session_timeout_ms100000heart_beat_interval_ms500election_timeout_lower_bound_ms1000election_timeout_upper_bound_ms2000rotate_log_storage_interval100000reserved_log_items100000snapshot_distance100000snapshots_to_keep3stale_log_gap10000fresh_log_gap200max_requests_batch_size100force_synctruequorum_readsfalseauto_forwardingtrueshutdown_timeout5000startup_timeout30000async_replicationfalse(默认禁用以免破坏向后兼容;若所有实例都是 v23.9+,建议启用)
raft_configuration 只有一个参数 secure,用于加密 quorum 通信。每个 `` 有 id、hostname、port、can_become_leader(false 表示 learner)。
server_id 与 hostname 的映射必须保持一致,不要复用或打乱;主机可能变化时用主机名而不是 IP,改主机名等价于移除再添加服务器。
Keeper 集成在 ClickHouse server 包中,把 `` 加到 config.d 正常启动即可。独立运行:
clickhouse-keeper --config /etc/your_path_to_config/config.xml
没有符号链接时:
clickhouse keeper --config ...
三节点 quorum 配置
ensemble 大小必须是奇数,quorum 需要多数(50%+1)。2 节点一次单点故障就失去 quorum,推荐 3 节点。
每个节点放 /etc/clickhouse-server/config.d/keeper.xml(hostname3 用 /etc/clickhouse-keeper/keeper_config.xml):
2181
1
/var/lib/clickhouse/coordination/log
/var/lib/clickhouse/coordination/snapshots
10000
30000
trace
10000
1
hostname1
9444
2
hostname2
9444
3
hostname3
9444
/clickhouse/testcluster/task_queue/ddl
server_id 每个节点不同(1/2/3)。官方文档示例的 raft 端口用 9234,上面这个例子用 9444。独立启动:
clickhouse-keeper --config /etc/clickhouse-keeper/keeper_config.xml
从 ZooKeeper 迁移
无法无缝迁移:必须停 ZooKeeper 集群、转换数据、再启动 Keeper。converter 要求 ZooKeeper 3.4+。
迁移前:安排维护窗口;停止所有会修改协调元数据的后台任务(SYSTEM STOP MERGES;);记录基线指标。
- 停止向所有 ClickHouse 节点摄取数据。
- 停止所有 ClickHouse 节点后台任务。
- 停止所有 ZooKeeper 节点。
- (可选但建议)找到 leader,重启它之后再停,强制写一致快照到磁盘。
- 在 leader 节点运行转换器:
clickhouse-keeper-converter \
--zookeeper-logs-dir /var/lib/zookeeper/version-2 \
--zookeeper-snapshots-dir /var/lib/zookeeper/version-2 \
--output-dir /path/to/clickhouse/keeper/snapshots
完整 ClickHouse 可执行文件时用 clickhouse keeper-converter,否则下载二进制。
- 把快照复制到所有 Keeper 节点。任何节点启动前必须已经有快照,否则没有快照的节点可能以空状态把自己选成 leader。
- 更新 ClickHouse 配置指向新的 Keeper 集群。
- 在所有节点启动 Keeper,然后重启 ClickHouse。
- 与迁移前基线对比指标,验证一致性。
- 恢复后台任务与数据摄取。
整合多个 ZooKeeper 集群:官方 converter 只支持一对一,合并需要改转换器源码(反序列化快照、重算 numChildren 避免节点 ID 冲突、写入目标目录)。
ACL:支持 world/auth/digest。完全加密或完全未加密可以直接转换;部分加密需要先给超级管理员授权,再用 setAcl -R 清除受影响 path 的 ACL。
部分元数据只存在 ZooKeeper 里,不迁移就会丢,例如 Distributed DDL 队列、RBAC 数据。
迁移后调优
| 参数 | 默认 | 建议 | 说明 |
|---|---|---|---|
max_requests_batch_size | 100 | 10000 | 分片多时增大 |
force_sync | true | false | 异步写日志,提高吞吐 |
compress_logs | false | true | 压缩 Raft 日志,减少磁盘 I/O |
compress_snapshots_with_zstd_format 默认为 true。
硬限制
- 混合 ZooKeeper/Keeper quorum 不支持,两者共识协议不同。
- 快照/日志格式与 ZooKeeper 不兼容。
- 不建议超过 3 个 Keeper 节点(不含 observer):节点越多 leader 重选越慢、提交更慢,拖慢插入与 DDL,性能未必更好甚至更差,还更耗资源。
- Keeper 版本无需与 ClickHouse server 版本一致。
async_replication 升级注意
async_replication 是 Keeper 内部的 RAFT 复制优化,25.10 起默认开启,不改变 Replicated 表的语义。
从 的/ready` 端点,供 Kubernetes 探针使用。
- 支持用磁盘存快照、日志、状态文件,可用
s3_plain/s3/local。 - system 表:
system.zookeeper、system.zookeeper_connection、system.zookeeper_connection_log、system.zookeeper_log;26.1+ 有system.zookeeper_info和 Keeper HTTP API/dashboard。
项目信息 / 参考
- 官方 Keeper 指南:
- 替代 ZooKeeper 说明:
- Altinity KB:
- NuRaft:
- Altinity operator CHK 示例: