ZooKeeper上数据错乱导致ClickHouse启动失败问题
问题现象
ClickHouse集群中某实例节点启动失败,该实例节点启动日志中有如下类似报错信息:
2021.03.15 21:01:19.816593 [ 11111 ] {} <Error> Application: DB::Exception: The local set of parts of table DEFAULT.lineorder doesn't look like the set ofdoesn't look like the set of parts in ZooKeeper: 59.99 million rows of 59.99 million total rows in filesystem are suspicious. There are 30 unexpected parts with 59986052 rows (14 of them is not just-written with 59986052 rows), 0 missing parts (with 0 blocks).: Cannot attach table `DEFAULT`.`lineorder` from metadata file ... : while loading database
原因分析
使用ClickHouse过程中,ClickHouse实例异常场景下,重复创建集群ReplicatedMergeTree引擎表,后续又进行删除表等操作导致ZooKeeper上的数据异常,致使ClickHouse启动失败。
解决办法
- 备份问题节点数据库下所有表数据到其他目录。
- 备份表数据:
cd /srv/BigData/data1/clickhouse/data/数据库名
mv 表名 待备份的目录/data1
如果存在多磁盘的场景,需要对data1到dataN的磁盘数据都执行相同的备份操作。
例如,下面是备份default数据库下的表lineorder数据到/home/backup目录下。
cd /srv/BigData/data1/clickhouse/data/default
mv lineorder /home/backup/data1
cd /srv/BigData/data1/clickhouse_path/metadata
mv lineorder.sql /home/backup
- 备份表数据:
- 登录MRS Manager页面,选择“集群 > 服务 > ClickHouse > 实例”,选择对应的实例节点,单击“启动实例”,完成实例启动。
- 实例启动成功后,使用ClickHouse客户端登录问题节点。
clickhouse client --host clickhouse实例IP --user 用户名 --password 密码
- 执行以下命令获取当前表所在的ZooKeeper路径zookeeper_path和对应节点所在的副本编号replica_num。
SELECT zookeeper_path FROM system.replicas WHERE database = '数据库名' AND table = '表名';
SELECT replica_num,host_name FROM system.clusters;
- 执行以下命令连接ZooKeeper命令行界面。
zkCli.sh -server ZooKeeper所在节点的IP:2181
- 找到对应故障节点表数据对应的ZooKeeper路径。
ls zookeeper_path/replicas/replica_num
- 执行以下命令,删除ZooKeeper上的副本数据。
deleteall zookeeper_path/replicas/replica_num
- 使用ClickHouse客户端登录问题节点,重新执行create创建集群ReplicatedMergeTree引擎表。
clickhouse client --host clickhouse实例IP --multiline --user 用户名 --password 密码
CREATE TABLE 数据库名.表名 ON CLUSTER 集群名
...
ENGINE = ReplicatedMergeTree ...
其他副本节点有如下提示表已经存在的报错信息,属于正常现象,可以忽略。
Received exception from server (version 20.8.7): Code: 57. DB::Exception: Received from x.x.x.x:9000. DB::Exception: There was an error on [x.x.x.x:9000]: Code: 57, e.displayText() = DB::Exception: Table DEFAULT.lineorder already exists. (version 20.8.11.17 (official build)).
建表成功后问题节点上表数据会自动进行同步,数据恢复完成。