故障分析 | ClickHouse 集群分布式 DDL 被阻塞案例一则

文章讲述了在ClickHouse 19.7.3集群中,遇到分布式DDL任务超时的问题,通过诊断发现是优化表操作卡住,影响后续任务。解决方法包括重命名表、手动执行本地DDL和降级数据同步策略。建议升级到20.x版本以避免类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:任坤

现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1、背景

线上有套10节点clickhouse集群,5分片 * 2副本,版本19.7.3。

开发执行一个创建分布式表的操作,9个节点都成功返回,有个节点报错,返回信息如下:

Code: 159. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Wa
tching task /clickhouse/task_queue/ddl/query‐0003271440 is executing longer
than distributed_ddl_task_timeout (=180) seconds. There are 1 unfinished ho
sts (0 of them are currently active), they are going to execute the query i
n background.

2、诊断

登录该节点查看show processlist,正在执行1个分布式ddl,该ddl已经运行100多个小时,应该是卡住了。

clickhouse的分布式ddl是串行执行的,每次将任务存储到zookeeper
的/clickhouse/task_queue/ddl目录,按照FIFO排列。

对于每个节点,只有当前的ddl执行完毕,后面的才能被调用。

select * from zookeeper where path='/clickhouse/task_queue/ddl' order by ctime desc\G

刚刚发起的创建分布式表ddl排在第一位,上述截图中的optimize table排在第23,说明被其阻塞的ddl有22条之多,开发也确认最近两天的ddl任务在该节点上都没有成功。

尝试将其kill,等待几个小时仍然没有效果。

加sync关键字,直接卡住。

尝试重启ck实例也卡住,最后只能Kill -9。

重启实例后该任务依然存在,而且执行了10多分钟没有要结束的意思,kill操作仍然无效。

既然这个ddl无法绕过,执行的时候又长时间不结束,只能曲线救国,重命名该表让其临时消失一会。

rename table log_catch_data_local to log_catch_data_local1;

optimize table当即返回,并且其后22个ddl也很快执行完毕,最后再将其重命名回原表。

此时再次执行optimize table,只需5s便成功返回,该问题解决。

3、总结

clickhouse的分布式ddl在每个节点是FIFO串行执行的,任意1个ddl卡住了都会阻塞后续任务。

本例中的卡住的ddl是optimize table,可以通过重命名表跳过;如果是增删列,可以在rename后手工对该表执行本地ddl。

如果上述方法都不行,可以在出问题的节点将本地表直接drop,等待所有阻塞ddl执行完毕后,重新创建1个空表,会自动从另一个副本中同步数据。

最后,19.x版本已经很旧了,我们在使用过程中遭遇了各种问题,要尽快升级到20.x系列

<think>嗯,用户问的是在搭建ClickHouse的三分片两副本时,创建数据库超时,可能的原因是什么。我需要先回忆一下ClickHouse分布式架构相关的内容。首先,三分片两副本通常涉及到多个节点,每个分片有两个副本,可能使用ReplicatedMergeTree引擎。创建数据库的时候超时,可能涉及到网络问题、配置错误或者资源不足。 首先,网络连接问题应该考虑。节点之间需要互相通信,如果防火墙设置阻止了端口访问,或者节点之间的网络延迟太高,可能导致超时。比如,ClickHouse默认使用9000端口进行通信,如果这个端口被阻塞,节点之间无法同步,创建数据库的命令就会超时。 然后是配置问题。用户的集群配置是否正确?比如在metrika.xml或者config.xml中的集群定义是否正确,分片和副本的地址是否准确。如果配置中的某个节点地址写错了,或者端口不对,也会导致连接超时。另外,ZooKeeper的配置是否正确也很关键,因为ReplicatedMergeTree需要ZooKeeper来协调副本之间的数据同步。如果ZooKeeper集群连接不上,或者会话超时设置太短,也可能引发问题。 资源不足也是一个可能的原因。比如,ZooKeeper集群负载过高,无法及时处理请求,或者ClickHouse节点本身的内存、CPU资源不足,导致响应变慢。此外,磁盘空间不足也可能影响数据库的创建,但通常创建数据库本身不会占用太多空间,除非有初始数据写入。 另外,副本之间的同步问题。创建数据库时,如果某个副本无法正常启动或者同步,可能会导致超时。需要检查副本节点的日志,看是否有错误信息。比如,副本之间版本不一致,或者数据目录权限问题,导致无法写入。 还有可能是DDL查询的超时设置。ClickHouse分布式DDL查询默认超时时间可能不够,尤其是当集群规模较大或者网络较慢时。可以通过修改distributed_ddl_task_timeout参数来增加超时时间。 用户可能没有正确配置分布式表或者复制表,导致创建数据库时涉及的表无法正确在集群中同步。比如,使用ReplicatedMergeTree引擎但没有正确指定ZooKeeper的路径,或者副本的标识符重复,导致冲突。 另外,检查一下ClickHouse的版本是否一致,不同版本之间的兼容性问题可能导致通信失败。所有节点应使用相同的主要版本,避免版本差异引起的问题。 还有可能是DNS解析的问题,如果配置中使用的是主机名而非IP地址,而某些节点无法解析主机名,导致连接超时。这时候可以检查/etc/hosts文件或者DNS服务器配置是否正确。 总结下来,可能的原因包括网络问题、配置错误、ZooKeeper问题、资源不足、同步问题、超时设置、版本兼容性和DNS解析等。用户需要逐一排查这些方面,查看ClickHouse的错误日志,检查ZooKeeper的状态,验证网络连通性,调整超时参数等。</think>在ClickHouse中搭建3分片2副本集群时,创建数据库超时的常见原因及排查步骤如下: --- ### 一、网络通信问题(最高频原因) 1. **节点间端口不通** - 检查所有节点的`9000`(默认TCP端口)和`8123`(HTTP端口)是否开放 - 使用命令验证:`telnet <节点IP> 9000` 或 `curl http://<节点IP>:8123/ping` 2. **防火墙/安全组拦截** - 确认所有节点间双向开放端口 - 检查iptables规则:`iptables -L -n` - 云服务器需检查安全组策略 --- ### 二、ZooKeeper配置问题(关键依赖) 1. **ZooKeeper集群状态** - 执行`echo stat | nc <zk_ip> 2181`检查ZK健康状态 - 确认`config.xml`中ZK配置正确: ```xml <zookeeper> <node index="1"> <host>zk1</host> <port>2181</port> </node> <!-- ... --> </zookeeper> ``` 2. **ZK会话超时** - 在`config.xml`中增大超时时间: ```xml <zookeeper> <session_timeout_ms>30000</session_timeout_ms> </zookeeper> ``` --- ### 三、分布式DDL配置问题 1. **超时参数调整** - 修改`distributed_ddl_task_timeout`(默认180秒): ```sql SET distributed_ddl_task_timeout = 600 ``` 2. **任务队列堆积** - 检查系统表`system.distributed_ddl_queue` - 观察是否存在未完成的任务 --- ### 四、副本间同步故障 1. **副本状态检查** ```sql SELECT database, table, is_leader FROM system.replicas WHERE is_readonly OR is_session_expired = 1 ``` 2. **副本日志排查** - 查看节点日志:`/var/log/clickhouse-server/clickhouse-server.log` - 重点关注`Replica`/`ZK`相关错误 --- ### 五、配置错误(常见新手问题) 1. **集群定义验证** - 检查`metrika.xml`中集群配置是否匹配分片拓扑: ```xml <remote_servers> <my_cluster> <shard> <replica> <host>node1</host> <port>9000</port> </replica> <replica> <host>node2</host> <port>9000</port> </replica> </shard> <!-- 其他分片... --> </my_cluster> </remote_servers> ``` 2. **数据库引擎类型** - 确认使用的是`Replicated`引擎: ```sql CREATE DATABASE test ENGINE = Replicated('/clickhouse/databases/test', '{shard}', '{replica}') ``` --- ### 六、资源瓶颈 1. **系统资源监控** - 检查内存:`free -h` - 检查磁盘IO:`iostat -x 1` - 检查CPU负载:`top` 2. **文件描述符限制** - 检查设置:`ulimit -n` - 建议值:`1048576`或更高 --- ### 推荐排查路线: 1. 检查ZK集群状态 → 验证网络连通性 → 检查分布式配置 → 查看错误日志 → 调整超时参数 → 监控系统资源 通过以上步骤定位问题后,可使用以下命令测试分布式操作: ```sql SELECT * FROM remote('node1', system.one) FORMAT Vertical ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值