问题
有时候偶尔会发现ClickHouse会存在许多空part,并且一直不会被删除。一般是因为为表设置了TTL的问题,早期版本会保留空part,查询part也会返回0行。
SELECT
partition,
name,
active,
rows
FROM system.parts
WHERE (table = 'query_log') AND active
┌─partition──┬─name────────────────────────┬─active─┬──rows─┐
│ 2021-04-15 │ 20210415_1_915_184 │ 1 │ 0 │
│ 2021-04-16 │ 20210416_916_6714_3257 │ 1 │ 0 │
│ 2021-04-17 │ 20210417_6715_12475_3136 │ 1 │ 0 │
│ 2021-04-18 │ 20210418_12476_18236_3134 │ 1 │ 0 │
......
└────────────┴─────────────────────────────┴────────┴───────┘
解决方法
这其实是个bug(5491),在20.12版本修复并增加删除空part的新功能。但是在升级前要先清理掉全部空part,因为新版本在启动时会尝试扫描并删除,当同一张表的不同副本开始同时删除空part时,会出现问题(23292)。所以可以按照一下两个步骤进行升级:
-
升级前先删除空分区,以减少系统中的空部件数量
SELECT concat('alter table ', database, '.', table, ' drop partition id \'', partition_id, '\';') FROM system.parts WHERE active GROUP BY database, table, partition_id HAVING count() = countIf(rows = 0) ┌─concat('alter table ', database, '.', table, ' drop partition id \'', partition_id, '\';')─┐ │ alter table system.query_log drop partition id '20210417'; │ │ alter table system.query_log drop partition id '20210416'; │ │ alter table system.query_log drop partition id '20210415'; │ │ alter table system.query_log drop partition id '20210418'; │ └────────────────────────────────────────────────────────────────────────────────────────────┘ -
一次升级/重新启动一个副本(在一个分片中)
如果一个shard只有一个副本正在清理空part,则不会导致死锁。重启一个副本,等待复制队列处理完毕,再重启下一个副本。
补充:
也可以通过配置remove_empty_parts = 0来禁止删除空零件。
$ cat /etc/clickhouse-server/users.d/remove_empty_parts.xml
<yandex>
<profiles>
<default>
<remove_empty_parts>0</remove_empty_parts>
</default>
</profiles>
</yandex>
421

被折叠的 条评论
为什么被折叠?



