冷热数据自动迁移

云原生数据仓库 AnalyticDB PostgreSQL 版数据冷热分层存储功能支持将不常访问的数据放到冷存介质以降低存储成本。除通过转冷函数手动将数据从热存迁移到冷存外,AnalyticDB PostgreSQL 7.0版数据存储冷热分层支持对分区表设置自动冷热迁移策略,并按照设置的冷热迁移策略自动地将数据从热存迁移到冷存。本文介绍如何通过固定热分区数HPN和固定保留时间TTL两种策略实现数据从热存到冷存的自动迁移。

版本限制

内核版本为v7.0.6.5及以上的AnalyticDB PostgreSQL 7.0版实例。

使用约束

  • 仅支持对分区表进行自动冷热迁移,暂不支持对非分区表进行自动冷热迁移。

  • 暂不支持对多级分区进行自动冷热迁移。

  • 暂不支持对Hash分区进行自动冷热迁移。

  • 暂不支持对带主键的表自动冷热迁移。

  • 暂不支持多个分区键的分区表进行自动冷热迁移。

  • 已转冷的分区,不会因为自动冷热迁移策略的变更而重新转热。

调度策略

云原生数据仓库 AnalyticDB PostgreSQL 版支持两种自动冷热迁移策略:固定热分区数HPN(Hot Partition Number)和固定保留时间TTL(Time To Live)。两种策略均适用于RANGE分区和LIST分区。

固定热分区数HPN

HPN策略指的是仅保留M个热分区。即将分区键按照字典顺序排序,调度时保留分区键值最大的M个分区在热存中,其余分区自动转为冷存。DEFAULT分区,最后转冷。NULL分区在DEFAULT分区前转冷。

HPN策略格式要求:严格按照'HPN:M'格式。其中HPN大小写敏感,M为非负整数,不允许额外添加空格。

合法示例:

'HPN:3' 
'HPN:0'

非法示例:

'HPN:-3' 
'hpn:3'
'HPN: 3'
'HPN:3 '

固定保留时间TTL

TTL策略仅支持分区键为时间日期类型字段(DATE/TIMESTAMP/TIMESTAMP WITH TIMEZONE)的分区表。转冷的规则为超过固定保留时间的分区会自动转冷。例如今天为2024-08-10,设定固定保留时间为8天,则2024-08-02以及该时间之前的分区均被自动转冷。

具体为:

  • 对于RANGE分区,分区上界(range_end)与当前日期的间隔超过固定保留时间,分区将自动转冷。

  • 对于LIST分区,分区值与当前日期的间隔超过固定保留时间,分区将自动转冷。

  • DEFAULT/NULL分区不会转冷。

TTL策略格式要求:严格按照'TTL:N [YEAR | MONTH | DAY]'格式。其中N非负整数,不允许额外添加空格。[YEAR | MONTH | DAY]代表时间单位,大小写敏感。如果不添加单位,则默认单位为天。

合法示例:

'TTL:3' 
'TTL:3 YEAR'
'TTL:3 MONTH'
'TTL:3 DAY'

非法示例:

'TTL:-3' 
'TTL:3 day'
'TTL:3DAY'
'TTL:3 DAY '

语法和示例

创建和设置自动冷热迁移策略

CREATE TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[WITH(tiered_storage_cooldown_policy='XXX')]
PARTITION BY {LIST|RANGE} (PARTITION columns)
[distribution_options]

创建表时指定冷热迁移策略通过指定tiered_storage_cooldown_policy='HPN:M'或tiered_storage_cooldown_policy='TTL:N'来实现。建表语句的其他参数介绍请参见SQL语法

使用示例

CREATE TABLE tiered_storage_partition1 (a INT, b DATE) WITH(tiered_storage_cooldown_policy='TTL:2')  PARTITION BY LIST (b)
(
    VALUES ('2024-06-10'),
    VALUES ('2024-06-07'),
    VALUES ('2024-06-06')
);
CREATE TABLE tiered_storage_partition1 (a INT, b DATE) WITH(tiered_storage_cooldown_policy='HPN:3')  PARTITION BY LIST (b)
(
    VALUES ('2024-06-10'),
    VALUES ('2024-06-07'),
    VALUES ('2024-06-06')
);

修改自动冷热迁移策略

ALTER TABLE tbl_name SET(tiered_storage_cooldown_policy='XXX');    --修改迁移策略
ALTER TABLE tbl_name SET(tiered_storage_cooldown_policy='');       --删除迁移策略

使用示例

ALTER TABLE test_tbl SET(tiered_storage_cooldown_policy='HPN:5'); 

调度参数

云原生数据仓库 AnalyticDB PostgreSQL 版冷热数据自动迁移功能支持设置最大并行调度器数量、调度器触发间隔、调度器运行窗口等运维参数,以管理后台调度器的迁移行为。

您可以通过SHOW命令查看现有参数取值,如有修改参数取值需求请提交工单。修改参数无需重启,并在下次触发调度时生效。

最大并行调度器数量

您可以执行SHOW tiered_storage.adb_tiered_storage_max_worker查看后台执行转冷任务的最大并行数。对于多个分区数量进行转冷的表,并行度越大,同时转冷的表数目越多,转冷速度越快;但是增大并行度并不能改变单个表的转冷速度。该参数类型为INT,默认值为5。设置过大的并行度可能导致转冷进程消耗过多的CPU资源。

调度器触发间隔

您可以执行SHOW tiered_storage.adb_tiered_storage_worker_launch_interval查看后台调度器执行转冷任务的调度时间间隔。调度器在完成一次冷热调度后,需要满足调度间隔才会进行下一次调度。该参数类型为INT,默认值为600(单位:s),即每十分钟触发一次。设置过大的触发间隔可能导致总体转冷速度变慢,设置过小的触发间隔可能耗费过多的系统资源。

调度器运行窗口

您可以执行SHOW tiered_storage.adb_worker_time_window_str查看后台调度器每日允许执行调度任务的时间段。该参数类型为STRING,默认值为空,代表每日00:00:00~23:59:59的时间窗口都可运行。参数格式要求为"HH:MM-HH:MM",比如"02:00-04:15",代表每日执行调度任务的开始时间和结束时间,非法的参数不会生效。已经处于调度转冷中的调度任务不会因为超出时间窗而自动停止运行。

使用示例

  • 设置按月分区的分区表固定保留2个月的热数据,其余分区为冷数据。在凌晨两点到四点进行自动调度。设置参数tiered_storage.adb_worker_time_window_str为'02:00-04:00'。

    CREATE TABLE tiered_storage_partition4 (a INT, b DATE) WITH(tiered_storage_cooldown_policy='HPN:2') PARTITION BY RANGE(b)
    (
        START ('2023-11-01'::date) END ('2023-12-01'::date),
        START ('2023-12-01'::date) END ('2024-01-01'::date),
        START ('2024-01-01'::date) END ('2024-02-01'::date),
        START ('2024-02-01'::date) END ('2024-03-01'::date)
    );

    在上述策略下,分区表按日期字段b排序,分区值最大的2个区保留为热分区,其他分区会自动转冷。在业务上可以在每月1日02:00之前生成新的分区,这样在02:00开始调度时会将新的分区确认为热分区。

  • 设置按日分区的分区表固定保留90天的数据作为热数据,超过90天的分区转为冷数据,在23:00到23:59进行自动调度。

    LIST分区

    CREATE TABLE tiered_storage_partition1 (a INT, b DATE) WITH(tiered_storage_cooldown_policy='TTL:90')  PARTITION BY LIST (b)
    (
        VALUES ('2024-06-10'),
        VALUES ('2024-06-09'),
        VALUES ('2024-06-08'),
        VALUES ('2024-06-07'),
        VALUES ('2024-06-06'),
        ...    --替换为实际的分区日期,这里进行了省略
        VALUES ('2023-11-01')
    );

    RANGE分区

    CREATE TABLE tiered_storage_partition3 (a INT, b DATE) WITH(tiered_storage_cooldown_policy='TTL:90') PARTITION BY RANGE(b)
    (
        START ('2023-11-01'::date) END ('2023-12-01'::date),
        START ('2023-12-01'::date) END ('2024-01-01'::date),
        START ('2024-01-01'::date) END ('2024-02-01'::date),
        ...  --替换为实际的分区日期
        START ('2024-05-01'::date) END ('2024-06-01'::date)
        
    );

在上述策略下,数据库每日会把分区取值或者分区上界时间到当前时间超过90天的分区认定为冷数据,会自动迁移到冷数据,达到保留90天热数据的目的。

常见问题

  • 能否将非分区表的数据定时迁移到冷存?

    将非分区表定时迁移到冷存请使用pg_cron实现。请参见数据存储冷热分层

  • 如果业务需要的转冷条件与分区表的分区键无关,如何支持自动迁移?

    在现有的自动冷热迁移功能中,仅支持设置与分区键相关的自动转冷策略,比如按照分区键取值或者分区上界设置转冷时间。

冷热数据自动迁移使用过程中,如果遇到其他问题,请提交工单或者进入云原生数据仓库 AnalyticDB PostgreSQL 版官网支持群(群号:11700737)提交问题。