【clickhouse系列】为什么有空part存在

问题

有时候偶尔会发现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-1520210415_1_915_184          │      10 │
│ 2021-04-1620210416_916_6714_3257      │      10 │
│ 2021-04-1720210417_6715_12475_3136    │      10 │
│ 2021-04-1820210418_12476_18236_3134   │      10......
└────────────┴─────────────────────────────┴────────┴───────┘

解决方法

这其实是个bug(5491),在20.12版本修复并增加删除空part的新功能。但是在升级前要先清理掉全部空part,因为新版本在启动时会尝试扫描并删除,当同一张表的不同副本开始同时删除空part时,会出现问题(23292)。所以可以按照一下两个步骤进行升级:

  1. 升级前先删除空分区,以减少系统中的空部件数量

    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';                                 │
    └────────────────────────────────────────────────────────────────────────────────────────────┘
    
  2. 一次升级/重新启动一个副本(在一个分片中)

    如果一个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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只努力的微服务

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

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

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

打赏作者

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

抵扣说明:

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

余额充值