ByteHouse 支持冷热数据分层存储,以达到节省存储成本的目的。
在 ByteHouse 中,热数据采用 SSD 磁盘,成本高;而冷数据查询频率较低,则可以使用更低性能、更低成本的存储介质,具体使用差异如下:
数据类型 | 存储方式 | 创建方式 | 计费方式 |
---|---|---|---|
热数据 | 本地存储 | 建集群时选择的存储空间,磁层介质为 SSD 云盘。 | 包年包月计费 |
冷数据 | 冷存储 | 需要额外开通,底层介质为对象存储 ToS。 | 后付费 |
根据场景不同,支持三种冷热数据移动策略。
s3_cold
策略:为除了 HaUniqueMergeTree 表的其他 MergeTree 家族表默认使用,这个策略跟随集群的移动因子策略,同时若用户设置 TTL 淘汰至冷存,也可生效;s3_cold_for_unique_table
策略:为 HaUniqueMergeTree 表使用,此策略不跟随集群的移动因子策略(即集群容量100%了也无法移动),但若用户设置 TTL 淘汰至冷存则可正常生效;冷存储使用对象存储服务,可以使成本大大降低,但性能远低于本地存储。
请根据使用场景来判断是否需要使用冷存储。
datetime
类型(包含 toDate()
、toMonth()
)。综合上述限制,冷存储使用的最佳实践为:
热存储、冷存储分开计费,会生成不同的订单。
热存储为预付费,若中止续费请参考到期处理;
冷存储目前每天出账,出具账单后实时结算扣款,若欠费请参考 欠费处理。
给集群开启冷存储的方式包括:
权限要求:火山引擎的 BillFullAccess 权限(详见 策略管理);
开通步骤:
注意
推荐在单副本模式下使用冷存储,在多副本情况下副本间同步耗时会显著增加。
说明
此时用户可选“本地存储上限”策略:
权限要求:集群管理员,或系统管理员;
开通步骤:
集群开通了冷存储后,需要在建表时指定存储策略,数据表内的数据才会按照开通冷存时配置的策略移动数据。
权限要求:对库有 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。
时间点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 为 ByteHouse 的自研引擎,开通冷存储后,需注意以下事项:
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;
通过可视化建表,会自动生成建表 SQL,无需手动指定 storage_policy,指定配置参数等。
权限要求:数据工程师,集群管理员,或系统管理员;
操作步骤:
开通了冷存储后,如果不修改存量表的存储策略,则数据表内的数据不会按照开通冷存时配置的策略移动数据。因此需要通过修改表的存储策略、TTL设置,来达到让数据表应用冷存储规则的目标。
操作描述:通过 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 策略。
权限要求:数据工程师,集群管理员,或系统管理员;
操作步骤:
通过可视化方式查看本地存储、冷存储的用量趋势,便于分析和决策。
权限要求:集群管理员、系统管理员。
操作步骤:
通过 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语句。