Skip to content

Clickhouse 高频删除数据导致 Cannot allocate memory.

今天突然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 。状态为正常状态。

最后发现官方暂无相关的问题解决。

分析原因:

  1. 排除zookeeper 连接问题
  2. 排除zookeeper 可用性问题(都是可用状态、选举正常)
  3. 排除内存不足问题

错误基本卡在 同一张表下,且与zookeeper 同步有极大的关系。

苦于官方无相关的issue.

基于对clickhouse的基本理解,可以通过移出相关的表(zookeeper就不需要同步了,当然存在同步数据风险),在进行恢复来进行修复。

解决方法:

  1. mkdir ~/ckbak/ –创建备份目录
  2. mv ~/[clickhouse数据目录]/data/[dbname]/[table]  ~/ckbak/ –移动数据库表文件夹到备份目录
  3. mv ~/[clickhouse数据目录]/data/[dbname]/[分布table]  ~/ckbak/ –移动数据库表文件夹到备份目录
  4. mv ~/[clickhouse数据目录]/metadata/[dbname]/[table].sql ~/ckbak/  –移动数据库表结构到备份目录
  5. mv ~/[clickhouse数据目录]/metadata/[dbname]/[分布table].sql ~/ckbak/  –移动数据库表结构到备份目录
  6. 重启clickhouse数据库  -这个时候就跳过了zookeeper的验证
  7. 确认重启成功
  8. 恢复数据 

恢复数据夜可以通过,恢复到其他的数据库中通表名。

例如:(这种情况针对分布表 被损坏)

  1. 创建恢复数据库,create database recovery;
  2. 拷贝数据文件夹[table]到 ~/[clickhouse数据目录]/data/recovery 文件夹下
  3. 选择数据库use recovery;之后 执行~/[clickhouse数据目录]/metadata/[dbname]/[table].sql
  4. 每台实例重复上述操作
  5. 删除原数据
  6. 通过SQL重建之前的表,及分布表
  7. 将每个实例的回复库种的数据去重候插入回原表(分布表)。

途径问题页面

https://github.com/yandex/ClickHouse/issues/5064
https://blog.csdn.net/dong120f/article/details/81356361

One Comment

  1. jjzz jjzz

    优秀~跟博主遇到了相同的问题,找了好多好多技术文档,都是在说zookeeper的配置之类的

jjzz进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注