Logo
数据归档

数据归档 #

简介 #

SphereEx-DBPlusEngine 数据归档插件是一款用于将数据库中的历史数据进行归档的插件,支持将历史数据归档到指定的存储介质中,以减少数据库的存储压力,提高数据库的性能。

挑战和目标 #

数据库中的历史数据通常占据了大量的存储空间,而且这些历史数据通常不会被频繁访问,但是这些历史数据却会对数据库的性能产生影响。因此,将历史数据归档到指定的存储介质中,可以减少数据库的存储压力,提高数据库的性能。

目前 SphereEx-DBPlusEngine 数据归档插件所支持的数据库产品为 MySQL,具体支持版本如下。

数据库版本支持
1MySQL5.7.x ~ 8.x

应用场景 #

  • 数据库中的历史数据占据了大量的存储空间,但是这些历史数据不会被频繁访问。
  • 数据库的性能受到历史数据的影响,需要将历史数据归档到指定的存储介质中,以提高数据库的性能。

使用限制 #

  • 数据归档插件当前只支持 MySQL 数据库, 并且目前只支持删除归档数据,但是预留了接口,可以支持将归档数据备份到指定的存储介质中。
  • 表结构需要满足数据库 partition 的相关要求,例如分区字段需要包含在主键和唯一键中
  • 分区键仅支持 datetime、date 类型
  • 分区键需要插入当前时间

原理介绍 #

通过为表设置归档规则,SphereEx-DBPlusEngine 利用数据库的 RANGE 分区特性可以灵活高效地对数据的生命周期进行管理。

  • 采用底层表按照时间进行 RANGE 分区的方式来支持归档功能 (分区方式扩展为 SPI,未来可支持其它方式)
  • 根据用户配置以及当前时间,通过定时任务来自动删除/备份过期的分区,创建提前分配的分区 下图展示了 t_order 表对应的分表 t_order_0 和 t_order_1 对应的实际分区,随着时间的流逝,自动删除/备份分区数据,创建分区的过程。 归档原理介绍

配置示例 #

YAML 配置 #

表 t_order 为例,配置归档规则,将表 t_order 按照 creation_date 字段进行时间分区,每个分区的时间间隔为 1 个月,保留 12 个分区,预分配 3 个分区,定时任务调度器为 timed_task_scheduler。

  - !ARCHIVE
    tables:
      t_order:
        archiveStrategy:
          archiveColumns: creation_date
          archiveAlgorithmName: time_partition
        archiveScheduler: timed_task_scheduler
    archiveAlgorithms:
      time_partition:
        type: SphereEx:DATETIME_PARTITION
        props:
          interval-unit: DAYS
          interval-amount: 1
          retain-amount: 5
          pre-allocate-amount: 2
    archiveSchedulers:
      timed_task_scheduler:
        type: SphereEx:TIMED_TASK
        props:
          schedule-cron-expr: "0/5 * * ? * *"

DistSQL 配置 #

  1. 创建归档规则
CREATE ARCHIVE RULE t_order (
  ARCHIVE_STRATEGY (
    ARCHIVE_COLUMNS = creation_date,
    ARCHIVE_ALGORITHM (
      TYPE (
        NAME = "SphereEx:DATETIME_PARTITION",
        PROPERTIES (
          "interval-unit" = "DAYS",
          "interval-amount" = 1,
          "retain-amount" = 5,
          "pre-allocate-amount" = 2
        )
      )
    )
  ),
  SCHEDULER_ALGORITHM (
    TYPE (
      NAME = "SphereEx:TIMED_TASK",
      PROPERTIES ("schedule-cron-expr" = "0/5 * * ? * *")
    )
  )
);
SHOW ARCHIVE TABLE RULE t_order;
  1. 创建示例表
CREATE TABLE t_order (
  order_id BIGINT,
  user_id INT NOT NULL,
  status VARCHAR(50) NOT NULL,
  merchant_id INT,
  remark VARCHAR(50) NOT NULL,
  creation_date DATE NOT NULL,
  PRIMARY KEY (order_id, creation_date)
);
show create table t_order;
  1. 插入示例数据
INSERT INTO t_order (order_id, user_id, status, merchant_id, remark, creation_date)
VALUES
(0, 100, 'Completed', 1000, 'Remark 0', CURDATE() - INTERVAL 5 DAY),
(1, 101, 'Pending', 1001, 'Remark 1', CURDATE() - INTERVAL 4 DAY),
(2, 102, 'Completed', 1002, 'Remark 2', CURDATE() - INTERVAL 3 DAY),
(3, 103, 'Canceled', 1003, 'Remark 3', CURDATE() - INTERVAL 2 DAY),
(4, 104, 'Processing', 1004, 'Remark 4', CURDATE() - INTERVAL 1 DAY),
(5, 105, 'Shipped', 1005, 'Remark 5', CURDATE());
select * from t_order;
select * from t_order partition(p20250112);
  1. 修改系统时间为一天后 再次查看底层表结构
select now();
show create table t_order;
  1. 查看最旧的示例数据被删除
select * from t_order;