不小心把clickhouse的数据文件删了,还可以恢复吗?

我相信对于想要在生产环境使用clickhouse的童鞋来说,肯定会关注数据存储可靠性的问题,要实现这个目的常用的三种方法:

  1. 底层磁盘做RAID : 这个方法就和CH本身没关系了,属于硬件层面的保护机制
  2. 利用CH提供的ReplicatedMergeTree引擎做多副本的存储,这是本文要关注的重点,稍后详细来说
  3. 定期做数据的备份,需要还原时手动执行命令进行导入,这种方式详见前文

下文将要描述的均是在做了副本的前提下,还是老样子,我们用问答的方式来开启探索之旅吧~~

Q1: 单刀直入吧,就说不小心把数据文件删了,能不能恢复呢?

答案肯定是能的,但前提就是我上面说的用ReplicatedMergeTree引擎做了副本,且副本数据没有损坏。

Q2: 会自动恢复吗?还是需要执行什么命令?

额,我只能说是半自动的,因为如果你不小心删了一个parts目录下的bin文件,系统是不会自动检测出来的,除非你重启服务(我想大多数情况下我们肯定不愿意这样做。。)。那什么时候检测呢?当你再次select查询该表的时候,就会立即触发检测,第一次select查询会给你抛出一个异常,提示该块对应的文件找不到了,如下图:
在这里插入图片描述
再次查询就不会报错了,当然你也在这个本地表里查不到丢失的数据了,那你这不是骗人吗?不是说可以自动恢复的吗?别急,因为你急也没有用,因为CH在后台已经检测出来数据丢失了,它会将数据恢复的任务丢到一个队列里,但是它不会马上去执行队列里的任务,而是会等一段时间,具体多长时间我也不确定,我这边的观察是大概等了十分钟,再去查丢失的数据的时候发现数据已经恢复了。那我必须等这么长时间吗?能不能马上触发自动恢复呢?很遗憾,我没有找到相应的方法,如果有哪位朋友知道,欢迎留言~~

Q3: 那你怎么知道后台有任务在排队执行呢?

两种方法:

  1. 一是看日志/var/log/clickhouse-server/clickhouse-server.log,再次查询的时候能看到ReplicatedMergeTreePartCheckThread的日志 在这里插入图片描述
  2. 查看系统表system.replication_queue

Q4: 稍微深入一点儿吧,它怎么判断我文件损坏的呢?

那肯定是离不开你的zookeeper兄弟呀,zookeeper里记录了每个分片和副本的元数据信息,检查线程会比较本地文件与zk上的元数据是否一致,如果不一致,就会将之前的parts目录移动到detached目录下,并将parts目录名加上前缀broken,并往队列里写入一个后台任务,告诉它从副本节点上去取。这个任务在真正被调用的时候呢,就会向副本节点发起请求,从远端把丢失的数据拷贝回来。

这是有zk的情况下,万一zk不工作了呢?还是会检查到,但这次它把parts目录移动到detached目录下之后,加的前缀变成了unexpected,这个时候就不会有后台任务被提交了,也就没有办法自动恢复了。

总结

简单总结一下吧,丢失数据恢复的三个条件:

  1. 该表使用了ReplicatedMergeTree引擎
  2. zookeeper正常工作
  3. 副本文件在此期间没有损坏

满足上述三个条件,你的数据就会多一分安全了~~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

普普通通程序猿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值