本来介绍如何通过任务编排实现周期性地将MySQL InnoDB表中的历史数据迁移至MySQL X-Engine表,实现低成本的RDS X-Engine存储方案。

前提条件

源库和目标库实例满足以下条件:
  • 源库为RDS MySQL InnoDB数据库。
  • 目标库为RDS MySQL X-Engine数据库,创建方法请参见创建RDS MySQL实例
  • 管控模式均为安全协同。
  • 源库和目标库均已开启跨库查询,开启方法请参见编辑实例
    说明 本案例中RDS MySQL InnoDB引擎对应的DBLink名称为dblink_src_rds,RDS MySQL X-Engine引擎对应的DBLink名字为dblink_target_rds。

背景信息

为解决企业随着业务的发展,数据库存储膨胀而导致存储成本急剧上升、数据库性能出现下降等问题,阿里云推出基于X-Engine存储引擎的低成本存储方案。通过将现有MySQL InnoDB表中的历史数据迁移至MySQL X-Engine引擎上,仅保留最近的热数据的方式,可降低企业存储成本,提高数据库安全及可用性。
说明 X-Engine是阿里云自研的OLTP数据库存储引擎,已经广泛应用在阿里集团内部诸多业务系统中,包括交易历史库、钉钉历史库等核心应用,大幅缩减了业务成本,同时也作为双十一大促的关键数据库技术,挺过了数百倍平时流量的冲击。X-Engine的性能与InnoDB存储引擎相似,但是存储成本远低于InnoDB,因此拥有极高的性价比。更多信息请参见 X-Engine简介
流程如下图所示: 流程图

您可以使用DMS的任务编排功能实现历史数据定期、自动地迁移到X-Engine上,降低人工操作的成本。

本文将介绍在DMS任务编排中,创建可周期性地(每天)将MySQL InnoDB表中的历史数据(一个月前)迁移至MySQL X-Engine表上,然后对InnoDB表进行历史数据清理和表空间优化的任务流。随着任务流的周期运行,MySQL InnoDB表中将只保留最近一个月的数据,而大量历史数据则保存至低成本的X-Engine引擎上。

创建任务流

  1. 登录DMS控制台
  2. 在顶部菜单栏中,单击数据工厂 > 任务编排
  3. 任务编排页面的自由编排任务区域,单击新建任务流
  4. 新建任务流对话框,将任务流名称设置为Rds_innodb_to_X-Engine,将描述设置为Rds_innodb_to_X-Engine demo,单击确认。即会进入任务编排页面。
    新建任务流

创建任务节点

本章节将介绍在Rds_innodb_to_X-Engine任务流中创建4个任务节点:
  • 创建X-Engine表:创建数据转储的目标表。
  • 历史数据迁移:利用DSQL跨库查询的能力将InnoDB表的数据迁移至X-Engine表上。
  • 删除InnoDB表的历史数据:删除InnoDB表中已迁移的数据。
  • 优化InnoDB表:历史数据删除后,可通过OPTIMIZE命令对InnoDB表空间进行优化,以节省存储空间。
  1. 任务编排页面中,创建并配置以下节点:
    创建X-Engine表
    1. 将左侧任务类型中的MySQL拖拽到页面中的空白区域。
    2. 双击画面中的目标任务节点,重命名为:创建X-Engine表,按回车保存节点名。
    3. 单击此节点,在右侧面板中选中内容设置页签。
    4. 内容设置页签中,从数据库列表,选择RDS MySQL X-Engine数据库实例。
    5. 输入以下建表语句,并单击保存
      CREATE TABLE IF NOT EXISTS `target_xengine_tbl` (
        `id` BIGINT,
        `price` DECIMAL(10,2),
        `count` INT,
        `trx_time` DATETIME,
        PRIMARY KEY (`id`)
      ) ENGINE=XENGINE DEFAULT CHARSET=utf8;
      说明 本案例中将目标表命名为: target_xengine_tbl,且该表的表结构与InnoDB业务库里的表结构 src_innodb_tbl必须一致。
      创建X-Engine表建表语句
    历史数据迁移
    1. 将左侧任务类型中的跨库SQL拖拽到页面中的空白区域。
    2. 双击画面中的目标任务节点,重命名为:历史数据迁移,按回车保存节点名。
    3. 单击此节点,在右侧面板中选中内容设置页签。
    4. 输入以下语句,并单击保存
      INSERT INTO `dblink_target_rds`.`target_db`.`target_xengine_tbl`
       (`id`, `price`, `count`, `trx_time`)
      SELECT `id`, `price`, `count`, `trx_time`
      FROM `dblink_src_rds`.`src_db`.`src_innodb_tbl`
      WHERE `trx_time` >= '${thirty_one_days_ago}'
      AND `trx_time` < '${thirty_days_ago}';
      说明 该语句的主要作用是将InnoDB表的部分数据迁移至X-Engine表中。
      • 本案例中dblink_src_rds指源RDS MySQL InnoDB引擎的数据库实例,dblink_target_rds指目标RDS MySQL X-Engine引擎的数据库实例。
      • 迁移数据的范围(WHERE条件)由两个任务流变量来控制:${thirty_one_days_ago}${thirty_days_ago}
      历史数据迁移
    5. 单击任务流中画布的空白处,在右侧面板中选中全局变量页签,参考下图添加变量名为thirty_one_days_agothirty_days_ago的变量,并单击保存
      配置全局变量
    删除InnoDB表的历史数据
    1. 将左侧任务类型中的MySQL拖拽到页面中的空白区域。
    2. 双击画面中的目标任务节点,重命名为:删除InnoDB表的历史数据,按回车保存节点名。
    3. 单击此节点,在右侧面板中选中内容设置页签。
    4. 内容设置页签中,从数据库列表,选择RDS MySQL InnoDB数据库实例。
      说明 该节点的目的是删除RDS MySQL InnoDB表中对已迁移的数据。
    5. 输入以下语句,并单击保存
      DELETE FROM `src_innodb_tbl`
        WHERE `trx_time` >= '${thirty_one_days_ago}'
        AND `trx_time` < '${thirty_days_ago}';
      删除InnoDB表的历史数据
    优化InnoDB表
    1. 将左侧任务类型中的MySQL拖拽到页面中的空白区域。
    2. 双击画面中的目标任务节点,重命名为:优化InnoDB表,按回车保存节点名。
    3. 单击此节点,在右侧面板中选中内容设置页签。
    4. 内容设置页签中,从数据库列表,选择RDS MySQL InnoDB数据库实例。
    5. 输入以下语句,并单击保存
      OPTIMIZE TABLE `src_innodb_tbl`;
      优化InnoDB
      说明 为避免运行OPTIMIZE命令对在线业务的影响,建议您将RDS实例开启OnlineDDL功能(如下图所示),开启方法请参见 编辑实例开启onlineDDL
  2. 在任务流中的画布中,按顺序将4个任务节点进行连接。
    连接任务节点

开启调度任务

  1. 单击任务流中画布的空白处,在右侧面板中选中调度配置页签,打开开启调度按钮,参考下图完成配置。
    调度配置
    说明 为避开业务高峰期,本案例的调度配置为每日凌晨01:00运行,您可以按需配置调度计划。
  2. 单击保存即可。