ClickHouse问题分析:非复制表ALTER TABLE xxx MODIFY 一直卡住

举报
ZhjDayDayUp 发表于 2021/12/09 17:55:22 2021/12/09
【摘要】 记录下常见的一些问题,这里讲述的是ALTER TABLE xxx MODIFY时出现客户端卡住的问题。

问题现象

客户建立MergeTree引擎的表,然后执行ALTER TABLE xxx MODIFY yyy,接着看到客户端一直卡住不动。

日志有如下打印:

Current max source part size for mutation is 46814673454 but part size 112917848106. Will not mutate part 202109_1970568_2268982_19. Max size depends not only on available space, but also on settings 'number_of_free_entries_in_pool_to_execute_mutation' and 'background_pool_size'

问题分析

ALTER TABLE流程

首先,了解下ALTER TABLE的整个流程,见分析:https://bbs.huaweicloud.cn/blogs/313733

非复制表的流程比较简单,clickhouse会等待某个alter table操作结。在等待的过程中主要有两个条件:

1、mutation_wait_event事件的触发

waitForMutation会一直等待,直到被通知,再判断是否满足解除等待条件。而通知事件是在这里触发的:mutateSelectedPart --> updateMutationEntriesErrors。而进入mutateSelectedPart的条件是有需要被mutate的part。

2、mutation_wait_event事件的触发后解除阻塞的条件

三个条件满足一条就可以(见waitForMutation)

!mutation_status || mutation_status->is_done || !mutation_status->latest_fail_reason.empty()

正常情况下,第一个和第三个条件都是false的,主要看第二个条件,表示该mutation是否已经完成。

根因分析

看下日志的报错,可见,有些part没有被选上,那么对于mutation_status->is_done这个条件就无法满足,因为只有所有的part都做了订正操作后,它才会被置为true(见getIncompleteMutationsStatus)。


那么,为什么会有part没有被选上呢?

报错中也说了,磁盘空间不够了。但是,其实在clickhouse中这个磁盘空间是有自己的一套计算方式的(getMaxSourcePartSizeForMutation),跟实际的磁盘空间和设置有关系。


其实,通过分析getMaxSourcePartSizeForMutation这个函数,可以发现,如果业务量很大的情况下,可能会导致计算结果为0或者很小。

后遗症

1、相同表的数据不一致

你卡住了,那你得想办法把他停止吧,一停止的话,就表明有些part是没有修改成功的,这就导致表的数据不一致了。

2、可能影响到数据的合并

同一个分区内的part,有些有mutation,有些没有,在merge时,可能无法满足merge条件,而导致无法合并。

比如:current_mutations_by_version包含的mutation有100,200,211,212。而part有202109_10_205_10和202109_206_210_10_212(其中就是因为alter失败导致没有mutation number)。这两个part就无法正常合并。

3、如果数据都无法正常合并了,那TTL自然就无法生效了

总结

ALTER TABLE的操作千万不要在业务量大的情况下搞啊。
真的操作了就祈祷不要失败吧

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。