ClickHouse 冷热分层
冷热分层是 ClickHouse 集群的一项存储成本优化能力,可将访问频率较低的历史数据从本地盘自动或手动迁移到 BOS 对象存储(冷数据),近期高频访问的热数据仍保留在本地 SSD,在保证近期数据查询性能的同时显著降低历史数据的存储成本。冷数据的查询对使用者透明,无需改写 SQL。本文介绍如何在控制台为 ClickHouse 集群开启冷热分层,以及开启后如何让表的数据按冷热策略落到 BOS。
一、功能简介
- 热数据:写入后先落在集群本地盘(卷
main,对应本地磁盘default/data1.2..n),查询快。 - 冷数据:超过设定期限或手动指定的分区,迁移到 BOS(卷
cold,对应对象存储磁盘bos_disk_cached),成本低;查询时按需从 BOS 回源,并带本地缓存加速。 - 开启冷热分层后,集群上会出现一个名为
hot_cold_bos的存储策略,使用者通过给表指定这个策略来启用冷热能力。 - 仅支持
MergeTree系列表引擎。
二、开启冷热分层(前端操作)
2.1 新建集群时开启冷热分层
注意:集群版本需在26.2.8或以上
1.新建集群时打开冷热分层开关
2.选择存储桶,如果没有存储桶则可以点击创建BOS Bucket去BOS页面创建属于自己的存储桶 填入ak/sk,然后校验ak/sk权限 3.其余配置与创建普通ClickHouse集群相同
2.2 存量集群开启冷热分层
1.在集群详情页冷热分层项处点击开启
2.填好相关信息并校验通过可以,便可以点击确认开启 注意:开启冷热分层能力会导致后端服务重启,请谨慎操作
2.3 修改 BOS 访问密钥(AK/SK)
1.在集群详情页点击修改密钥
2.填入新的ak/sk,点击校验访问权限没问题后,勾选我已了解上述影响,点击保存即可 注意:修改密钥会导致后端服务重启,请谨慎操作。
三、开启后如何使用冷热策略
开启冷热分层只是让集群具备了 hot_cold_bos 存储策略,数据不会自动就变冷——需要在建表或改表时把表接入这个策略,并指定"什么数据算冷、何时落冷"。
3.1 核心概念
-
存储策略(storage policy):
hot_cold_bos,包含两个卷。main:热数据卷,落本地盘。新写入的数据默认落在这里。cold:冷数据卷,落 BOS。
- 落冷的两种方式:按 TTL 自动迁移(推荐),或手动把指定分区迁到冷卷。
- 表必须分区(
PARTITION BY),冷热迁移以分区为单位进行。
3.2 新建表:接入冷热分层
新建表时用 SETTINGS storage_policy = 'hot_cold_bos' 把表接入冷热策略。
3.2.1 按 TTL 自动落冷(推荐)
用 TTL ... TO VOLUME 'cold' 声明"数据到期后自动迁到冷卷",之后无需人工干预。
1CREATE TABLE db.tbl
2(
3 `d` Date,
4 `id` UInt64,
5 `s` String
6)
7ENGINE = MergeTree
8PARTITION BY toYYYYMM(d) -- 必须分区
9ORDER BY id
10TTL d + INTERVAL 30 DAY TO VOLUME 'cold' -- 超过 30 天的分区自动落 BOS
11SETTINGS storage_policy = 'hot_cold_bos';
说明:
TTL表达式基于表里的日期/时间列。上例表示某行的d过了 30 天后,其所在分区会被后台迁到cold卷(BOS)。- 迁移由后台异步执行,不阻塞写入与查询;不会精确到秒,到期后的下一轮后台合并/检查时才搬迁。
- TTL 只决定"何时从热变冷",冷数据仍可正常查询。
3.2.2 手动把分区移到冷存
不想用 TTL、想自己控制时机时,可手动迁移指定分区:
1-- 把某个分区从本地盘移到 BOS 冷卷
2ALTER TABLE db.tbl MOVE PARTITION '202601' TO VOLUME 'cold';
3
4-- 如需从冷卷移回本地热盘
5ALTER TABLE db.tbl MOVE PARTITION '202601' TO VOLUME 'main';
分区值要用建表时
PARTITION BY的实际取值。例如PARTITION BY toYYYYMM(d)的分区值形如'202601';PARTITION BY d(按天)的分区值形如'2026-01-15'。
3.3 存量表接入冷热分层
已有数据的表,先切换到冷热存储策略,再配置 TTL 或手动搬迁历史分区。
3.3.1 切换存储策略
1ALTER TABLE db.tbl MODIFY SETTING storage_policy = 'hot_cold_bos';
只能从"原策略"切换到一个包含原策略全部磁盘的新策略。
hot_cold_bos的main卷就是原来的本地盘(default/data1),因此从默认策略切过来是允许的;切换本身不会移动已有数据,只是让表以后可以使用cold卷。
3.3.2 让存量数据落冷
切换策略后,存量分区仍在本地盘,需要用下面任一方式让它们落冷:
- 加 TTL 自动落冷(存量 + 未来数据统一按期限迁移):
1ALTER TABLE db.tbl MODIFY TTL d + INTERVAL 30 DAY TO VOLUME 'cold';
- 执行后,已经超期的存量分区会在后台逐步迁到冷卷。
- 手动搬迁指定历史分区(精确控制哪些分区落冷):
1ALTER TABLE db.tbl MOVE PARTITION '202512' TO VOLUME 'cold';
3.4 查询冷数据(对使用者透明)
冷数据的查询无需任何特殊语法,和平时一样 SELECT 即可——ClickHouse 会自动判断分区在本地盘还是 BOS,冷分区按需从 BOS 回源读取。首次读取后会在本地缓存,重复查询同一段冷数据会更快。
1SELECT count(), sum(id) FROM db.tbl WHERE d = '2025-12-01'; -- 命中冷分区时自动回源
3.5 查看数据落在哪个盘
用系统表确认某张表的分区当前在热盘还是冷卷:
1SELECT
2 partition, -- 分区
3 disk_name, -- default/data1=本地热盘;bos_disk_cached=BOS 冷卷
4 rows,
5 formatReadableSize(bytes_on_disk) AS size
6FROM system.parts
7WHERE database = 'db' AND table = 'tbl' AND active
8ORDER BY partition;
disk_name为bos_disk_cached表示该分区已落 BOS。- 查看集群可用的磁盘与策略:
SELECT * FROM system.disks;、SELECT * FROM system.storage_policies WHERE policy_name = 'hot_cold_bos';
四、注意事项与限制
- 仅
MergeTree系列引擎支持冷热分层;非 MergeTree 表无法使用hot_cold_bos策略。 - 表必须分区:冷热迁移以分区为最小单位,未分区的表无法按分区落冷。
- 冷数据查询会有额外延迟:从 BOS 回源比读本地盘慢,适合放访问频率低的历史数据;高频查询的近期数据应留在热盘。
- 存储桶绑定后不可更换:一个集群开启冷热后绑定的 BOS 桶不能改;只能更新访问密钥(AK/SK)。
- AK/SK 建议使用仅授权目标桶的子用户凭证,避免使用可访问账号下其他桶的高权限凭证。
- 冷热能力依赖特定的 ClickHouse 版本,请在支持的版本上使用(控制台会对不支持的版本隐藏/拦截开启入口)。
五、常见问题(FAQ)
- 开启了冷热分层,但数据没变冷?
开启只是让集群具备 hot_cold_bos 策略,还需要给表指定该策略并配置 TTL 或手动 MOVE PARTITION(见第三章)。只建表不配 TTL、也不手动搬迁,数据会一直留在热盘。
- 怎么确认某个分区真的落到 BOS 了?
查 system.parts,disk_name 为 bos_disk_cached 即表示已落 BOS(见 3.5)。
- 冷数据能移回热盘吗?
可以,用 ALTER TABLE ... MOVE PARTITION ... TO VOLUME 'main'。
- 改了 AK/SK 会影响已落 BOS 的冷数据吗?
不影响。桶与数据路径不变,仅更新访问凭证;更新后集群会重启生效,已落冷的数据继续可读。
- 删表会删掉 BOS 上的冷数据吗?
会。DROP TABLE 会清理该表在 BOS 上对应的对象,不会留下孤儿数据。
评价此篇文章






