冷热分离与TTL

更新时间:
复制为 MD 格式

本文档介绍如何为 Lindorm 表配置冷热分离与 TTL 策略,以实现自动化的数据生命周期管理。

注意事项

Lindorm列存引擎的冷热分离和TTL功能目前处于邀测阶段,如需体验该功能,请联系Lindorm技术支持(钉钉号:s0s3eg3)开启。

使用限制

在开始配置前,请务必了解以下机制:

  • 冷热分离与TTL均为分区级别,仅支持枚举时间分区

  • 整个分区过期后才会删除该分区的全部数据

  • 冷热转换和TTL清理均为异步执行。

冷热分离

在数据管理时,为优化成本与性能,通常会选择将高频访问的数据存储在高性能介质上,而对于长时间未访问的历史数据,则希望将其迁移到低成本的存储介质中。Lindorm 列存引擎支持三级冷热分层解决方案(从热到冷分别为L1、L2L3),可以根据业务需求灵活制定列存数据的冷热转换策略。通过数据湖服务自动完成数据在冷热介质之间的自动转储,帮助您有效管理存储成本而不牺牲关键业务的响应速度。

参数说明

您可以通过在创建列存表时定义CHS(Cold or Hot Storage)属性,以列存表的时间分区为粒度,定义数据冷热转储。配置CHS的参数说明如下:

参数

说明

CHS

冷热分离阈值(秒)。单个值为两层分离,两个值(逗号分隔)为三层分离,详见分层策略说明

CHS_L1

L1层存储介质,默认为容量型云存储。格式:'CHS_L1'='storagetype=目标存储类型'

请根据实例类型选择对应的存储介质:

  • 云存储

    • 容量型云存储:CAPACITY_CLOUD_STORAGE

    • 标准型云存储:STANDARD_CLOUD_STORAGE

    • 性能型云存储:PERFORMANCE_CLOUD_STORAGE

    • 归档型存储:CLOUD_ARCHIVE_STORAGE

  • 本地存储

    • 容量型云存储:CAPACITY_CLOUD_STORAGE

    • 本地SSD存储:LOCAL_SSD_STORAGE

    • 大数据型:LOCAL_HDD_STORAGE

    • 本地ESSD云盘:LOCAL_EBS_STORAGE

说明
  • 若在创建表时没有配置CHS_L1指定存储介质,则默认使用容量型云存储。

  • 归档型存储类型目前在内测中,如需使用请联系Lindorm技术支持(钉钉号:s0s3eg3)开通。

CHS_L2

L2层存储介质,必填项,格式同CHS_L1。

CHS_L3

L3层存储介质,格式同CHS_L1。

CHS参数为两个长整数时,CHS_L3参数必须配置。

CHS_EXP

时间提取表达式,参数格式如下:

toSec(column0, {pattern0}, column1, {pattern1}, ..., columnN, {patternN})

  • columnN:时间分区字段名,支持类型:INTEGER、LONG、VARCHAR、DATE。

  • patternN:时间格式,可选值:yyyy(年)、MM(月)、dd(日)、HH(时)、mm(分)。

toSec系统函数能够计算出对应时间分区范围的最大数据时间。

  • 示例1:时间分区的3个字段为year/month/day,对于year=2023, month=10,day=2这个分区,不同的参数返回的数据时间如下:

    • toSec(year,yyyy):2023-12-31 23:59:59。

    • toSec(year, yyyy, month, MM):2023-10-31 23:59:59。

    • toSec(year, yyyy, month,MM,day,'dd'):2023-10-02 23:59:59。

  • 示例2:若时间分区字段为date,对于date=2023-10-02这个分区,toSec(date, yyyy-MM-dd)返回数据时间为2023-10-02 23:59:59。

Lindorm会基于CHS_EXP获取时间分区的最大数据时间,结合CHS中定义的时间阈值范围,将分区数据转储到相应的分层介质。

分层策略说明

分层模式

CHS配置

数据分布规则

两层分离

单个阈值,如'2592000'

  • 小于等于阈值,则存入L1层。

  • 大于阈值,则自动转储到L2层。

三层分离

两个阈值,如'2592000,5184000'

  • 小于等于阈值1,则存入L1层。

  • 大于阈值1且小于等于阈值2,则自动转储到L2层。

  • 大于阈值2,则自动转储到L3层。

说明

阈值1必须小于阈值2。

说明:阈值单位为秒,表示分区数据时间距离当前时间的差值。

示例说明

  • 示例一

    创建表table0,按年,月,日三个字段分区,字段名称为year,month,day。定义冷热分层策略为:1个月(2592000秒)以前的数据自动转储到容量型云存储。建表语句如下:

    CREATE TABLE table0 (
      col0 INT,
      `year` VARCHAR,
      `month` VARCHAR,
      `day` VARCHAR
    ) PARTITION BY LIST (`identity`(`year`),`identity`(`month`),`identity`(`day`))
    WITH (
      EngineType = 'COLUMN',
      CHS = '2592000',
      CHS_L1 = 'storagetype=STANDARD_CLOUD_STORAGE',
      CHS_L2 = 'storagetype=CAPACITY_CLOUD_STORAGE',
      CHS_EXP = 'toSec(year,yyyy,month,MM,day,dd)'
    );
  • 示例二

    修改table0冷热分层策略为:1个月(2592000秒)以前的数据自动转储到容量型云存储,超过3个月(5184000秒)后自动转储到归档型存储,其他规则不变。更新表语句如下:

    ALTER TABLE table0 SET CHS='2592000,5184000', CHS_L2='storagetype=CAPACITY_CLOUD_STORAGE', CHS_L3='storagetype=CLOUD_ARCHIVE_STORAGE', CHS_EXP='toSec(year,yyyy,month,MM,day,dd)';
  • 示例三

    创建table1,按天分区,字段名为dt,形如:2020/12/1。定义冷热分层策略为:1个月(2592000秒)以前的数据自动转储到容量型云存储,超过3个月(5184000秒)后自动转储到归档型存储。建表语句如下:

    CREATE TABLE table1 (
      col0 INT,
      dt VARCHAR
    ) PARTITION BY LIST (`identity`(dt))
    WITH (
      EngineType = 'COLUMN',
      CHS='2592000,5184000',
      CHS_L2='storagetype=CAPACITY_CLOUD_STORAGE',
      CHS_L3='storagetype=CLOUD_ARCHIVE_STORAGE',
      CHS_EXP='toSec(dt,yyyy/MM/dd)'
    );
  • 示例四

    查看冷热分离相关属性。

    SHOW TABLE VARIABLES FROM table0 like 'CHS%';

注意事项

  • 在创建表时,您可以指定CHS参数。如果后续需要更改冷热分层策略,可以通过执行ALTER TABLE ......语句来调整配置。

  • 错误的CHS配置不会影响表创建与更新,但会导致无法自动触发冷热介质转换功能。

  • 数据的冷热转储过程是通过异步方式触发的。在整个转储过程中及完成后,数据访问均不受影响,但基于不同存储介质,访问性能可能会有所变化。

  • 仅支持基于列存表的时间分区来实现数据冷热分层策略,暂不支持其他方式。

  • 在设置对应存储介质前请确认您的实例已经开通对应的存储类型。

TTL

用户可以为列存数据配置TTL(time to live)参数,来实现定期清理过期分区的功能。

参数说明

参数

参数说明

TTL

配置该参数即表示开启分区过期功能。该值为长整数(秒), 表示如果分区数据时间距离当前时间大于该阈值,则判断为过期分区并进行清除。

比如TTL ='259200',表示分区数据时间距离当前时间大于259200(秒)的分区会被清除。

TTL_MODE

分区数据时间提取方式。推荐使用specified,根据用户配置的时间格式提取分区数据时间,分区格式指定请参考TTL_EXP

TTL_EXP

时间提取表达式,参数格式如下:

toSec(column0, {pattern0}, column1, {pattern1}, ..., columnN, {patternN})

  • columnN:时间分区字段名,支持类型:INTEGER、LONG、VARCHAR、DATE。

  • patternN:时间格式,可选值:yyyy(年)、MM(月)、dd(日)、HH(时)、mm(分)。

toSec系统函数能够计算出对应时间分区范围的最大数据时间。

  • 示例1:时间分区的3个字段为year/month/day,对于year=2023, month=10,day=2这个分区,不同的参数返回的数据时间如下:

    • toSec(year,yyyy):2023-12-31 23:59:59。

    • toSec(year, yyyy, month, MM):2023-10-31 23:59:59。

    • toSec(year, yyyy, month,MM,day,'dd'):2023-10-02 23:59:59。

  • 示例2:若时间分区字段为date,对于date=2023-10-02这个分区,toSec(date, yyyy-MM-dd)返回数据时间为2023-10-02 23:59:59。

Lindorm 数据湖服务会基于TTL_EXP获取时间分区的最大数据时间,结合TTL中定义的时间阈值范围,判断目标分区是否已过期。

示例说明

  • 示例一

    创建表table0,按年,月,日三个字段分区,字段名称为year,month,day。定义分区过期规则为:1个月(2592000秒)以前的数据自动清除,根据用户配置提取时间。建表语句如下:

    CREATE TABLE table0 (
      col0 int, 
      `year` VARCHAR, 
      `month` VARCHAR, 
      `day` VARCHAR
    ) PARTITION BY LIST (`identity`(`year`), `identity`(`month`), `identity`(`day`))
    WITH (
      EngineType = 'COLUMN',
      TTL='2592000', 
      TTL_MODE='specified', 
      TTL_EXP='toSec(year, yyyy, month, MM, day, dd)'
    );
  • 示例二

    创建table1, 按天分区,分区字段名为dt,形如:2020/12/1。定义分区过期规则为:1个月(2592000秒)以前的数据自动清除,根据用户配置提取时间。建表语句如下:

    CREATE TABLE table1 (
      col0 int, 
      dt VARCHAR
    ) PARTITION BY LIST (`identity`(dt))
    WITH (
      EngineType = 'COLUMN',
      TTL='2592000', 
      TTL_MODE='specified', 
      TTL_EXP='toSec(dt, yyyy/MM/dd)'
    );
  • 示例三

    对已存在表增加TTL能力。

    ALTER TABLE table1 SET TTL='2592000', TTL_MODE='specified', TTL_EXP='toSec(dt, yyyy-MM-dd)';
  • 示例四

    查看TTL相关属性。

    SHOW TABLE VARIABLES FROM table0 like 'TTL%';

注意事项

  • 建表时您可指定TTL参数,当数据过期时间变化时,可使用ALTER TABLE ...  语句更新配置。

  • 错误的TTL配置不会影响表创建与更新,但会导致分区删除功能无法自动执行。

  • 分区过期策略必须基于列存表的时间分区实现,暂不支持其他方式。