今天突然clickhouse数据库发生错误,核心错误如下:
void DB::DDLWorker::run(): Code: 999, e.displayText() = Coordination::Exception: All connection tries failed while connecting to ZooKeeper. Addresses: 10.xxx.xx.xxx:2181, 10.xxx.xx.xxx:2181, 10.xxx.xx.xxx:2181
经过对日志的排查,发现是因为clickhouse删除语句造成的。这边大概在短时间内发送了几千条同一张表的删除语句。并且使用了 ON CLUSTER 进行集群删除。
经过free 指令查询内存发现还剩余几十G内存。
继续排查 zookeeper 。状态为正常状态。
最后发现官方暂无相关的问题解决。
分析原因:
- 排除zookeeper 连接问题
- 排除zookeeper 可用性问题(都是可用状态、选举正常)
- 排除内存不足问题
错误基本卡在 同一张表下,且与zookeeper 同步有极大的关系。
苦于官方无相关的issue.
基于对clickhouse的基本理解,可以通过移出相关的表(zookeeper就不需要同步了,当然存在同步数据风险),在进行恢复来进行修复。
解决方法:
- mkdir ~/ckbak/ –创建备份目录
- mv ~/[clickhouse数据目录]/data/[dbname]/[table] ~/ckbak/ –移动数据库表文件夹到备份目录
- mv ~/[clickhouse数据目录]/data/[dbname]/[分布table] ~/ckbak/ –移动数据库表文件夹到备份目录
- mv ~/[clickhouse数据目录]/metadata/[dbname]/[table].sql ~/ckbak/ –移动数据库表结构到备份目录
- mv ~/[clickhouse数据目录]/metadata/[dbname]/[分布table].sql ~/ckbak/ –移动数据库表结构到备份目录
- 重启clickhouse数据库 -这个时候就跳过了zookeeper的验证
- 确认重启成功
- 恢复数据
恢复数据夜可以通过,恢复到其他的数据库中通表名。
例如:(这种情况针对分布表 被损坏)
- 创建恢复数据库,create database recovery;
- 拷贝数据文件夹[table]到 ~/[clickhouse数据目录]/data/recovery 文件夹下
- 选择数据库use recovery;之后 执行~/[clickhouse数据目录]/metadata/[dbname]/[table].sql
- 每台实例重复上述操作
- 删除原数据
- 通过SQL重建之前的表,及分布表
- 将每个实例的回复库种的数据去重候插入回原表(分布表)。
途径问题页面
https://github.com/yandex/ClickHouse/issues/5064
https://blog.csdn.net/dong120f/article/details/81356361
优秀~跟博主遇到了相同的问题,找了好多好多技术文档,都是在说zookeeper的配置之类的