为了降低海量数据存储成本,云数据库ClickHouse提供了冷热数据分层存储的功能。

背景知识

  • 热数据:访问频次较高的数据,存储在热数据盘(即创建实例时所选的ESSD云盘或高效云盘)中,满足高性能访问的需求。
  • 冷数据:访问频次较低的数据,存储在较低价的冷数据盘中,满足高性价比的存储需求。
  • 冷热数据分层存储提供了两种存储策略,具体如下:
    • 默认存储策略:将新写入的数据存储在热数据盘中,提供高效查询。当热数据存储量达到业务使用阈值时,自动将最早写入热数据盘的数据移动到冷数据盘存储,从而释放热数据盘存储空间。
    • TTL分层存储策略:在默认存储策略基础上,添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中。

注意事项

  • 该功能适用于20.8.7.15及以上版本。对于不支持的版本,可以先将数据迁移至20.8.7.15及以上版本的实例,再进行冷热数据分层存储。具体请参见云数据库ClickHouse实例间的数据迁移
  • 冷热数据分层存储功能开通时,实例会进行重启。
  • 如果要使用冷热数据分层存储功能,必须在建表时添加SETTINGS storage_policy = 'hot_to_cold';语句指定存储策略。
  • 存储策略一旦指定,后期无法更改。
  • 冷热数据分层存储功能开通后,暂不支持关闭。

计费说明

  • 计费规则如下。
    • 热数据存储:购买集群后已经拥有了热数据存储空间,与购买集群的存储空间相同。
    • 冷数据存储:采用按量付费模式。无需提前购买固定的存储空间,先使用,后付费,并按照实际使用的存储空间每小时计费一次。
  • 计费公式:每小时费用=冷数据存储单价×冷数据存储使用量。
  • 示例:若冷数据存储单价为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元。
说明 本示例中的价格仅用于举例,实际价格以控制台为准。关于冷数据存储价格,具体请参见规格及定价

操作步骤

  1. 登录云数据库ClickHouse控制台
  2. 在页面左上角,选择实例所在的地域。
  3. 集群列表页面,单击目标集群ID。
  4. 在左侧导航栏单击冷热分层存储
  5. 单击点击开通冷热分层存储
  6. 在弹出的冷热数据分层开启提示窗口,单击确定

    确定开通后,实例会进行重启。待实例状态从配置变更中变为运行中,即完成开通。

开通冷热分层存储功能后,默认存储策略的相关参数如下表所示。
参数 说明
move_factor 当热数据盘中的可用存储空间所占比例小于该参数时,自动将最早写入热数据盘的数据移动到冷数据盘存储。

取值范围为大于0,小于等于1的浮点值。默认值为0.1,代表可用存储空间所占比例小于10%时,将自动进行数据移动。

说明 如何查看磁盘空间,请参见查看磁盘空间
prefer_not_to_merge 冷数据盘中的数据是否进行合并。取值范围如下。
  • true:不合并,默认值。
  • false:合并。

设置TTL分层存储策略

在默认存储策略的基础上,添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中。

您可以参考如下语法添加TTL语句。
TTL <time_column> + INTERVAL <number> TO DISK 'cold_disk'
参数说明如下。
参数 说明
time_column 日期或日期时间类型的列。
number 间隔时间。

常用单位有:Day、Week、Month、Year。

说明 关于TTL语句的更多信息,请参见TTL
示例
以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分层存储策略后存量数据和新增数据全部按照新策略进行存储。
  • 如果您不想更改存量数据的TTL分层存储策略,可以在更改TTL分层存储策略之前,执行set materialize_ttl_after_modify=0;语句。执行成功后,再更改TTL分层存储策略。存量数据按照原有策略进行存储,不发生改变。只有新增数据按照新策略进行存储。
  • 更改TTL分层存储策略后,已经进入冷数据盘中的数据不会自动移动到热数据盘。如果需要移动,请参见移动冷热数据盘的数据
您可以参考如下语法更改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─┐
│ cold_disk│ /clickhouse/data/data/disks/cold_disk/ │ 18446744073709551615 │ 18446744073709551615 │ 115312080698 │   0               │
│ default  │ /clickhouse/data/data/                 │ 201663209472         │ 207083249664         │ 5420040192   │   0               │
└─────┴────────────────────┴───────────┴───────────┴───────┴─────── ──┘
参数说明如下。
参数 说明
name 磁盘名称。取值范围如下。
  • cold_disk:冷数据盘。
  • default:热数据盘。
path 磁盘上的数据存储路径。
free_space 当前磁盘剩余可用空间。冷数据盘可用空间不受限制。
total_space 当前磁盘总空间。冷数据盘可用空间不受限制。
used_space 当前磁盘已经被使用的空间。
keep_free_space 预留的空闲空间。