冷热数据管理
冷热数据简介
海量大数据场景下,随着业务和数据量的不断增长,数据存储与消耗的资源也日益增长。根据业务系统中用户对不同时期数据的不同使用需求,对膨胀的数据本身进行“冷热”分级管理,不仅可以提高数据分析性能还能降低业务成本。
例如,在网络流量分析系统中,用户可能对最近一个月内安全事件和网络访问情况感兴趣,而很少关注几个月前的数据。针对这样的一些场景,可以将数据按照时间分为:热数据、冷数据。
冷热数据主要从数据访问频率、更新频率进行划分。
- Hot(热数据):访问、更新频率较高,未来被调用的概率较高的数据,对访问的响应时间要求很高的数据。
- Cold(冷数据):不允许更新或更新频率比较低,访问频率比较低,对访问的响应时间要求不高的数据。
用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。
冷热数据迁移
GaussDB(DWS)列存数据写入时,数据首先进入热分区进行存储,分区数据较多后,可通过手动或自动的方式,将符合冷数据规则的数据切换至OBS上进行存储。在数据切换至OBS上后,其元数据、Desc表信息以及索引信息仍在本地进行存储,保证了读取的性能。
冷热切换策略
目前冷热切换的策略名称支持LMT(last modify time)和HPN(hot partition number),LMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。
- LMT:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0,36500],单位为天。
如下图中,设置day为2,即在冷热切换时,根据分区数据的最晚修改时间,保留2日内所修改的分区为热分区,其余数据为冷分区数据。假设当前时间为4月30日,4月30日对[4-26]分区进行了delete操作,4月29日对[4-27]分区进行了insert操作,故在冷热切换时,保留[4-26][4-27][4-29][4-30]四个分区为热分区。
- HPN:表示保留HPN个有数据的分区为热分区。分区顺序按照分区的Sequence ID来确定,分区的Sequence ID是根据分区边界值的大小,内置生成的序号,此序号不对外呈现。对于RANGE分区,分区的边界值越大,分区对应的Sequence ID越大;对于LIST分区,分区边界枚举值中的最大值越大,分区对应的Sequence ID越大。在冷热切换时,需要将数据迁移至OBS表空间中。其中HPN为整型,范围为[0,1600]。其中HPN为0时,表示不保留热分区,在进行冷热切换时,将所有有数据的分区都转为冷分区并存储在OBS上。
如下图中,设置HPN为3,即在冷热切换时,保留最新的3个有数据的分区为热分区数据,其余分区均切为冷分区。
冷热数据管理支持功能
- 支持对冷热表的insert、copy、delete、update、select等表相关的DML操作。
- 支持对冷热表的权限管理等DCL操作。
- 支持对冷热表进行analyze、vacuum、merge into等操作和一些分区的操作。
- 支持从普通列存分区表升级为冷热数据表。
- 支持带有冷热数据管理表的升级、扩容、缩容和重分布。
- 支持冷热分区互相转换。该功能仅8.3.0及以上版本支持。
冷热数据管理的约束限制
- 目前冷热表只支持列存2.0版本的分区表,外表不支持冷热分区。
- 对于已经切冷分区再次插入数据,数据直接会进入OBS,不会改变分区的冷热属性。
- 对于同一分区在同一DN只会存在冷或热的一种情况,对于同一分区在不同DN可能存在部分DN为热数据,部分DN为冷数据。
- 对于同时存在冷热分区的表,查询时会变慢,因为冷数据存储在OBS上,读写速度和时延都比在本地查询要慢。
- 只支持修改冷热表的冷热切换策略,不支持修改冷热表的冷数据的表空间。
- 冷热表的分区操作约束:
- 不支持对冷分区的数据进行exchange操作。
- Merge partition分区只支持热分区和热分区合并、冷分区和冷分区合并,不支持冷热分区合并。
- ADD/Merge/Split Partition等分区操作不支持指定表空间为OBS表空间。
- 不支持创建时指定和修改冷热表分区的表空间。
- 冷热切换不是只要满足条件就立刻进行冷热数据切换,依赖用户手动调用切换命令,或者通过调度器调用切换命令后才真正进行数据切换。目前自动调度时间为每日0点,可进行修改。
- 目前冷热切换规则只支持LMT和HPN两种。
- 冷热数据表不支持物理细粒度备份和恢复,由于物理备份时只备份热数据,在备份恢复前后OBS上冷数据为同一份,不支持truncate和drop table等涉及删除文件操作语句的备份恢复操作。
使用示例
- 创建列存冷热数据管理表,指定热数据有效期LMT为100天。
1 2 3 4 5 6 7 8
CREATE TABLE lifecycle_table(i int, val text) WITH (ORIENTATION = COLUMN, storage_policy = 'LMT:100') PARTITION BY RANGE (i) ( PARTITION P1 VALUES LESS THAN(5), PARTITION P2 VALUES LESS THAN(10), PARTITION P3 VALUES LESS THAN(15), PARTITION P8 VALUES LESS THAN(MAXVALUE) )ENABLE ROW MOVEMENT;
- 切换冷数据至OBS表空间。
- 将冷分区数据转换成热分区。该功能仅8.3.0及以上版本支持。
1
SELECT pg_catalog.reload_cold_partition('lifecycle_table');
将冷热表的指定冷分区转换成热分区:
1
SELECT pg_catalog.reload_cold_partition('lifecycle_table', 'cold_partition_name');
- 查看冷热表数据分布情况。
1
SELECT * FROM pg_catalog.pg_lifecycle_table_data_distribute('lifecycle_table');
查看所有冷热表数据分布情况:
1
SELECT * FROM pg_catalog.pg_lifecycle_node_data_distribute();