为了降低数据存储成本、提高查询性能和系统资源利用率。云数据库ClickHouse提供了冷热数据分层存储的功能。您可以根据查询频率将数据存储在不同类型的磁盘中。本文介绍如何开启冷热数据分层存储功能和设置分层存储策略。
前提条件
- 云数据库ClickHouse集群为社区兼容版且版本为20.8及以上版本。 
- 集群未开通数据备份功能。 
- 对于不支持的低版本,可以先将数据迁移至20.8及以上版本的集群,再进行冷热数据分层存储。具体请参见云数据库ClickHouse集群间的数据迁移。 
- 云数据库ClickHouse企业版基于缓存及共享存储,自动进行冷热分层。不依赖冷热数据存储规则。 
背景知识
- 热数据:访问频次较高的数据,存储在热数据盘(即创建集群时所选的ESSD云盘或高效云盘)中,满足高性能访问的需求。 
- 冷数据:访问频次较低的数据,存储在较低价的冷数据盘中,满足高性价比的存储需求。 - 冷热数据分层存储提供了两种存储策略,具体如下: - 存储策略 - 详情 - 默认存储策略 - 将新写入的数据存储在热数据盘中,提供高效查询。当热数据存储量达到业务使用阈值时,自动将当前热数据盘中占用空间最大的part数据文件移动到冷数据盘存储,从而释放热数据盘存储空间。 - TTL存储策略 - 在默认存储策略基础上,添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中。 
注意事项
- 开通冷热数据分层存储功能,请在业务低峰期进行。开通该功能后集群会立即进行重启,重启期间只能查看集群信息,无法进行升配、扩容、缩容、修改参数配置等操作。 
- 使用冷热数据分层存储功能时,需要给表指定存储策略。 - 建表时,通过 - SETTINGS storage_policy = 'hot_to_cold'指定存储策略。
- 修改存量表的存储策略。 - 2024年1月1日之后开通冷热存储策略的集群- 执行以下语句进行策略修改。 - ALTER TABLE <table_name> MODIFY SETTING storage_policy = 'hot_to_cold';- 2024年1月1日之前开通冷热存储策略的集群- 通过管控运维操作,新增冷热存储策略,让您能够使用新策略将热盘数据迁移到冷盘。 
 
- 冷热数据分层存储功能开通后,暂不支持关闭。 
计费说明
- 计费规则如下。 - 存储类型 - 计费详情 - 热数据存储 - 购买集群后,您已经拥有了热数据存储空间,与购买集群的存储空间相同。 - 冷数据存储 - 采用按量付费模式。无需提前购买固定的存储空间,先使用,后付费,并按照实际使用的存储空间每小时计费一次。 
- 冷数据存储的详细单价,请参见社区兼容版存储空间费用。 
- 计费公式:冷存储空间费用=冷数据存储单价×冷数据存储使用量×使用时长。 
- 示例:若冷数据存储单价为0.0002元/GB/小时,19:00-20:00使用冷数据存储2000 GB,则总费用为:0.0002元/GB/小时×2000 GB×1小时=0.4元。20:00-21:00释放了500 GB冷数据存储空间,实际使用了1500 GB存储空间,那么20:00-21:00的总费用为:0.0002元/GB/小时×1500 GB×1小时=0.3元。 
本示例中的价格仅用于举例,实际价格以控制台为准。
开通冷热分层存储
- 在页面左上角,选择集群所在的地域。 
- 在集群列表页面,选择社区版实例列表,单击目标集群ID。 
- 单击左侧导航栏的冷热分层存储。 
- 单击开通冷热分层存储。 
- 在弹出的冷热数据分层开启提示窗口,单击确定。 - 确定开通后,集群会进行重启。待集群状态从配置变更中变为运行中,即完成开通。 
冷热分层默认存储策略
冷热分层存储功能开通后,默认存储策略的相关参数如下表所示。
| 参数 | 说明 | 
| move_factor | 当热数据盘中的可用存储空间所占比例小于该参数时,自动将当前热数据盘中占用空间最大的part数据文件移动到冷数据盘存储。 取值范围为 说明  如何查看磁盘空间,请参见查看磁盘空间。 | 
| prefer_not_to_merge | 冷数据盘中的数据是否进行合并。取值范围如下。 
 | 
建表时设置TTL分层存储策略
在默认存储策略的基础上,添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中。
语法
TTL <time_column> + INTERVAL <number> TO DISK 'cold_disk'示例
以date列为依据,将90天之前的所有数据移动到冷数据盘。建表语句如下。
CREATE TABLE ttl_test_tbl
(
    `f1` String,
    `f2` String,
    `f3` Int64,
    `f4` Float64,
    `date` Date
)
ENGINE = MergeTree()
PARTITION BY date
ORDER BY f1
TTL date + INTERVAL 90 DAY TO DISK 'cold_disk'
SETTINGS storage_policy = 'hot_to_cold';更改TTL分层存储策略
您可以更改TTL分层存储策略的日期或日期类型的列以及间隔的时间。
注意事项
- 数据影响。 - 存量数据:默认情况下,存量数据将按照新策略进行存储,但需要时间异步处理,如需立即生效,您需更改TTL分层存储策略之后,还要执行 - ALTER TABLE materialize TTL;语句。如果您不期望更改存量数据的TTL分层存储策略,需要在更改TTL分层存储策略之前,执行- SET materialize_ttl_after_modify=0;语句。
- 增量数据:默认情况下,增量数据也将按照新策略进行存储。 
 
- 更改TTL分层存储策略后,已经进入冷数据盘中的数据不会自动移动到热数据盘。如果需要移动,请参见移动冷热数据盘的数据。 
语法
ALTER TABLE <table_name> ON CLUSTER default MODIFY TTL <time_column> + INTERVAL <number> TO DISK 'cold_disk';参数说明
| 参数 | 说明 | 
| table_name | 表名。 | 
| time_column | 目标日期或日期类型的列。 | 
| number | 间隔时间。 常用单位有:Day、Week、Month、Year。 | 
移动冷热数据盘的数据
- 移动热数据盘数据到冷数据盘。 - ALTER TABLE <table_name> ON CLUSTER default MOVE PARTITION <partition> TO DISK 'cold_disk';
- 移动冷数据盘数据到热数据盘。 - ALTER TABLE <table_name> ON CLUSTER default MOVE PARTITION <partition> TO DISK 'default';说明- partition为分区名称,您可以在system.parts系统表中查看。
查看冷热数据盘上的数据
- 查看热数据盘上的数据。 - SELECT * FROM system.parts WHERE database = '<db_name>' AND TABLE = '<tbl_name>' AND disk_name ='default' AND active = 1;
- 查看冷数据盘上的数据。 - SELECT * FROM system.parts WHERE database = '<db_name>' AND TABLE = '<tbl_name>' AND disk_name ='cold_disk' AND active = 1;
查看磁盘空间
开通冷热数据分层存储功能后,您可以执行如下语句查看磁盘空间。
SELECT * FROM system.disks;返回结果如下。
┌─name─────┬─────────path───────────────────────────┬─free_space───────────┬─total_space ─────────┬─used_space───┬─keep_free_space───┬──type──┐
│ cold_disk│ /clickhouse/data/data/disks/cold_disk/ │ 18446744073709551615 │ 18446744073709551615 │ 115312080698 │   0               │   OSS  │
│ default  │ /clickhouse/data/data/                 │ 201663209472         │ 207083249664         │ 5420040192   │   0               │  local │ 
└──────────┴────────────────────────────────────────┴──────────────────────┴──────────────────────┴──────────────┴───────────────────┴────────┘结果集列名说明如下。
| 参数 | 说明 | 
| name | 磁盘名称。 
 | 
| path | 磁盘上的数据存储路径。 | 
| free_space | 当前磁盘剩余可用空间。冷数据盘可用空间不受限制。单位:Byte。 | 
| total_space | 当前磁盘总空间。冷数据盘可用空间不受限制。单位:Byte。 | 
| used_space | 当前磁盘已经被使用的空间。单位:Byte。 | 
| keep_free_space | 预留的空闲空间。单位:Byte。 | 
| type | 存储介质。取值如下。 
 | 
常见问题
Q:数据尚未从热数据盘存储至冷数据盘的原因是什么?
A:数据是否迁至冷数据盘,取决于system.parts表中move_ttl_info.min和move_ttl_info.max的值大小。您可以使用以下语句获取二者的值。
SELECT move_ttl_info.min,move_ttl_info.max FROM system.parts WHERE database = '<db_name>'AND table = '<tb_name>'AND disk_name = 'default'如果查询结果中,当前时间小于任意一个值,则该部分数据不应被移动到冷存。也有可能是系统正在进行或准备将该数据移动至冷数据盘的操作,但操作尚未处理完毕。