暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse 三分片两副本集群磁盘损坏故障分析与恢复文档

IT那活儿 2026-06-26
59

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!

文档基础信息

  • 集群架构:三分片两副本(3 分片 × 2 副本)
  • 部署主机3 台
  • 故障节点192.168.100.12
  • 故障原因数据盘物理损坏,更换新磁盘
  • 丢失分片shard1、shard3
  • 业务影响无中断、无数据丢失
  • 恢复方式从健康副本自动同步数据
  • 恢复结果数据完整恢复,副本状态正常

集群部署结构

  • 192.168.100.10 :shard1、shard2
  • 192.168.100.11 :shard2、shard3
  • 192.168.100.12 :shard3、shard1
副本分布:
  • shard1 副本
    192.168.100.10、192.168.100.12
  • shard2 副本
    192.168.100.10、192.168.100.11
  • shard3 副本
    192.168.100.11、192.168.100.12

故障描述

3.1 故障现象
  • 192.168.100.12 数据盘物理损坏,无法正常读写;
  • 更换新磁盘后,节点本地数据目录为空;
  • 该节点上 shard1、shard3 两个分片数据全部丢失;
  • 故障节点直接重建库表时报错:副本已存在,无法创建。
3.2 故障根因
192.168.100.12 数据盘硬件损坏,无法修复,需更换新磁盘,导致本地数据及分片副本丢失。

故障恢复

4.1 恢复过程
1)正常节点获取建库、建表语句
在正常运行的副本节点执行:
sql
show create database db_name;
show create table table_name;

记录查询结果中的库、表创建语句。
2)故障节点尝试重建库表(报错处理
在故障节点 192.168.100.12 执行上述建库、建表语句,报错如下:
plaintext
Received exception from server (version 22.3.2):
Code253DB::ExceptionReceived from *.*.*.*:9000. DB::ExceptionReplica /clickhouse/tables/my_cluster_name/db_name/user_info_local/02/replicas/my_cluster_name-02-2 already exists. (REPLICA_IS_ALREADY_EXIST)

3)故障节点查看宏信息
在故障节点执行,确认本机副本标识:
sql
select * from system.macros;

查询结果示例:
plaintext
┌─macro───┬─substitution─────────┐
│ cluster │ my_cluster_name │
│ replica │ my_cluster_name-02-2 │
│ shard │ 02                   │
└─────────┴──────────────────────┘

4)正常节点生成副本清理命令
在正常副本节点执行,生成清理 ZK 路径命令:
sql
select concat('SYSTEM DROP REPLICA ''副本名'' FROM ZKPATH ','''',zookeeper_path,'''',';'from system.replicas where database in ('pd');

命令输出示例:
plaintext
SYSTEM DROP REPLICA 'clickhouse-2-1' FROM ZKPATH '/clickhouse/pd/tables/1-2/gateway_logs';
SYSTEM DROP REPLICA 'clickhouse-2-1' FROM ZKPATH '/clickhouse/pd/tables/1-2/plugin_logs';
SYSTEM DROP REPLICA 'clickhouse-2-1' FROM ZKPATH '/clickhouse/pd/tables/1-2/summary_per_5m';

5)故障节点清理 ZK 残留副本信息
修改上述命令,将副本名替换为故障节点实际副本名(my_cluster_name-02-2),在故障节点执行:
sql
SYSTEM DROP REPLICA 'my_cluster_name-02-2' FROM ZKPATH '/clickhouse/tables/my_cluster_name/db_name/user_info_local/02';

6)故障节点重新创建库表
在故障节点重新执行第一步记录的建库、建表语句,创建完成后数据自动从健康副本同步。
4.2 恢复验证
  • 查看副本状态,确认 is_replica_active=1queue_size=0
  • 对比故障节点与健康节点数据行数、分区、数据块一致;
  • 新写入数据可正常同步至所有副本;
  • 节点重启无异常,无报错日志。
4.3 故障恢复技术原理
  • 报错原因
    更换磁盘后本地数据丢失,但 ZooKeeper 中仍保留故障副本元数据,导致元数据与本地数据冲突,无法重建表。
  • 清理 ZK 副本作用
    执行 SYSTEM DROP REPLICA 命令,删除 ZooKeeper 中失效副本信息,解除冲突,允许重新创建副本。
  • 自动恢复原理
    集群为三分片两副本架构,所有分片均存在健康副本;故障节点重建表后,ReplicatedMergeTree 引擎自动连接 ZooKeeper,获取数据块清单,对比本地缺失数据后,从同分片健康副本全量拉取数据块,自动完成数据校验与同步,最终副本激活加入集群。
本次故障因 192.168.100.12 数据盘物理损坏更换新盘,导致该节点 shard1、shard3 两个分片数据丢失,因 ZooKeeper 残留副本元数据导致重建表失败。通过清理 ZooKeeper 失效副本信息、重建库表,依托 ReplicatedMergeTree 副本自动同步机制,实现无数据丢失、无业务中断恢复。

END


本文作者:刘杰厚 (上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论