- 什么是快照以及在哪里可以找到它们
- 问题会如何表现
- 可能的恢复策略 及其各自的含义
Keeper 快照概述
什么是快照?
在哪里可以找到快照?
/var/lib/clickhouse/coordination/snapshots/;如果你在 keeper_server.xml 文件中通过 snapshot_storage_path 指定了自定义路径,则会存储在那里。快照名称按递增编号命名 (例如 snapshot.23) ,编号越大表示快照越新。
对于多节点集群,每个 Keeper 节点都有各自的快照目录。
各节点上的快照保持一致性对于恢复至关重要。
Keeper 损坏快照的关键症状和表现
日志指示:
在诊断快照损坏之前,请检查 Keeper 日志 中是否存在特定错误模式:
从损坏的 Keeper 快照中恢复
- 停止所有 Keeper 节点,防止进一步损坏
- 将整个协调目录复制到安全位置,备份所有内容
- 验证集群的 quorum,确保至少有一个节点保存了完好的数据
1. 从现有备份中恢复
- Keeper 元数据或快照损坏,导致当前数据无法恢复。
- 存在一个 Keeper 状态已知正常的备份。
- 找到最新的备份,并验证其元数据一致性。
- 关闭 ClickHouse 和 Keeper 服务。
- 用备份目录中的快照和日志替换损坏的快照和日志。
- 重启 Keeper 集群,并验证元数据同步是否正常。
2. 回滚到较早的快照
- 最近的快照已损坏,但较早的快照仍可使用。
- 增量日志完好,可用于一致性恢复。
- 从 Keeper 目录中找到并选择一个有效的较早快照 (例如
snapshot.19) 。 - 删除较新的快照和日志。
- 重启 Keeper,使其重放日志以重建元数据状态。
3. 使用 SYSTEM RESTORE REPLICA 恢复元数据
- Keeper 元数据丢失或损坏,但表数据仍存在于磁盘上
- 由于缺少 ZooKeeper/Keeper 元数据,表已切换为只读模式
- 你需要根据本地可用的数据分区片段在 Keeper 中重建元数据
-
验证表数据是否存在于本地的 clickHouse-server 数据路径中,该路径由 config 中的
<path>配置项指定。 (默认为/var/lib/clickhouse/data/) - 对于每个受影响的表,执行:
- 进行数据库级恢复时 (如果使用 Replicated 数据库引擎) :
- 等待同步完成:
- 通过检查
system.replicas中的is_readonly = 0并监控system.detached_parts,验证恢复是否成功
工作原理
SYSTEM RESTORE REPLICA 会先分离所有现有 parts,在 Keeper 中重建元数据 (就像这是一个新的空表一样) ,然后再重新附加所有 parts。这样可以避免通过网络重新下载数据。4. 在 Keeper 中删除并重建副本元数据
- 错误仅发生在集群中的某一个副本上,且该副本在 Keeper 中的元数据已损坏或不一致
- 你遇到类似 “Part XXXXX intersects previous part YYYYY” 的错误
- 你需要在保留本地数据的同时,彻底重置某个副本在 Keeper 中的元数据
- 在受影响的副本上,对该表执行 detach:
- 从 Keeper 中删除该副本的元数据 (可在任意副本上执行) :
- 重新附加该表 (将以只读模式附加) :
- 恢复副本元数据:
- 与其他副本同步:
- 恢复后检查所有副本上的
system.detached_parts
- 停止 ClickHouse server
- 创建恢复标志:
- 启动 ClickHouse server
- 服务器会自动删除该标志,并恢复所有复制表
- 监控日志,查看恢复进度
5. 重建 Keeper 集群
- 没有可用于恢复的有效快照、日志或备份。
- 需要重建整个 Keeper 集群及其元数据。
- 完全停止 ClickHouse 和 Keeper 集群。
- 清理快照和日志目录,以重置每个 Keeper 节点。
- 将一个 Keeper 节点初始化为 leader,然后逐步添加其他节点。
- 如果外部记录中有可用信息,请重新导入元数据。