DWS冷热表特性
一、 冷热数据管理介绍
2.1 冷热存储定义
数据存在的价值在于其被使用的程度,即被查询或更新的频率。在不同的业务系统中,人们对于不同时期的数据有着不同的使用需求。如在网络流量分析系统中,客户会对最近一个月内安全事件和网络访问情况感兴趣,而很少关注几个月前的数据。对于这样的一些场景,我们将数据按照时间可以分为两个阶段:热数据、冷数据。
Hot(热数据):被频繁查询或更新,对访问的响应时间要求很高;
Cold(冷数据):不允许更新,偶尔被查询,对访问的响应时间要求不高。
用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。
2.2 冷热数据自动迁移
GaussDB(DWS)列存数据写入时,数据首先进入热分区进行存储,分区数据较多后,可通过手动或自动的方式,将符合冷数据规则的数据切换至OBS上进行存储。在数据切换至OBS上后,其元数据、Desc表信息以及索引信息也在本地进行存储,保证了读取的性能。
2.3 冷热切换策略
目前冷热切换的策略名称支持LMT和HPN,LMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。
LMT:[day]:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0, 36500],单位为天。
在下图中,设置day为2,即在冷热切换时,根据分区数据的最晚修改时间,保留2日内所修改的分区为热分区,其余数据为冷分区数据。[4-26]分区在4-30日进行了delete操作,[4-27]分区在4-29日进行了insert操作,这两个分区的最晚修改时间为4-30和4-29,当前为4-30日,故在冷热切换时,保留[4-26][4-27][4-29][4-30]为热分区。
HPN: [hot_partition_num]:表示保留[hot_partition_num]个有数据的分区为热分区。保留规则为查找出有数据的分区的最大的Sequence ID,大于Sequence ID的无数据分区为热分区,并按这个Sequence ID从大到小保留[hot_partition_num]个分区为热分区;分区Sequence ID小于保留的最小热分区的Sequence ID的分区为冷分区,在冷热切换时,需要将数据迁移至OBS表空间中。其中[hot_partition_num]为整型,范围为[0,1600]。
在下图中,设置hot_partition_num为3,即在冷热切换时,保留最新的3个有数据的分区为热分区数据,其余分区均切为冷分区。
二、 冷热数据管理功能点和使用说明
2.1 冷热数据管理表的功能点说明
- 支持创建OBS表空间。
- 支持对冷热表的创建、删除、修改等正常DDL操作。
- 支持对冷热表的insert、copy、delete、update、select等表相关的DML操作。
- 支持对冷热表的权限管理等DCL操作。
- 支持对冷热表表进行analyze、vacuum、merge into等操作和一些分区的操作。
- 支持从普通列存的分区表升级为冷热数据表。
- 支持带有冷热数据管理表的升级、扩容和缩容、重分布。
- 约束
- 目前冷热表只支持列存0版本的分区表。
- 只支持从热数据切换为冷数据,不支持从冷数据切换为热数据。进入冷热表的数据开始都热数据,通过冷热切换的方式才能将数据变冷。不支持进入冷热表的数据开始就是冷热数据混存或者全部为冷数据。
- 冷分区再次插入数据,数据直接会进入OBS,不会改变分区的冷热属性。对于同一个分区在同一个DN只会存在冷热的一种情况,对于不同的DN可能存在有些DN是热数据,有些DN是冷数据。
- 只支持修改冷热表的冷热切换策略,但不支持修改冷热表的冷数据的表空间。
- 冷热表的分区操作约束:
- 不支持对冷分区的数据进行exchange操作。
- Merge partition分区只支持热分区和热分区合并、冷分区和冷分区合并,不支持冷热分区合并。
- ADD/Merge/Split Partition等分区操作不支持指定表空间为obs表空间。
- 不支持创建时指定和修改冷热表分区的表空间。
- 冷热切换的不是满足冷热规则就立刻进行冷热数据切换,依赖用户手动调用切换命令,或者通过定时器调用切换命令后才真正进行数据切换。目前只支持手动切换,不支持自动切换。
- 目前冷热切换规则只支持LMT和HPN两种,LMT:分区的最后修改时间;HPN:热分区的个数。
- 冷热数据表支持备份和恢复,不支持truncate和drop table等涉及删除文件操作的语句的备份恢复操作。
2.2 冷热表的使用说明
- 创建OBS Tablespace,指定OBS路径
CREATE TABLESPACE tablespace_name [relative location '']
with (filesystem='obs', address='', access_key='', secret_access_key='', storepath='');
filesystem:表空间类型,OBS表明为OBS表空间;
address:在为OBS表空间时为OBS的hostname;
access_key:OBS访问秘钥ID;
secret_access_key:与访问密钥ID结合使用的私有访问密钥,数据库内部加密存储;
storepath:OBS上的数据存储路径。
relative location:可以省略,并且公有云环境只支持省略的方式,系统默认生成location:数据库data目录/tablespace_name。
- 用户:创建列存冷热数据管理表,指定OBS表空间以及热数据有效期(单位:天)
CREATE TABLE table_name
([ { column_name type_name | LIKE source_table } [, ...] ])
With(orientation = column, cold_tablespace = 'tablespace_name', storage_policy= '')
PARTITION BY RANGE(column1)
(
PARTITION P1 VALUES LESS THAN(value1),
……
PARTITION Pn VALUES LESS THAN(MAXVALUE)
);
cold_tablespace:冷数据指定的OBS tablespace;必选
storage_policy:冷热数据切换规则,必选,规则以”冷热切换策略:冷热切换时间”的方式,目前切换策略只支持”LMT”,以分区的最后修改时间为准,冷热切换时间支持 [0, 36500],单位DEBUG版为秒,RELEASE版本为天。
- 用户针对表进行insert、copy等操作
- 切换冷数据至OBS表空间
单表:Alter Table table_name refresh storage;
批量:调用函数 SELECT pg_catalog.pg_refresh_storage();
2.3 冷热表自动切换的替代解决方案
GaussDB DWS 8.1.1冷热数据管理暂不支持自动将冷数据切换到OBS上,只支持手动切换,支持通过Alter table ……Refresh Storage命令对指定表进行冷热数据切换,或者通过调用系统函数pg_refresh_storage()将所有多温表进行批量冷热数据切换。
全自动的冷热数据切换方案在后续版本已规划,主要通过OM启动定时器,然后调用系统函数pg_refresh_storage()函数进行切换,该函数会遍历pg_class系统表中的所有冷热数据表,然后调用命令ALTER TABLE ……REFRESH STORAGE对分别对系统中的所有冷热表的数据进行冷热切换。
在没有跟OM和管控面适配启动冷热数据管理的定时器,对于冷热数据的自动切换,可以采用如下两种方案:
- 通过gsql工具连接数据库,然后调用DBMS_JOB包启动job任务,job中可以直接调用ALTER TABLE ……REFRESH STORAGE对指定表进行冷热数据切换,或者调用系统函数pg_refresh_storage()对所有的冷热表进行冷热数据批量切换。
例如:
例1,从2023年3月1日开始,每月1日8:30执行表A,B的冷热切换:
CALL DBMS_JOB.SUBMIT('ALTER TABLE A REFRESH STORAGE; ALTER TABLE B REFRESH STORAGE;',
add_months(to_date('202303','yyyymm'),1),
'date_trunc(''day'',SYSDATE) + 1 +(8*60+30.0)/(24*60)' , :jobid);
例2,从2023年3月1日开始,每天凌晨1点执行所有表的冷热切换:
select DBMS_JOB.SUBMIT('select pg_refresh_storage();',
to_date('20230301','yyyymmdd'),'sysdate+1.0/24');
具体的DBMS_JOB的相关用法,参见产品帮助文档。
- 通过操作系统自带的Crontab启动定时任务,然后定时任务中执行gsql命令,通过gsql连接服务器,并执行ALTER TABLE ……REFRESH STORAGE对指定表进行切换冷热数据切换,或者调用系统函数pg_refresh_storage()对所有的冷热表进行冷热数据批量切换。
例3:每月10号凌晨1:00执行所有表的冷热数据切换:
编辑/etc/crontab文件,在末尾新增冷热数据切换规则
0 1 10 * * gsql -d postgres -p 8000 -c "select pg_refresh_storage();"
crontab的具体用法可以参见crontab的帮助。
三、 冷热表使用示例
3.1 --创建OBS表空间
CREATE TABLESPACE obs_ts_1 with(filesystem="obs",
address= 'obs.xxx.com',
access_key = 'ak_xxxx',
encrypt = 'on',
secret_access_key = 'sk_yyyyy',
storepath='/obs_ts_1/'
);
3.2 --创建源数据表
CREATE TABLE test_src1(a int, b int, val text) DISTRIBUTE BY REPLICATION;
INSERT INTO test_src1 values(1, 2, 'aaaaaaa');
INSERT INTO test_src1 values(2, 3, 'bbbbbbb');
INSERT INTO test_src1 values(3, 4, 'ccccccc');
INSERT INTO test_src1 values(4, 5, 'ddddddddd');
INSERT INTO test_src1 values(5, 6, 'eeeeeeeee');
INSERT INTO test_src1 values(6, 7, 'aaaaaaa');
INSERT INTO test_src1 values(7, 8, 'bbbbbbb');
INSERT INTO test_src1 values(8, 9, 'aaaaaaa');
INSERT INTO test_src1 values(9, 3,'bbbbbbb');
INSERT INTO test_src1 values(10, 6,'ccccccc');
CREATE TABLE test_src2(a int, b int, val text) DISTRIBUTE BY REPLICATION;
INSERT INTO test_src2 values(11, 20, 'ddddddddd');
INSERT INTO test_src2 values(12, 21, 'eeeddee');
INSERT INTO test_src2 values(13, 15, 'aaaaaaa');
INSERT INTO test_src2 values(14, 17,'bbbbbbb');
INSERT INTO test_src2 values(12, 18, 'ccccccc');
INSERT INTO test_src2 values(13, 30, 'cddddddd');
INSERT INTO test_src2 values(20, 25,'ddddddddd');
INSERT INTO test_src2 values(25, 20, 'eeeeeeeee');
3.3 --创建冷热表
DROP TABLE IF EXISTS multi_temper_table;
CREATE TABLE multi_temper_table(a int, b int, val text) WITH (ORIENTATION = COLUMN, enable_delta=false,
cold_tablespace="obs_ts_1", storage_policy = 'LMT:0')
DISTRIBUTE BY HASH(a)
PARTITION BY RANGE (b)
(
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;
3.4 --冷热表中导入数据
INSERT INTO multi_temper_table SELECT * FROM test_src1;
SELECT * FROM multi_temper_table ORDER BY a ASC;
3.5 --单表冷热切换
ALTER TABLE multi_temper_table REFRESH STORAGE;
--再次导入数据
INSERT INTO multi_temper_table SELECT * FROM test_src2;
SELECT * FROM multi_temper_table ORDER BY a ASC;
-- 多张表批量切换
SELECT pg_refresh_storage();
3.6 -- 查询冷热表中数据分布
select * from pg_catalog.pg_lifecycle_data_distribute where tablename='test_src2' and schemaname='public';
- 点赞
- 收藏
- 关注作者
评论(0)