冷热数据分层存储

为了降低数据存储成本、提高查询性能和系统资源利用率。云数据库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元。

说明

本示例中的价格仅用于举例,实际价格以控制台为准。

开通冷热分层存储

  1. 登录云数据库ClickHouse控制台

  2. 在页面左上角,选择集群所在的地域。

  3. 集群列表页面,选择社区版实例列表,单击目标集群ID。

  4. 单击左侧导航栏的冷热分层存储

  5. 单击开通冷热分层存储

  6. 在弹出的冷热数据分层开启提示窗口,单击确定

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

冷热分层默认存储策略

冷热分层存储功能开通后,默认存储策略的相关参数如下表所示。

参数

说明

move_factor

当热数据盘中的可用存储空间所占比例小于该参数时,自动将当前热数据盘中占用空间最大的part数据文件移动到冷数据盘存储。

取值范围为[0,1]。取值为0时,代表关闭基于磁盘存储容量的冷热数据分层存储。默认值为0.1,代表可用存储空间所占比例小于10%时,将自动进行数据移动。您也可以建表时设置TTL分层存储策略

说明

如何查看磁盘空间,请参见查看磁盘空间

prefer_not_to_merge

冷数据盘中的数据是否进行合并。取值范围如下。

  • true:不合并,默认值。

  • false:合并。

建表时设置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分层存储策略之后,还要执行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

磁盘名称。

  • cold_disk:冷数据盘。

  • default:热数据盘。

path

磁盘上的数据存储路径。

free_space

当前磁盘剩余可用空间。冷数据盘可用空间不受限制。单位:Byte。

total_space

当前磁盘总空间。冷数据盘可用空间不受限制。单位:Byte。

used_space

当前磁盘已经被使用的空间。单位:Byte。

keep_free_space

预留的空闲空间。单位:Byte。

type

存储介质。取值如下。

  • OSS:冷数据存储OSS。

  • local:本地云盘。

常见问题

Q:数据尚未从热数据盘存储至冷数据盘的原因是什么?

A:数据是否迁至冷数据盘,取决于system.parts表中move_ttl_info.minmove_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'

如果查询结果中,任意一个值未超过当前时间,则该部分数据不应被移动到冷存。也有可能是系统正在进行或准备将该数据移动至冷数据盘的操作,但操作尚未处理完毕。