大家知道 MergeTree 是以分区目录的形式组织数据的,只要每写入一次数据,就会在磁盘上创建一个新分区文件(parts)。随着时间的推移,相同分区的文件会被合并成一个,关于这一块的逻辑可以看我的早期文章,《传送门》。
所以当运行一段时间以后,每张 MergeTree 的目录下就会有许多类似下面的分区文件目录:
query_log % ls -l
total 8
drwxr-xr-x 11 nauu staff 352 9 18 2021 202109_1_102_22
drwxr-xr-x 11 nauu staff 352 11 25 2021 202110_103_188_19
drwxr-xr-x 11 nauu staff 352 11 28 00:56 202111_189_299_23
drwxr-xr-x 11 nauu staff 352 2 16 21:36 202202_300_322_7
drwxr-xr-x 11 nauu staff 352 3 5 14:39 202202_323_326_1
drwxr-xr-x 11 nauu staff 352 3 5 15:14 202203_327_362_8
drwxr-xr-x 2 nauu staff 64 9 17 2021 detached
-rw-r----- 1 nauu staff 1 9 17 2021 format_version.txt
ClickHouse 服务重启的时候,就会逐个扫描 MergeTree 下面的这些分区目录,重新加载元数据。
所以在生产系统中, 如果 MergeTree 下面的分区目录很多,就会严重影响它的启动速度,这也是一直以来 ClickHouse 的一个痛点。
不过现在这种情况已经得到了解决,就是利用下面这项PR特性:
https://github.com/ClickHouse/ClickHouse/pull/32928
在 ClickHouse 的新版本中已经内嵌了 RocksDB,会将 MergeTree 的元数据信息缓存在 RocksDB 中,当 ClickHouse 服务启动的时候,会先从 RocksDB 加载元数据,当缓存失效的时候才会穿透到磁盘读取,所以性能大幅加强。
按照 PR 提交的测试结果,对于一张拥有 70W parts 的MergeTree 来说,加载性能从原来的 70分钟 提升到 20秒,可谓是质的飞跃了。
本文分享自 ClickHouse的秘密基地 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!