文档首页/ MapReduce服务 MRS/ 故障排除/ 使用ClickHouse/ ZooKeeper上数据错乱导致ClickHouse启动失败问题
更新时间:2023-11-30 GMT+08:00
分享

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启动失败。

解决办法

  1. 备份问题节点数据库下所有表数据到其他目录。

    • 备份表数据:

      MRS 3.0.5及之前版本

      cd /srv/BigData/data1/clickhouse/data/数据库名

      mkdir -p 备份目录/data1

      mv {表名} 备份目录/data1/

      MRS 3.1.0及之后版本

      head -1 /srv/BigData/data1/clickhouse_path/metadata/库名/表名.sql | awk -F ' ' '{print $5}' | sed "s/'//g" 获取到目标的UUID

      cd /srv/BigData/data1/clickhouse/store/{UUID前3个字符}

      mkdir -p 备份目录/data1

      mv {UUID} 备份目录/data1/

      如果存在多磁盘的场景,需要对data1dataN的磁盘数据都执行相同的备份操作。

    • 备份元数据信息:

      cd /srv/BigData/data1/clickhouse_path/metadata/库名

      mv 表名.sql 备份目录

    例如,下面是备份default数据库下的表lineorder数据到/home/backup目录下。

    cd /srv/BigData/data1/clickhouse/data/default

    mkdir -p /home/backup/data1

    mv lineorder /home/backup/data1

    cd /srv/BigData/data1/clickhouse_path/metadata

    mv lineorder.sql /home/backup

  2. 登录MRS Manager页面,选择“集群 > 服务 > ClickHouse > 实例”,选择对应的实例节点,单击“启动实例”,完成实例启动。
  3. 实例启动成功后,使用ClickHouse客户端登录问题节点。命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。

    clickhouse client --host clickhouse实例IP --user 用户名 --password 密码

  4. 执行以下命令获取当前表所在的ZooKeeper路径zookeeper_path和对应节点所在的副本编号replica_num

    SELECT zookeeper_path FROM system.replicas WHERE database = '数据库名' AND table = '表名';

    SELECT replica_num,host_name FROM system.clusters;

  5. 执行以下命令连接ZooKeeper命令行界面。

    zkCli.sh -server ZooKeeper所在节点的IP:2181

    获取ZooKeeper的IP地址,具体请参考如何获取ZooKeeper地址?

  6. 找到对应故障节点表数据对应的ZooKeeper路径。

    ls zookeeper_path/replicas/replica_num

    zookeeper_path为4中查询到的zookeeper_path值。

    replica_num为4中节点主机对应的副本编号replica_num的值。

  7. 执行以下命令,删除ZooKeeper上的副本数据。

    deleteall zookeeper_path/replicas/replica_num

  8. 使用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)).

    建表成功后问题节点上表数据会自动进行同步,数据恢复完成。

相关文档