我们可能经常会遇到 ClickHouse 磁盘写满的情况,这个时候除了删数据之外还可以考虑添加一块新的磁盘,让 ClickHouse 可以往新的磁盘那写入数据。ClickHouse 本身就支持配置各类存储策略,可以实现条带化、冷热分离、多存储卷顺序写入等不同的存储策略。
当前我们只针对于多个对等磁盘的空间扩容问题进行磁盘的添加。
那么添加新的磁盘其实就相当于利用多个卷的的顺序写入这种策略来实现,从而达到添加数据卷的效果,只是我们不创建新的表,而是直接修改原有数据表的存储策略,不过有一些限制,这些是 ClickHouse 为了保证数据的安全,这些限制后面会提到。
多存储卷配置建议 ClickHouse 版本在 22 以上。
首先我们在 ClickHouse 启动时至少会有一块默认的盘和卷,比如我们默认的数据目录为 /data/clickhouse/
,此时 ClickHouse 也会生成默认的存储策略,名称就叫 default
,我们可以执行下面的 SQL 查看:
SELECT * FROM system.disks
SELECT * FROM system.storage_policies
可以看到默认的磁盘和默认的策略都是 default
。
然后我们需要挂载好新的盘,假设新的数据目录为 /data2/clickhouse/
,那么我们需要在配置文件中添加存储策略的配置:
<storage_configuration>
<disks>
<data2>
<path>/data2/clickhouse/</path>
<keep_free_space_bytes>10485760</keep_free_space_bytes>
</data2>
</disks>
<policies>
<multidisk_storage>
<volumes>
<!-- 对于扩容的话,这里名称必须用 default -->
<default>
<disk>default</disk>
</default>
<volume2>
<disk>data2</disk>
</volume2>
</volumes>
<move_factor>0.1</move_factor>
</multidisk_storage>
</policies>
</storage_configuration>
在上面的配置中,我们在 disks
中添加了 data2
表示新的磁盘,注意其中的 path
一定要以 /
结尾,表示这是一个目录。
然后在 policies
中我们添加了 multidisk_storage
存储策略,在 volumes
中指定多个卷,第一个是 default
也就是原有的卷,后面的 volume2
是后来添加的卷。注意第一个名称必须为 default
,不能为其他的名字,否则后面无法对现有表修改存储策略。
然后 move_factor
表示移动 part 的因子,也就是说当一个卷的可用空间不足 10% 时,ClickHouse 会将其中的 part 移动到下一个卷中。
然后配置后直接保存正常就可以生效了,如果有多个节点要同步配置文件,保证每个节点的表都可以扩容。
然后再使用上面的 SQL 查看磁盘和策略就可以看到我们刚添加的配置了,然后我们对 MergeTree 表修改存储策略:
ALTER TABLE <db>.<table> MODIFY SETTING storage_policy='multidisk_storage'
# 可以使用 ON CLUSTER 对每个节点的表都进行修改
ALTER TABLE <db>.<table> ON CLUSTER <cluster_name> MODIFY SETTING storage_policy='multidisk_storage'
修改的时候如果我们上面的存储策略中第一个卷的名称不是 default
,那么这个时候就会报错:
New storage policy `default` shall contain volumes of old one. (BAD_ARGUMENTS)
也就是说我们最新的存储策略必须包含原来的 default
卷,要不然之前的数据就没了,所以 ClickHouse 在这里进行了限制。
修改之后如果第一个卷的空间剩余不足 10%,那么 ClickHouse 就会将其中的 part 自动的转移到第二个卷中,实时写入的数据也会流向第二个卷,查询的时候会同时查询多个卷的数据,所以数据的完整性不会受到影响。
Reference: