DWS冷热表特性

举报
dgt 发表于 2023/10/11 15:12:34 2023/10/11
【摘要】 一、    冷热数据管理介绍2.1  冷热存储定义数据存在的价值在于其被使用的程度,即被查询或更新的频率。在不同的业务系统中,人们对于不同时期的数据有着不同的使用需求。如在网络流量分析系统中,客户会对最近一个月内安全事件和网络访问情况感兴趣,而很少关注几个月前的数据。对于这样的一些场景,我们将数据按照时间可以分为两个阶段:热数据、冷数据。Hot(热数据):被频繁查询或更新,对访问的响应时间要...

一、    冷热数据管理介绍

2.1  冷热存储定义

数据存在的价值在于其被使用的程度,即被查询或更新的频率。在不同的业务系统中,人们对于不同时期的数据有着不同的使用需求。如在网络流量分析系统中,客户会对最近一个月内安全事件和网络访问情况感兴趣,而很少关注几个月前的数据。对于这样的一些场景,我们将数据按照时间可以分为两个阶段:热数据、冷数据。

Hot(热数据):被频繁查询或更新,对访问的响应时间要求很高;

Cold(冷数据):不允许更新,偶尔被查询,对访问的响应时间要求不高。

用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。

2.2  冷热数据自动迁移

GaussDB(DWS)列存数据写入时,数据首先进入热分区进行存储,分区数据较多后,可通过手动或自动的方式,将符合冷数据规则的数据切换至OBS上进行存储。在数据切换至OBS上后,其元数据、Desc表信息以及索引信息也在本地进行存储,保证了读取的性能。

2.3  冷热切换策略

目前冷热切换的策略名称支持LMTHPNLMT指按分区的最后更新时间切换,HPN指保留热分区的个数切换。

LMT:[day]:表示切换[day]时间前修改的热分区数据为冷分区,将该数据迁至OBS表空间中。其中[day]为整型,范围[0, 36500],单位为天。

在下图中,设置day2,即在冷热切换时,根据分区数据的最晚修改时间,保留2日内所修改的分区为热分区,其余数据为冷分区数据。[4-26]分区在4-30日进行了delete操作,[4-27]分区在4-29日进行了insert操作,这两个分区的最晚修改时间为4-304-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_num3,即在冷热切换时,保留最新的3个有数据的分区为热分区数据,其余分区均切为冷分区。

二、    冷热数据管理功能点和使用说明

2.1  冷热数据管理表的功能点说明

  • 支持创建OBS表空间。
  • 支持对冷热表的创建、删除、修改等正常DDL操作。
  • 支持对冷热表的insertcopydeleteupdateselect等表相关的DML操作。
  • 支持对冷热表的权限管理等DCL操作。
  • 支持对冷热表表进行analyzevacuummerge into等操作和一些分区的操作。
  • 支持从普通列存的分区表升级为冷热数据表。
  • 支持带有冷热数据管理表的升级、扩容和缩容、重分布。
  1. 约束
  • 目前冷热表只支持列存0版本的分区表。
  • 只支持从热数据切换为冷数据,不支持从冷数据切换为热数据。进入冷热表的数据开始都热数据,通过冷热切换的方式才能将数据变冷。不支持进入冷热表的数据开始就是冷热数据混存或者全部为冷数据。
  • 冷分区再次插入数据,数据直接会进入OBS,不会改变分区的冷热属性。对于同一个分区在同一个DN只会存在冷热的一种情况,对于不同的DN可能存在有些DN是热数据,有些DN是冷数据。
  • 只支持修改冷热表的冷热切换策略,但不支持修改冷热表的冷数据的表空间。
  • 冷热表的分区操作约束:
  • 不支持对冷分区的数据进行exchange操作。
  • Merge partition分区只支持热分区和热分区合并、冷分区和冷分区合并,不支持冷热分区合并。
  • ADD/Merge/Split Partition等分区操作不支持指定表空间为obs表空间。
  • 不支持创建时指定和修改冷热表分区的表空间。
  • 冷热切换的不是满足冷热规则就立刻进行冷热数据切换,依赖用户手动调用切换命令,或者通过定时器调用切换命令后才真正进行数据切换。目前只支持手动切换,不支持自动切换。
  • 目前冷热切换规则只支持LMTHPN两种,LMT:分区的最后修改时间;HPN:热分区的个数。
  • 冷热数据表支持备份和恢复,不支持truncatedrop 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_keyOBS访问秘钥ID;

secret_access_key与访问密钥ID结合使用的私有访问密钥,数据库内部加密存储;

storepathOBS上的数据存储路径。

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版本为天。

  • 用户针对表进行insertcopy等操作
  • 切换冷数据至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,从202331日开始,每月18:30执行表AB的冷热切换:

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,从202331日开始,每天凌晨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号凌晨100执行所有表的冷热数据切换:

编辑/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';

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。