ClickHouse单副本宕机时ZooKeeper操作日志保留时长及恢复同步问题
ClickHouse ReplicatedMergeTree ZK日志保留与副本恢复同步解答
1. ZK操作日志的保留规则
ReplicatedMergeTree在ZK /log 路径下存储的操作日志不会永久保留,保留时长由两个ClickHouse服务端配置共同决定,没有固定的统一有效期:
- 最少保留条数由
merge_tree_replicated_logs_to_keep控制,默认值为1000,即无论日志生成时间多久,至少会保留最近1000条操作日志。 - 最长保留时长由
merge_tree_replicated_log_max_age控制,默认值为7天,即超过该时长的日志,只要当前保留的日志总数大于merge_tree_replicated_logs_to_keep的阈值,就会被清理。
注意:日志清理动作由活跃的ClickHouse副本主动触发,不是ZK自带的TTL能力。实际保留时长是两个配置共同作用的结果:如果写入频率极高,1天就产生2000条日志,那么超出1000条的旧日志即使仅生成1天也会被清理;如果写入频率极低,7天仅产生500条日志,所有日志会保留满7天才会被清理。
2. ZK日志清理后副本恢复的同步逻辑
如果宕机副本恢复时,ZK上留存的最早日志序号已经大于该副本最后同步的日志序号,也不会出现数据不一致的问题,副本会走兜底的块同步流程完成数据对齐:
- 副本启动后首先上报本地所有数据块(Part)的校验和、版本信息到ZK的对应
/blocks路径,和集群其他健康副本的已提交数据块列表做对比。 - 筛选出本地缺失、校验和不匹配、版本落后的数据块,直接从其他健康副本下载完整的数据块,不需要依赖ZK的历史操作日志。
- 补全所有缺失数据的同时,副本会同步合并、突变等未完成的任务状态,确保本地操作和集群状态一致。
- 所有数据对齐完成后,副本恢复正常服务,继续拉取新的ZK日志做增量同步。
只要集群中至少存在一个持有完整数据的健康副本,宕机恢复的副本就可以自动完成全量同步,不需要人工介入。
内容的提问来源于stack exchange,提问作者wxl356
相关产品推荐
相关产品推荐

