如何解决ClickHouse的表处于只读状态

在使用ClickHouse的过程中,经常会遇到某个副本的表A处于readonly状态,无法更新数据。

<Error> executeQuery: Code: 242, e.displayText() = DB::Exception: Table is in readonly mode

原因:说是zookeeper的压力大(建议data和log分开存储到不同的磁盘),metadata元数据丢失。

此时通常有两种解决办法:

1)创建一个和该表A结构相同的表A',然后将数据从A表导入到A',多个副本A'的数据会自动同步,以后使用A'表,涉及使用A表的地方都需要修改为A'表;

2)DEATCH掉A表,重新创建A表,但此时数据不会自动同步,需要人工从其它副本A表导入。

查询哪些副本表处于readonly状态:

select table,zookeeper_path,replica_path from `system`.replicas where is_readonly

对于第二种方法,若DEATCH失败,则只能将该节点停止,并备份该节点的数据(如:mv /var/clickhouse /var/clickhouse_bak),重新启动该节点,会自动创建/var/clickhouse目录,创建新的数据库(如:ksdb),并在此库基础上ATTACH/Create table和Create view(相当于重建节点),然后让集群自动从其他节点同步数据,若无法自动同步,则需要手工进行从其他副本导入。

附1:ATTACH语句案例

--ATTACH 语句

ATTACH TABLE ksdb.client_local (
`userid` String,
 `name` String,
 `type` String,
 `timestamp` Date DEFAULT toDate(now())
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{shard}/client_local', '{replica}') PARTITION BY toYYYYMM(timestamp) ORDER BY userid SETTINGS index_granularity = 8192;

附2: 手工导入语句案例

insert into ksdb.client_local select * from remote('192.168.242.152:9000',ksdb.client_local)

补充第三种解决办法,只重建处于readonly状态的当前表:

#通用方式,在当前节点
#删除表数据
rm -rf  clickhouse/data/database名/表名
#删除表元数据
rm -rf clickhouse/metadata/database名/表名.sql
#./zkCli.sh 连接ZooKeeper,删除其分片对应的副本
rmr /clickhouse/tables/分片名/表名/replicas/副本名
#删除以上数据后,重启该节点,重新CREATE TABLE,数据会自动从其它副本同步过来
#举例如下:
rm -rf  clickhouse/data/ksdb/client_local
rm -rf clickhouse/metadata/ksdb/client_local.sql
./zkCli.sh
rmr /clickhouse/tables/152-01/client_local/replicas/worker1

总结:

第一种方法:数据能自动同步,但需要修改表名,对应用程序不友好;

第二种方法:若DETACH成功,则比较方便;若DETACH失败,则需要重建节点;

第三种方法:是最优的一种方法,只能针对当前处于readonly状态的表,不用改名,也不用重建节点,但要注意不要删错了。

<think>好的,我现在需要解决用户关于ClickHouse集群状态查看的问题。用户提到他们的环境是3分片2副本,共3台机器,搭建完成后想了解如何查看集群状态和副本数,以及相关命令和预期结果。首先,我需要回忆一下ClickHouse中相关的系统以及常用的命令。 首先,我记得ClickHouse提供了几个系统,可以用来查询集群和副本的信息。比如system.clusters,里面应该包含集群名称、分片信息、副本的hostname、端口等。用户可能需要查询这个来确认所有节点是否正常注册到集群中。 接下来,副本数的确认可能需要结合system.replicas。这个记录了每个副本的状态,包括数据库、名、是否正常等信息。但需要注意,system.replicas是针对Replicated系列引擎的,所以如果用户使用了ReplicatedMergeTree这样的引擎,这个才会有数据。 另外,用户可能还需要检查zookeeper中的元数据,但直接查询zookeeper可能比较复杂,所以应该推荐使用ClickHouse内置的查询语句。比如使用SELECT * FROM system.zookeeper WHERE path = '/clickhouse' 来查看zookeeper中的路径是否存在,但具体路径可能需要根据用户的配置来调整。 然后,我需要考虑用户可能遇到的问题,比如副本状态不正常、分片配置错误等。所以在解释命令结果时,需要指出哪些字段是关键,比如is_active、zookeeper_exception等,这些能帮助用户判断副本是否健康。 还需要提醒用户,如果集群配置在config.xml或者metrika.xml中是否正确,因为如果配置错误,即使查询system.clusters也可能显示不正确。所以在检查命令之前,用户应该先确认配置文件是否正确,特别是像<remote_servers>部分的分片和副本定义。 另外,用户搭建的是3分片2副本,但只有3台机器,这可能意味着每个分片有2个副本分布在不同的机器上,但需要确保同一分片的副本不在同一台机器上。不过这可能属于配置问题,但用户现在关注的是如何查看状态,所以可能不需要深入讨论,除非查询结果出现异常。 最后,总结一下步骤:首先用system.clusters查看集群结构,确认所有节点是否存在;然后用system.replicas检查每个副本状态;再通过system.zookeeper确认连接是否正常;可能还需要举例说明每个命令的示例输出,并解释关键字段的含义,这样用户能对照自己的结果进行验证。</think>在ClickHouse中查看集群状态和副本信息,可以通过以下系统及命令逐步操作: --- ### **一、查看集群拓扑结构** ```sql SELECT * FROM system.clusters WHERE cluster = '你的集群名称'; ``` #### **关键字段说明**: - `cluster`:集群名称(需与配置文件中一致) - `shard_num`:分片编号 - `shard_weight`:分片权重 - `replica_num`:副本编号 - `host_name`:节点域名/IP - `port`:TCP通信端口 - `is_local`:当前节点是否属于本地(1=是,0=否) #### **预期结果示例**: ``` ┌─cluster─────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name───┬─port─┬─is_local─┐ │ your_cluster│ 1 │ 1 │ 1 │ ch-server1 │ 9000 │ 1 │ │ your_cluster│ 1 │ 1 │ 2 │ ch-server2 │ 9000 │ 0 │ │ your_cluster│ 2 │ 1 │ 1 │ ch-server2 │ 9000 │ 0 │ │ your_cluster│ 2 │ 1 │ 2 │ ch-server3 │ 9000 │ 0 │ │ your_cluster│ 3 │ 1 │ 1 │ ch-server3 │ 9000 │ 0 │ │ your_cluster│ 3 │ 1 │ 2 │ ch-server1 │ 9000 │ 0 │ └─────────────┴───────────┴──────────────┴─────────────┴─────────────┴──────┴──────────┘ ``` *若结果行数与预期不符(3分片×2副本=6行),需检查配置文件中的分片定义。* --- ### **二、检查副本状态** ```sql SELECT database, table, is_leader, is_readonly, is_session_expired, zookeeper_exception FROM system.replicas; ``` #### **关键字段说明**: - `is_leader`:是否是主副本(1=是,0=否) - `is_readonly`:副本是否处于只读模式(异常时可能为1) - `is_session_expired`:与ZooKeeper的连接是否断开(正常应为0) - `zookeeper_exception`:ZooKeeper异常信息(正常为空字符串) #### **预期结果示例**: ``` ┌─database─┬─table───────┬─is_leader─┬─is_readonly─┬─is_session_expired─┬─zookeeper_exception─┐ │ default │ test_table │ 1 │ 0 │ 0 │ │ │ default │ test_table │ 0 │ 0 │ 0 │ │ └──────────┴─────────────┴───────────┴─────────────┴────────────────────┴─────────────────────┘ ``` *每个Replicated应有对应副本记录,异常副本会显示非零状态码或异常信息。* --- ### **三、验证ZooKeeper连接** ```sql SELECT * FROM system.zookeeper WHERE path = '/clickhouse'; ``` *检查ZooKeeper中ClickHouse的元数据是否存在,若返回空说明ZooKeeper配置有误。* --- ### **四、分片数据分布检查** ```sql SELECT shard_num, count() AS partitions FROM remote('集群名称', system.parts) GROUP BY shard_num; ``` *查看数据在分片间的分布情况,理想状态下各分片数据量应均衡。* --- ### **排查建议**: 1. **副本不同步**:检查`system.replicas`中`log_pointer`字段是否一致 2. **配置问题**:确认所有节点的`/etc/clickhouse-server/config.d/`中集群配置一致 3. **网络问题**:使用`telnet ch-server1 9000`验证节点间TCP连通性 通过以上命令可全面掌握集群的拓扑结构、副本健康状态及数据分布情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jacky_wxl(微信同号)

喜欢作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值