为了降低数据存储成本、提高查询性能和系统资源利用率,云数据库ClickHouse社区兼容版和企业版的ESSD_L1、ESSD_L2存储类型支持开启冷热数据分层存储的功能,支持您根据数据的访问频率将冷热数据分别存储在不同类型的存储介质中。本文介绍如何开启冷热数据分层存储功能和设置分层存储策略。
前提条件
社区兼容版
版本为20.8及以上版本。
集群未开通数据备份功能。
对于不支持的低版本,可以先将数据迁移至20.8及以上版本的集群,再进行冷热数据分层存储。具体请参见云数据库ClickHouse社区兼容版集群间的数据迁移。
企业版
集群存储类型为ESSD_L1或ESSD_L2。如需使用该存储类型,请提交工单联系技术支持开通白名单。
背景知识
冷热数据分层存储将数据按访问频率分为两类:
热数据:访问频次较高的数据,存储在热数据盘(即创建集群时所选的ESSD云盘或高效云盘)中,满足高性能访问的需求。
冷数据:访问频次较低的数据,存储在较低价的冷数据盘中,满足高性价比的存储需求。
冷热数据分层存储的存储策略,具体如下:
社区兼容版
存储策略 | 详情 |
默认存储策略 | 将新写入的数据存储在热数据盘中,提供高效查询。当热数据存储量达到业务使用阈值时,自动将当前热数据盘中占用空间最大的part数据文件移动到冷数据盘存储,从而释放热数据盘存储空间。 |
TTL存储策略 | 在默认存储策略基础上,添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中。 |
企业版
基于全局TTL实现冷热数据分层,可将不再变化的数据自动转储至费用较低的OSS中,以降低使用费用。
全局TTL:企业版通过配置全局TTL控制数据的冷热分层。
转储时刻:开启冷热数据分层存储功能后,系统将在每天的UTC+0时刻扫描全部数据文件,并将创建时长超过全局TTL的数据part从热数据盘转储到冷数据盘(OSS)。
注意事项
社区兼容版
开通冷热数据分层存储功能,请在业务低峰期进行。开通该功能后集群会立即进行重启,重启期间只能查看集群信息,无法进行升配、扩容、缩容、修改参数配置等操作。
使用冷热数据分层存储功能时,需要给表指定存储策略。
建表时,通过
SETTINGS storage_policy = 'hot_to_cold'指定存储策略。修改存量表的存储策略。
2024年1月1日之后开通冷热存储策略的集群
执行以下语句进行策略修改。
ALTER TABLE <table_name> MODIFY SETTING storage_policy = 'hot_to_cold';2024年1月1日之前开通冷热存储策略的集群
通过管控运维操作,新增冷热存储策略,让您能够使用新策略将热盘数据迁移到冷盘。
冷热数据分层存储功能开通后,暂不支持关闭。
企业版
冷存储中的数据在发生变化时(如主动下发Mutation、Optimize等操作,或系统基于规则触发的Merge操作),需要重新加载至热存中完成数据文件重建。新建的数据文件不会立刻进入冷存储,而是在创建时长再次超过全局TTL后才会重新转储。因此建议尽量避免对冷数据进行频繁的新增、删除或修改操作。
转储并非立即完成,系统会依据当前存储系统的访问压力等情况动态调整转储速率,根据待转储数据量可能需要几小时完成。
修改TTL的生效规则:
调大TTL:将在修改完成后的第一个转储时刻生效,但不会将已转储到冷存储的数据重新转回热存储。
调小TTL:将在修改完成后的第一个转储时刻生效。
全局TTL的最小值为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元。
本示例中的价格仅用于举例,实际价格以控制台为准。
开通冷热分层存储
社区兼容版
登录云数据库ClickHouse控制台,在页面左上角,选择集群所在的地域。
在集群列表页面,选择社区版实例列表,单击目标集群ID。
单击左侧导航栏的冷热分层存储。
单击点击开通冷热分层存储。
在弹出的提示窗口中,单击确定。
确定开通后,集群会进行重启。待集群状态从配置变更中变为运行中,即完成开通。
企业版
云数据库 ClickHouse 企业版请先提交工单联系技术支持添加冷热分层存储白名单,再按照以下操作步骤开通目标集群的冷热分层存储功能。
登录云数据库ClickHouse控制台,在页面左上角,选择集群所在的地域。
在集群列表页面,选择企业版实例列表,单击目标集群ID。
单击左侧导航栏的冷热分层存储。
单击点击开通冷热分层存储。
在弹出的提示窗口中,配置全局TTL。
单击确定。
待集群状态变为运行中,冷热分层存储页面展示为已开启,即开启成功。
开启后,可单击运行参数值中的编辑按钮调整全局TTL,新的TTL将于下个转储周期(次日UTC+0)生效。
社区兼容版冷热分层存储策略管理
冷热分层默认存储策略
冷热分层存储功能开通后,默认存储策略的相关参数如下表所示。
参数 | 说明 |
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'如果查询结果中,当前时间小于任意一个值,则该部分数据不应被移动到冷存。也有可能是系统正在进行或准备将该数据移动至冷数据盘的操作,但操作尚未处理完毕。