如何将ClickHouse异步插入待处理.bin文件存储至外部SSD
解决方案:转移ClickHouse Distributed异步插入待处理数据至外部存储
核心原理
Distributed表的异步插入待处理.bin文件,默认存储在ClickHouse数据目录的对应分片队列目录中。通过自定义存储策略(storage_policy),可以指定这类数据存储到外部SSD或对象存储,替代启动盘。
步骤1:定义存储策略
编辑ClickHouse主配置文件(如/etc/clickhouse-server/config.xml)或conf.d下的自定义配置文件,添加存储策略配置:
场景1:外部SSD存储
<storage_configuration> <disks> <!-- 定义外部SSD磁盘 --> <external_ssd_disk> <path>/mnt/external_ssd/clickhouse_data/</path> </external_ssd_disk> </disks> <policies> <!-- 定义用于Distributed队列的存储策略 --> <distributed_queue_policy> <volumes> <external_volume> <disk>external_ssd_disk</disk> </external_volume> </volumes> </distributed_queue_policy> </policies> </storage_configuration>
场景2:对象存储(以S3为例)
如果用S3作为存储后端,磁盘配置替换为:
<disks> <s3_queue_disk> <type>s3</type> <endpoint>https://your-s3-endpoint/</endpoint> <access_key_id>your-access-key</access_key_id> <secret_access_key>your-secret-key</secret_access_key> <bucket>clickhouse-distributed-queue</bucket> <path>async_queue/</path> </s3_queue_disk> </disks>
策略部分依然使用distributed_queue_policy,将磁盘指定为s3_queue_disk即可。
配置完成后,重启ClickHouse服务使配置生效:
sudo systemctl restart clickhouse-server
步骤2:为Distributed表绑定存储策略
针对已存在的Distributed表
执行ALTER语句修改表设置:
ALTER TABLE your_distributed_table MODIFY SETTING storage_policy = 'distributed_queue_policy';
针对新建的Distributed表
在创建语句中直接指定存储策略:
CREATE TABLE your_distributed_table ( -- 表结构定义 id UInt64, event_time DateTime ) ENGINE = Distributed(your_cluster_name, your_database, local_target_table, id) SETTINGS storage_policy = 'distributed_queue_policy';
步骤3:迁移现有累积数据(可选)
如果启动盘上已有大量待处理的.bin文件,可手动迁移至新存储路径:
- 停止ClickHouse服务:
sudo systemctl stop clickhouse-server - 找到Distributed表的原有队列目录(通常在
/var/lib/clickhouse/data/your_database/your_distributed_table/下,包含shardX_replicaY子目录) - 将这些子目录复制到新存储路径的对应表数据目录下
- 调整新路径的权限:
chown -R clickhouse:clickhouse /mnt/external_ssd/clickhouse_data/ - 删除原启动盘上的旧队列目录(避免占用空间)
- 重启ClickHouse服务:
sudo systemctl start clickhouse-server
步骤4:验证配置
执行以下SQL确认表的存储策略已生效:
SELECT name, storage_policy FROM system.tables WHERE name = 'your_distributed_table';
同时检查新的异步插入产生的.bin文件是否出现在外部SSD或S3的指定路径中。
注意事项
- 确保外部存储路径拥有ClickHouse进程的读写权限
- 使用S3时,需保证ClickHouse节点能正常访问S3端点,且密钥具备bucket的读写权限
- 存储策略修改后,新的异步插入任务会自动使用新路径,旧数据需手动迁移或等待ClickHouse处理完成后自动清理
内容的提问来源于stack exchange,提问作者Anuraj Jain
相关产品推荐
相关产品推荐

