You need to enable JavaScript to run this app.
导航
冷热分层存储
最近更新时间:2024.10.12 17:22:25首次发布时间:2023.08.07 18:03:42

ByteHouse 支持冷热数据分层存储,以达到节省存储成本的目的。

基本概念
  • 热数据:访问频次较高的数据,存储在热数据盘(即创建集群时所选的 PLX 云盘)中,满足高性能访问的需求。
  • 冷数据:访问频次较低的数据,存储在较低价的冷数据存储中,满足高性价比的存储需求。

在 ByteHouse 中,热数据采用 SSD 磁盘,成本高;而冷数据查询频率较低,则可以使用更低性能、更低成本的存储介质,具体使用差异如下:

数据类型

存储方式

创建方式

计费方式

热数据

本地存储

建集群时选择的存储空间,磁层介质为 SSD 云盘。

包年包月计费

冷数据

冷存储

需要额外开通,底层介质为对象存储 ToS。

后付费

冷热分存策略

根据场景不同,支持三种冷热数据移动策略。

  • TTL 分层存储:添加TTL语句,实现将间隔时间之前的所有数据自动转移到冷数据盘中(需要集群已开通了存储策略)。

Image

  • 移动因子策略:将新写入的数据存储在本地存储中作为热数据,提供高效查询。当热数据存储量达到业务使用阈值( 即移动因子 Move Factor)时,自动将按照part大小优先将大的part数据移动到冷数据存储,从而释放本地存储空间。需要在系统文件中开启一个存储策略(Storage Policy),并在建表时增加这个设置。
    1. s3_cold策略:为除了 HaUniqueMergeTree 表的其他 MergeTree 家族表默认使用,这个策略跟随集群的移动因子策略,同时若用户设置 TTL 淘汰至冷存,也可生效;
    2. s3_cold_for_unique_table策略:为 HaUniqueMergeTree 表使用,此策略不跟随集群的移动因子策略(即集群容量100%了也无法移动),但若用户设置 TTL 淘汰至冷存则可正常生效;
  • 手动移动分区:将指定分区移动到本地存储或冷存储。

使用限制

冷存储使用对象存储服务,可以使成本大大降低,但性能远低于本地存储。
请根据使用场景来判断是否需要使用冷存储。

  1. 目前冷存储只支持 HaMergeTree 或者 HaUniuqeMergeTree 表引擎。
  2. 使用 TTL 分层存储需要满足分区是datetime 类型(包含 toDate()toMonth() )。
  3. 使用 MaterializeMySQL 时,不支持选择 TTL 策略转储到冷存,仅支持移动因子策略。
  4. 使用冷存储会导致以下场景的效率显著下降:
    • 数据读取;
    • 分区合并;
    • 主备同步。
  5. 小表不建议使用冷存,冷存储和热存储查询性能差约10倍。建议当表数据量增长后再考虑移动历史分区数据至冷存
  6. 频繁回溯历史分区数据的表不建议使用冷存(如:toC.ods_chatglm_server_log_local),避免造成数据重复或者影响写入查询性能
  7. 初始建表时可以不指定冷存TTL,后续可通过巡检扫描各业务表数据量,识别业务使用场景合适可开启冷存的大表。

综合上述限制,冷存储使用的最佳实践为:

  • 尽量在单副本模式下使用冷存储,多副本情况下副本间同步耗时会显著增加;
  • 由于冷存储内的数据 Merge 很慢,不会去重,目前仅支持数据变冷后自动转存,不推荐将数据直接导入冷存储的场景(例如,设置了2022-01-01前的数据转存到冷存储,此时直接插入 2021-12-01的数据),目前如有将大量数据导入,且希望部分数据直接进入冷存的场景,请提交工单。

计费说明

计费方式

热存储、冷存储分开计费,会生成不同的订单。

  1. 热存储计费:热存储使用的空间在新建集群时创建,通过包年包月方式预付费,参考集群计费
  2. 冷存储计费:当集群开启了冷存储后,以小时为周期根据存储使用量开始计费,属于后付费资源。计费价格在开通“冷热分存”功能时会提示,如下图(具体价格以产品界面实际显示为准),具体请参考冷存储计费

欠费说明

热存储为预付费,若中止续费请参考到期处理
冷存储目前每天出账,出具账单后实时结算扣款,若欠费请参考 欠费处理

使用指南

开启"冷热分层存储"

给集群开启冷存储的方式包括:

  • 创建集群时开通
  • 现有集群开通

创建集群时开通

权限要求:火山引擎的 BillFullAccess 权限(详见 策略管理);
开通步骤:

  1. 访问 ByteHouse 控制台,单击 新建集群
  1. 根据个人需求选择计费类型和计算资源规格、副本模式等。

注意

推荐在单副本模式下使用冷存储,在多副本情况下副本间同步耗时会显著增加。
Image

  1. 用户可在选择本地数据的大小后,选择“冷热分层存储”,填写需要迁移到冷存储时的阈值;

说明

此时用户可选“本地存储上限”策略:

  1. 当本地存储达到上限时,将影响数据插入等功能,建议按照业务评估设定存储最大值,冷存移动时会影响部分IO性能。
  2. 开启“本地存储上限”功能后需要设定容量上限,默认值为90%,可自定义范围为[1,99]的整数。

Image

  1. 完成集群其他配置项的设置,完成集群创建。之后参考“建表”的步骤,在新建数据表时正确配置即可启用冷存。

现有集群开通

权限要求:集群管理员,或系统管理员;
开通步骤:

  1. 访问 集群与运维管理 -> 集群管理 -> 集群列表 -> 集群详情 -> 存储管理;
  2. 选择“去开启”,并选择冷热的移动策略;
  1. (可选) 此时用户可选“本地存储上限”策略:
    1. 当本地存储达到上限时,将影响数据插入等功能,建议按照业务评估设定存储最大值,冷存移动时会影响部分IO性能。
    2. 开启“本地存储上限”功能后需要设定容量上限,默认值为90%,可自定义范围为[1,99]的整数。

Image

  1. 确认后,即完成冷存储的开通;
  2. 对于新建的表,参考“建表”的步骤,在新建数据表时正确配置即可启用冷存;对于存量的表,修改存储策略并不会让存储策略立即生效,建议参考“移动分区”的步骤,进行存量数据的手动处理;

建表时指定存储策略

集群开通了冷存储后,需要在建表时指定存储策略,数据表内的数据才会按照开通冷存时配置的策略移动数据。

通过 SQL 语句建表

权限要求:对库有 Create 权限的用户。

移动因子配置

开启冷存并配置了冷热数据移动规则后后,系统会自动添加一个 s3_cold/s3_cold_for_unique_table的存储策略,在建表时,需要在 settings 中指定这个存储策略,数据表新建完成后,会按照在开启冷存时配置的规则进行数据移动。示例如下:

CREATE TABLE example_table on cluster xxxx
(
    d Date,
    a Int
)
ENGINE = HaMergeTree(...)
PARTITION BY d
ORDER BY d
SETTINGS index_granularity = 8192, storage_policy = 's3_cold';

若不指定存储策略,数据表仍然会全部存储于本地存储。

TTL 策略配置

当配置了存储策略时,则可以配置多级 TTL。
时间点1(如示例中,2 周后)会将数据转存到冷存储(DISK = 'S3')
时间点2(如示例中,1 个月后)会将数据彻底删除。
示例如下:

CREATE TABLE example_table on cluster xxxx
(
    d Date,
    a Int
)
ENGINE = HaMergeTree(...)
PARTITION BY d
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE,
    d + INTERVAL 2 WEEK TO DISK 'S3'
SETTINGS index_granularity = 8192, storage_policy = 's3_cold';

若如此配置,多级 TTL 和移动因子策略会同时生效。即数据满足了 TTL 的移动条件,或者冷热因子的移动条件后,都会发起热数据向冷数据的移动。更多 TTL 使用说明,请参考文档TTL

HaUniqueMergeTree

HaUniqueMergeTree 为 ByteHouse 的自研引擎,开通冷存储后,需注意以下事项:

  1. Unique 表写入时不会对冷存储的数据进行去重。
  2. Unique 表默认不对对象存储上的数据进行 Merge 操作(即 skip_merge_for_unique_data_in_remote_disk = 1);如果有必要允许这部分数据进行Merge操作,需要在建表时指定参数skip_merge_for_unique_data_in_remote_disk = 0。在冷存储上 Merge 性能会比较差,请谨慎配置

示例:

CREATE TABLE example_table on cluster xxxx
(
    d Date,
    a Int
)
ENGINE = HaUniqueMergeTree(...)
PARTITION BY d
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE,
    d + INTERVAL 2 WEEK TO DISK 'S3'
SETTINGS 
    index_granularity = 8192, 
    storage_policy = 's3_cold'
    skip_merge_for_unique_data_in_remote_disk = 1,
    ban_parts_mover_when_create_unique_replica = 1;

可视化建表

通过可视化建表,会自动生成建表 SQL,无需手动指定 storage_policy,指定配置参数等。
权限要求:数据工程师,集群管理员,或系统管理员;
操作步骤:

  1. 访问 数据管理与查询 -> 数据管理 -> 点击左侧上角的“+” -> 可视化建表;
  1. 在完成数据库、数据表、列设置等选项后,点击展开“高级键”;
  2. 存储策略会默认选择“遵循集群整体的冷热分存策略”,应用移动因子策略。如选择“不遵循集群整体的冷热分存策略”,则数据会一直存储在本地存储;
  1. 选择“遵循集群整体的冷热分存策略”后,设置 TTL 时,可以单击左侧的“+”,增加一级“转存至冷存储”的 TTL,并设置该级 TTL 的时间,完成 TTL 转储策略的设置。请注意,“转存至冷存储”的 TTL 必须小于“删除数据”的 TTL;
  2. 完成剩余参数的设定,系统会在生成的语句中,自动添加对应的设置参数;
  3. 点击“创建”。则新建的表会应用冷存储规则。

修改表存储策略

开通了冷存储后,如果不修改存量表的存储策略,则数据表内的数据不会按照开通冷存时配置的策略移动数据。因此需要通过修改表的存储策略、TTL设置,来达到让数据表应用冷存储规则的目标。

SQL 修改

操作描述:通过 Alter 命令,可修改表的存储策略与 TTL。
权限要求:对表有 Alter 权限的用户。
SQL 示例:

ALTER TABLE table_name ON cluster xxxx
MODIFY SETTING storage_policy = 's3_cold'; 
-- 修改存储策略,此处操作的是local表

ALTER TABLE table_name on cluster cluster_name 
MODIFY TTL toDate(create_date) + toIntervalDay(30) TO DISK 's3';
-- 修改 TTL 策略

注意

在修改存储策略 / TTL后,数据不会立刻移动,只有之后插入数据才会应用规则。如果希望对存量数据进行调整,请参考“手动移动分区”章节。更多 TTL 使用说明,请参考文档TTL

可视化修改

通过可视化界面,编辑表的存储策略与 TTL 策略。
权限要求:数据工程师,集群管理员,或系统管理员;
操作步骤:

  1. 访问 数据管理与查询 -> 数据管理 -> 选中对应的表 -> 编辑;
  2. 修改存储策略,以及 TTL 设置;
  3. 确认,完成编辑。

查看存储用量

通过可视化方式查看本地存储、冷存储的用量趋势,便于分析和决策。
权限要求:集群管理员、系统管理员。
操作步骤:

  1. 访问 集群与运维管理 -> 集群管理 -> 集群列表 -> 集群详情 -> 存储管理;
  2. 查看图表中,本地存储、冷存储的用量趋势。

移动分区

通过 Alter 命令来完成移动分区的操作,适用于移动分区到冷存储。
权限要求:对表有 Alter 权限的用户。
基本语法

ALTER db_name.table_name MOVE PARTITION 'partition_name' TO DISK 'S3'
-- 此处操作的是local表

SQL 示例:

ALTER TABLE table_name ON cluster xxxx
MODIFY SETTING storage_policy = 's3_cold'; 
-- 在移动前,需要确保设置了存储策略,如未修改则用以上命令更换存储策略
-- 注意,此处操作的是local表,如果是distributed表则会报错

SELECT partition FROM system.parts WHERE table = 'table_name' GROUP BY partition
-- 取得分区名

ALTER db_name.table_name MOVE PARTITION 'partition_name' TO DISK 'S3';
-- 移动分区到冷存储

常见问题

Q:在设置冷存时,SQL语句涉及到的建表、修改表和移动分区,均是Local表。如果在Distributed表上操作则会出现报错。如:

Code: 48, e.displayText() = DB::Exception: There was an error on [HOST:PORT]: Code: 48, e.displayText() = DB::Exception
Setting storage_policy cannot be modified SQLSTATE: HY000 (versicon 21.9.1) SQLSTATE: HY000 (version 21.9.1)

A: 在Local表上设置存储策略和TTL。如果是distributed表,可通过show create table 语句找到它对应的底表再执行冷存SQL语句。