为了降低数据存储成本、提高查询性能和系统资源利用率。云数据库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.000026美元/GB/小时,19:00-20:00使用冷数据存储2000 GB,则总费用为:0.000026美元/GB/小时×2000 GB×1小时=0.052美元。20:00-21:00释放了500 GB冷数据存储空间,实际使用了1500 GB存储空间,那么20:00-21:00的总费用为:0.000026美元/GB/小时×1500 GB×1小时=0.039美元。
本示例中的价格仅用于举例,实际价格以控制台为准。
开通冷热分层存储
在页面左上角,选择集群所在的地域。
在集群列表页面,选择社区版实例列表,单击目标集群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'
如果查询结果中,任意一个值未超过当前时间,则该部分数据不应被移动到冷存。也有可能是系统正在进行或准备将该数据移动至冷数据盘的操作,但操作尚未处理完毕。