这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 副本处理节点故障,备份处理误删、逻辑错误、集群级故障和合规留存。两者不能互相替代。
21.1 需要备份的内容
| 内容 | 说明 |
|---|---|
| 表结构 | CREATE TABLE、视图、字典、权限 |
| 数据 part | 分区数据文件 |
| 配置文件 | config、users、存储策略 |
| 集群拓扑 | remote_servers、宏、Keeper 配置 |
| 任务定义 | Kafka 表、物化视图、定时任务 |
| 恢复手册 | 操作步骤和联系人 |
21.2 备份策略
| 策略 | 适合 |
|---|---|
| 分区 FREEZE | 单机或小规模自管 |
| clickhouse-backup | 常用工具链 |
| 对象存储快照 | 云环境或冷备 |
| 远程集群复制 | 灾备环境 |
| 元数据加数据目录 | 自定义恢复 |
备份级别:
全量:每周或每周期
增量:新分区、新 part
元数据:高频或每次变更
21.3 FREEZE
冻结分区:
ALTER TABLE analytics.events_local
FREEZE PARTITION '202608';
指定备份名称:
ALTER TABLE analytics.events_local
FREEZE PARTITION '202608' WITH NAME 'daily_20260825';
冻结不是备份完成。还需要把冻结目录同步到独立存储:
rsync -a /var/lib/clickhouse/shadow/daily_20260825/ \
backup-host:/backup/clickhouse/daily_20260825/
21.4 恢复分区
准备恢复表结构后,将备份 part 放入 detached 目录,再 ATTACH。
ALTER TABLE analytics.events_local
ATTACH PART 'part_name';
也可以使用 clickhouse-backup 等工具恢复完整表。关键校验:
SELECT count() FROM analytics.events_local;
SELECT event_date, count(), sum(amount)
FROM analytics.events_local
GROUP BY event_date;
21.5 元数据备份
导出建表语句:
SELECT database, table, create_table_query
FROM system.tables
WHERE database = 'analytics';
导出权限:
SELECT * FROM system.users;
SELECT * FROM system.roles;
SELECT * FROM system.grants;
具体系统表字段因版本而异。权限也可以通过访问控制目录备份,但恢复前要确认版本兼容。
21.6 clickhouse-backup
常用流程:
clickhouse-backup create daily_20260825
clickhouse-backup upload daily_20260825
clickhouse-backup list remote
clickhouse-backup download daily_20260825
clickhouse-backup restore daily_20260825
工具版本必须与 ClickHouse 版本和部署方式匹配。生产使用前要在测试环境验证:
- 大分区备份耗时;
- 对线上 IO 影响;
- 对象存储凭据;
- 恢复速度;
- 权限和配置恢复;
- 集群表恢复语义。
21.7 分布式集群恢复
本地表和 Distributed 表要分别处理:
1. 恢复 Keeper 或确认新 Keeper
2. 恢复 ClickHouse 配置和宏
3. 恢复本地表结构
4. 恢复各分片本地数据
5. 恢复分布式表定义
6. 校验行数和指标
7. 恢复写入链路
如果分片数量或路由变化,需要重新规划数据分布,不能直接恢复到不一致拓扑。
21.8 Kafka 链路恢复
Kafka 引擎表恢复前要确认:
- topic 保留期;
- consumer group 位点;
- 物化视图是否重建;
- 数据边界;
- 重复消费处理;
- 死信队列。
常见选择:
| 方案 | 说明 |
|---|---|
| 从备份时间点继续 | 需要位点可恢复 |
| 从 Kafka earliest 重放 | 可能重复 |
| 从上游补数 | 需要幂等 |
| 接受缺失 | 通常只适合可丢数据 |
21.9 恢复演练
备份必须定期演练:
1. 搭建隔离环境
2. 恢复元数据
3. 恢复数据
4. 校验行数和指纹
5. 执行核心报表
6. 记录耗时
7. 更新恢复手册
8. 检查权限和配置
21.10 故障场景
| 故障 | 恢复来源 |
|---|---|
| 单副本磁盘损坏 | 健康副本 |
| 误删分区 | 备份 |
| 错误 UPDATE | 备份或上游重放 |
| 元数据损坏 | 元数据备份 |
| 集群级故障 | 灾备环境 |
| 依赖组件故障 | Kafka 或上游补数 |
本章小结
备份要覆盖表结构、数据、配置、权限和恢复步骤。FREEZE 适合理解原理,生产常用工具和对象存储体系化处理。备份的价值由恢复演练证明,没有演练过的备份不能视为可用。
思考题
- 为什么副本不能替代备份?
- FREEZE 后还需要做什么?
- 分布式集群恢复有哪些步骤?
- Kafka 链路如何处理重放和重复?
- 如何验证恢复后的数据正确性?