这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Keeper 或 ZooKeeper 是 ClickHouse 集群的协调层,用于副本日志、块去重信息、leader 选举、分布式 DDL 队列和任务锁。
19.1 协调内容
/clickhouse
/tables
/{shard}
/table
/replicas
/replica-1
/replica-2
/leader
/blocks
/log
/task_queue
/ddl
不同版本的路径布局和实现细节可能调整,核心是保存集群协调状态,而不是业务数据。
19.2 Keeper 部署
生产建议至少三节点:
keeper-01 follower / leader
keeper-02 follower / leader
keeper-03 follower / leader
要求:
- 低延迟网络;
- SSD 和独立资源;
- 时钟同步;
- 独立监控;
- 定期备份配置;
- 不与其他大 IO 服务混部。
19.3 配置示例
<clickhouse>
<keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<raft_configuration>
<server>
<id>1</id>
<hostname>keeper-01</hostname>
<port>9234</port>
</server>
<server>
<id>2</id>
<hostname>keeper-02</hostname>
<port>9234</port>
</server>
<server>
<id>3</id>
<hostname>keeper-03</hostname>
<port>9234</port>
</server>
</raft_configuration>
</keeper_server>
</clickhouse>
ClickHouse 节点连接协调服务:
<zookeeper>
<node>
<host>keeper-01</host>
<port>9181</port>
</node>
<node>
<host>keeper-02</host>
<port>9181</port>
</node>
</zookeeper>
19.4 元数据与数据文件
ClickHouse 元数据包含:
database metadata
table create statement
column definitions
part information
replication log
access control
本地数据目录保存实际列文件和索引。恢复集群时必须同时考虑:
- 元数据;
- 数据 part;
- Keeper 路径;
- 用户权限;
- 集群配置;
- 分布式表定义。
19.5 分布式 DDL
ON CLUSTER 语句写入 DDL 队列,各节点异步执行。
查看队列:
SELECT
entry,
host,
status,
query,
exception
FROM system.distributed_ddl_queue
ORDER BY entry DESC
LIMIT 20;
常见失败:
- 节点不可达;
- 宏缺失;
- 权限不足;
- 表已存在;
- 版本不兼容;
- 磁盘满;
- Keeper 超时。
19.6 副本与 Keeper
查看副本状态:
SELECT
database,
table,
replica_name,
is_readonly,
queue_size,
absolute_delay
FROM system.replicas;
如果 Keeper 不可用:
- 已有数据仍可能可读;
- 写入和复制协调会受影响;
- 副本可能进入只读;
- DDL 可能失败;
- 集群不要在此时做拓扑变更。
19.7 四字命令
常用命令:
| 命令 | 用途 |
|---|---|
| ruok | 基本存活 |
| stat | 版本和连接概览 |
| mntr | 监控指标 |
| srvr | 服务端信息 |
| conf | 配置 |
| isro | 是否只读 |
示例:
echo mntr | nc keeper-01 9181
命令支持与安全限制依版本和安全模式而异,生产环境应只允许可信网络访问。
19.8 监控要点
| 指标 | 含义 |
|---|---|
| leader_count | leader 数量 |
| follower_count | follower 数量 |
| outstanding_requests | 积压请求 |
| avg_latency | 平均延迟 |
| max_latency | 最大延迟 |
| open_file_descriptor_count | 文件句柄 |
| disk_free_bytes | 磁盘空间 |
| alive_connections | 连接数 |
ClickHouse 侧关注:
SELECT countIf(is_readonly) AS readonly_replicas,
sum(queue_size) AS queue_size
FROM system.replicas;
19.9 故障处理
少数节点故障
多数派仍可用,替换故障节点后加入集群。
多数派不可用
协调服务不可用,此时不要盲目重启或清空数据。保护现场,恢复多数派或使用备份。
脑裂与隔离
确保 Quorum 配置正确,节点网络分区时少数派不能提供服务。跨机房部署要评估延迟和故障域。
19.10 备份与迁移
必须备份:
- Keeper 配置;
- ClickHouse config;
- users 配置;
- 元数据 SQL;
- 数据快照;
- 集群拓扑记录。
迁移 Keeper 时应:
- 逐台替换;
- 确认多数派健康;
- 观察 ClickHouse 副本状态;
- 更新连接配置;
- 保留回滚窗口。
本章小结
Keeper 是副本和集群协调的核心,故障影响写入、复制和 DDL。生产上要独立部署、监控 Quorum 和延迟,并把 Keeper 状态、ClickHouse 元数据与数据 part 作为一个整体来制定备份恢复方案。
思考题
- Keeper 保存业务数据吗?
- 为什么建议奇数节点?
- Keeper 不可用时副本会有什么表现?
- 分布式 DDL 为什么可能部分成功?
- 集群恢复为什么要同时考虑元数据和数据?