玩转DB里的数据-阿里云DMS任务编排之简介和实操

9次阅读

共计 6204 个字符,预计需要花费 16 分钟才能阅读完成。

1. 任务编排介绍

数据库是企业 IT 系统里的重要基础设施,里面存储了大量有价值的数据资产,如:交易数据、客户数据、订单数据,等等。其实,数据库在企业里一直扮演着一个数据生产者(Producer)的角色,日积月累这些数据会形成一个巨大的宝藏。但是,随着数据库中数据量的增长和数据形态的多样化,如何对数据进行存储、迁移和加工,并挖掘出其中的价值,是许多企业面临的难题。

为解决上述问题,阿里云 DMS(Data Management Service)产品近期推出了一个新功能——任务编排。无论您的数据库部署在何处(阿里云 / 本地 IDC/ 其他云厂商等),是何种类型(OLTP 交易型数据库 /OLAP 分析型数据库),DMS 任务编排都能够触达您的数据库,让您轻松地对数据库中的数据进行流转、加工和变换。DMS 任务编排提供的主要功能和特性包括:

  • 丰富的数据迁移能力:可实现数据库与数据库之间(如:OLTP 在线库与 OLAP 离线库)、数据库与弹性存储之间(如:MySQL 与 OSS)的数据自由流动;
  • 丰富的数据加工手段:单库 SQL 任务、跨库 SQL 任务、数据迁移任务、Spark 任务、数据备份与恢复服务(建设中);不仅可以通过 SQL 语句对单个数据库或多个数据库里的数据进行加工,还可编写 Spark 任务进行复杂的数据处理和 AI 分析;
  • 任务流和定时调度:通过可视化的方式将多个任务节点进行编排形成任务流,灵活按需设置多种不同粒度间隔的定时调度;
  • 按模板一键创建任务流:为不同的场景(如:历史数据归档到 OSS)内置了任务流模板,用户可一键生成模板任务流,通过简单的配置即可应用于生产;
  • 牢靠的数据安全保障:依托 DMS 强大的数据安全能力,任务编排会对用户权限进行严格检查,仅限有权限的用户才能执行相应的任务。

了解了 DMS 任务编排的功能,你一定开始好奇用 DMS 任务编排能做什么?下图展示了 DMS 任务编排支持的四类主要场景:

场景 1:数据归档

目前比较流行的有两类数据库:传统单机版数据库(如:MySQL)和云原生数据库(如:阿里云 PolarDB 和 AnalyticDB for MySQL)。前者的存储空间是有限的,后者虽然可以对存储扩容,但也要收取较高的费用。那么,当数据库中的数据量持续增长时,该如何降低存储成本呢?许多用户希望能将数据库中的冷数据 / 历史数据转储到可靠又低价的存储上,如:阿里云对象存储(OSS)。现在通过 DMS 任务编排,可轻松实现数据库数据周期归档(如:每日 / 每周)到 OSS 的需求。同时,DMS 还有好地对接了阿里云数据湖分析产品(DLA),用户可在 DMS 里方便地访问 DLA,对归档到 OSS 上的数据进行即席查询和分析。

场景 2:数据集成

企业的数据可能分散在不同的数据源中(如:MySQL、SQL Server),也可能分散在不同的地域(例如:北京、杭州、深圳)。导致数据分散的原因有很多,比如:业务的垂直划分、微服务、应用的本地部署等等。数据的分散不可避免,但同时许多企业又有数据集成的需求,需要将各地的数据汇聚到一起进行全局分析(如:汇总和 AI 分析),典型的场景就是 OLTP 交易库的数据同步至 OLAP 分析库做离线分析。通过 DMS 任务编排,可以轻松实现这一需求。首先,DMS 打通了各种网络环境(如:阿里云 VPC/ 经典网络,本地 IDC 网络),可连接至各个地域的数据源。其次,DMS 支持异构数据源间的数据集成,如:RDS MySQL 到 AnalyticDB。此外,通过 DMS 任务编排,还能满足各种集成方式的需求,如:单次全量集成、周期性增量集成。

场景 3:数据加工

做完数据集成之后,用户通常还要对汇聚的原始数据进行加工、清洗和分析,才能挖掘出其中的价值,例如:每日统计产品的用户数(UV),按周产生报表数据。DMS 任务编排提供了任务流和定时调度能力,通过任务流可以将复杂加工任务进行拆解和编排,然后配置调度信息。DMS 支持单次调度和周期调度(如:按日、周、月),此外还支持多类型的加工任务,用户可使用 SQL 进行数据加工,也可编写 Spark 程序进行复杂的数据处理和 AI 分析。通过丰富的调度配置和任务类型,DMS 任务编排能满足各种简单 / 复杂场景的数据加工需求。

场景 4:定时操作

在日常数据库的使用中,有许多 DML/DDL/DCL 操作需要定期执行,如:每周清理历史数据(DELETE)防止表过大、每日更新统计信息(ANALYZE TABLE)以获得更好的查询优化结果。有些数据库在内核层面已经提供了事件调度功能,如:MySQL Event,但是使用特殊的语法创建 Event 和维护 Event 都有一定的成本。DMS 任务编排的调度功能提供了可视化的方式轻松创建定时任务,并且不依赖数据库引擎上的能力,因此更加简易灵活,适用范围更广。

2. 任务编排实操 — DB 数据周期归档

介绍完 DMS 任务编排的功能和使用场景,下面将以数据归档场景为例,介绍如何通过 DMS 任务编排和阿里云 DLA 服务将 RDS MySQL 数据周期地归档至 OSS 上。具体的实操步骤还可查阅 DMS 的使用文档。

2.1 背景和需求

用户的 RDS MySQL 业务库中某张表(如:交易记录、登录 / 操作日志)的数据持续增长,占用了大量的存储空间,甚至影响到了数据库性能。同时,这部分数据又是有价值的,比如:用于审计、报表和统计分析,不能随意删除。为解决这个问题,用户有三个核心的需求:

• 降低 MySQL 业务库的存储压力;

• 对历史业务数据做增量归档;

• 对归档数据做分区,可按分区过滤进行高效查询。

为满足这三个需求,我们选择了阿里云 DLA 服务,因为其同时打通了 OSS 和 RDS MySQL,能够对上面的数据进行迁移和即席分析。但是,DLA 并不具备周期调度和增量数据迁移的能力,DMS 任务编排正好可以与 DLA 互补,形成完整的解决方案满足用户需求。

在下面的实操中,我们假设用户 RDS MySQL 中待归档的表为订单表 orders,其表结构如下(created_date 字段为订单创建日期):

create table orders(
  order_id bigint,
  product_name varchar(32),
  price double,
  total_amount double,
  created_date date
);

2.2 前置条件

1、已购买阿里云 DLA 服务,且 DLA 服务的区域(Region)和待归档的 RDS MySQL 区域一致,如:都是华东 1(杭州)

2、已开通阿里云 OSS 服务,且服务的区域与 DLA、RDS MySQL 一致

3、已购买阿里云 DMS 服务

4、DLA 实例已录入 DMS 中(请参考 DMS 实例录入)
各产品的购买要求和用途:

产品

购买产品的区域

用途

DMS

无限制

周期调度

DLA

与 RDS MySQL 同区域

RDS MySQL 数据迁移至 OSS;查询 OSS 上的归档数据

OSS

与 RDS MySQL 同区域

存储 RDS MySQL 归档的数据

2.3 配置任务流

下面介绍如何在 DMS 中操作实现 RDS MySQL 数据周期归档,主要包含 5 个步骤:

步骤 1:创建 DLA 归档库

若要将数据归档至 DLA 上,首先要在 DLA 中创建一个用于归档的 schema,用于存放归档表。在 DMS 首页的顶部菜单中,找到 SQLConsole 单库查询,并打开查询窗口,然后输入如下 SQL 语句并执行:

CREATE DATABASE demo_schema
WITH DBPROPERTIES (
    catalog = 'oss',
    location = 'oss://xxxxxx/dla_demo/'
)

步骤 2:创建任务流

在 DMS 首页的顶部菜单中,选择 数据工厂 -> 任务编排,进入任务编排的首页。在首页点击“新建任务流”,或者点击左侧 tab 进入开发空间,也可以快速地找到新建任务流的入口。在新建任务流的窗口,我们将任务流名称设为:rds_data_to_oss。

步骤 3:配置任务节点

在任务流 rds_data_to_oss 中,依次新建三个 DLA-SQL 类型的任务节点:

  1. 创建 RDS 同步 Schema:在 DLA 中创建 Scheme 映射到 RDS
  2. 创建 OSS 备份表:在 DLA 中建立 OSS 备份表,用于存储历史数据
  3. 备份数据:实现 RDS MySQL 前一天数据的备份。

节点创建完以后,可在节点间添加连线,对节点的执行顺序进行编排,产生完整任务流。

下面对每个节点的内容进行设置:

节点 1:创建 RDS 同步 Schema

要让 DLA 顺利访问 RDS MySQL 的数据,需要在 DLA 中为 RDS MySQL 创建一个 Schema,取名: dla_mysql_rds。我们将以 SQL 的方式来创建 Schema。首先,点击第一个任务节点,在右侧的内容设置 Tab 页中,输入如下 SQL 语句(其中部分参数需替换为 RDS 上的真实信息):

CREATE SCHEMA IF NOT EXISTS dla_mysql_rds WITH DBPROPERTIES (
   CATALOG = 'mysql', 
   LOCATION = 'jdbc:mysql://xxxxxx.rds.aliyuncs.com:3306/dmstest',
   USER = 'dmstest',
   PASSWORD = 'xxxxxxxxx',
   INSTANCE_ID = 'xxxxxx'
 );
 MSCK REPAIR DATABASE dla_mysql_rds;

此外,为了让 DLA 顺利访问 RDS MySQL,还需要在 RDS MySQL 中添加 DLA 的白名单,即:将 IP 地址段 100.104.0.0/16 加入到 RDS 的白名单列表中。RDS 白名单的配置方法可参考这个文档。

节点 2:创建 OSS 备份表

我们需要在 DLA 中创建 OSS 备份表(oss_orders),首先将节点的目标数据库设为 demo_schema,然后将节点内容设置为如下的 SQL 语句。oss_orders 表的结构与 RDS 中的 orders 表完全一致,不同的是 oss_orders 为分区表,按照年 / 月 / 日(y/m/d)分区:

CREATE EXTERNAL TABLE oss_orders (
    order_id bigint,
    product_name varchar(32),
    price double,
    total_amount double,
    created_date date)
PARTITIONED BY (y string, m string, d string)
STORED AS TEXTFILE
LOCATION 'oss://xxxxxx/dla_demo/';

其中,LOCATION 参数需要填写一个 OSS 路径,即:归档数据储存的 OSS 地址。

节点 3:数据备份

该数据备份实现了将 RDS MySQL 数据备份至 OSS 的功能。配置节点需要选择目标数据库为 DLA 的 demo_schema,设置时间变量,并且编写备份 SQL 语句。

配置三个时间变量,它们分别是:
• year:当前日期前一天的年份(格式为 yyyy)
• month:当前日期前一天的月份(格式为 MM)
• day:当前日期前一天的日(格式为 dd)

注:关于 DMS 任务编排中变量的配置和使用,请参阅该文档。bizdate 为 DMS 任务编排里的系统参数,对应到任务运行时间的前一天,其他自定义变量也会随着任务执行时间的变化而自动更新。

设置数据备份 SQL 语句

/* 创建临时表 */
CREATE EXTERNAL TABLE oss_orders_tmp (
    order_id bigint,
    product_name varchar(32),
    price double,
    total_amount double,
    created_date date) 
STORED AS TEXTFILE 
LOCATION 'oss://xxxxxx/dla_demo/y=${year}/m=${month}/d=${day}' 
TBLPROPERTIES('auto.create.location'= 'true');

/* 备份日数据 */
insert into oss_orders_tmp
SELECT * FROM dla_mysql_rds.orders 
where created_date = '${bizdate}';
      
/* 更新备份表分区信息以及删除临时表 */
msck repair table oss_orders;
drop table oss_orders_tmp;

上面的 SQL 脚本本质上包括 3 个步骤来实现数据备份:

  1. DLA OSS 中创建临时表:临时表 oss_orders_tmp 映射位置为 oss_orders 所在 OSS 之下的年 / 月 / 日目录中,临时表的数据会自动成为 oss_orders 一个分区;
  2. 备份日数据:直接使用 insert-select SQL 语句从 RDS MySQL 中的 orders 表中读取数据(对应到 DLA 中的 dla_mysql_rds.orders),写入 OSS 中的临时表;
  3. 更新分区信息以及删除临时表:更新 oss_orders 元数据信息,然后删除临时表 oss_orders_tmp。

这里的巧妙之处在于,合理地利用了 DMS 任务编排里变量的功能,以及 DLA OSS 表的分区功能。临时表对应的 OSS 路径正好是全局备份表的一个分区路径。随着任务每日执行,变量的值会自动更新,由此产生新的 OSS 目录和分区,RDS MySQL 的增量数据也自动地归档至新分区下。例如:RDS 中 created_date 为 2020-06-01 的数据,将归档至 oss://xxxxxx/dla_demo/y=2020/m=06/d=01 的路径下。

2.4 配置任务流调度

最后,再介绍一下如何对任务流的调度进行配置。点击任务流空白处,调出右侧的调度配置页面。首先将该任务流的调度进行开启,然后将运行时间设为 RDS MySQL 的业务低峰期(如:凌晨 5 点),并将调度周期设为“日”。这样设置以后,该任务流将在每天的 5 点钟定期执行,无需人工干预。如果要查看任务流的执行历史,可点击左侧的运维中心,其中还会展示每一次执行的时间和日志。

3 快速任务流构建 — 任务流模板

为了节省用户手动创建和配置任务流的时间,DMS 任务编排还提供了多种模板。这些模板通常包含了内置好的任务节点和 SQL 内容;它们从具体的场景出发,经过悉心的设计来解决实际问题,并且来源于 DMS 用户的真实案例,例如:第二节介绍的 RDS 数据周期归档 OSS 场景就来自于某知名跨国汽车厂商。

通过模板,用户可一键创建任务流,然后经过简单的配置,如:设置节点的目标数据库和 SQL 中的部分参数,即可生成可运行的任务流。目前,我们已经上线了多个任务流模板,欢迎访问 DMS 任务编排的首页进行查看,我们也将持续补充模板,让任务编排的使用更加便捷。

4 总结

DMS 是阿里云用户非常喜爱的一款数据库工具产品,能帮助用户打通各种网络环境,对数据库进行管理和操作。除了常规的数据库增删改查和 DDL 操作,越来越多的用户需要对数据库中的数据进行归档、迁移、备份和加工。为了满足这些需求,DMS 推出了任务编排功能,它打通了数据库与其他系统 / 存储之间的通道,让数据库不再成为数据孤岛。此外,DMS 任务编排还提供了丰富的任务类型,以及任务流和定时调度能力,可以帮助用户轻松地对数据库中的数据进行清洗加工,把数据转变成商业智能。

DMS 任务编排虽然在公共云上发布不久,但已经积累了来自各个行业的众多用户,包括:互联网、零售、支付、交通、汽车、美妆等等。如果您想了解更多 DMS 任务编排的详细功能,欢迎登录 DMS 的控制台首页进行体验,或者查看我们的产品文档。也欢迎您扫码加入 DMS 的钉钉用户服务群进行交流和咨询。

正文完
 0