阿里妹导读
引言
在应对大规模业务数据的在线统计分析需求时,传统数据库常常难以满足高性能和实时分析的要求。随着业务数据的不断累积,数据量迅速膨胀,虽然可以通过扩展数据库配置来暂时提升查询性能,但扩容过程中会影响用户体验和业务连续性。如何快速灵活地将复杂查询操作与日常业务事务处理分开,通常需要大量开发工作来实现 OLTP 数据库与 OLAP 数据库之间的数据同步,并确保数据的一致性。
本文将介绍结合 AnalyticDB MySQL + DTS 来解决 MySQL 的数据分析性能问题。通过 DTS(数据传输服务),实现 MySQL 到云原生数据仓库 AnalyticDB MySQL 版的实时数据同步。DTS 提供全量校验和增量校验功能,确保两者之间的数据一致性。在云原生数据仓库 AnalyticDB MySQL 版中创建交互式资源组,并通过数据库账号将其绑定至资源组,SQL 查询根据绑定关系路由到相应的资源组进行执行,最终由云原生数据仓库 AnalyticDB MySQL 版对外提供应用查询服务。其优势在于:
1.简单易用
AnalyticDB MySQL 高度兼容 MySQL 协议和多种 SQL 标准,且提供了窗口函数、圈人函数、漏斗留存函数、路径分析函数等多种函数,满足多种数据分析场景。
2.高性能
超大规模数据写入实时可见,确保数据的强一致性。支持秒级甚至毫秒级对海量数据进行查询和计算,复杂 SQL 查询速度相比传统的关系型数据库快多倍。
3.低成本
存储计算分离,支持计算资源按需在线扩缩容、分时弹性和按需弹性等功能。同时支持冷热数据分层存储,按实际使用的存储空间计费,降低了计算和存储的成本。
4.应用场景广泛
业务报表统计:利用 AnalyticDB MySQL 的高性能分析能力,在金融、零售、制造业等领域提供快速的报表查询引擎。
交互式运营分析:利用 AnalyticDB MySQL 的实时交互式查询分析能力,帮助用户在多维数据集中更全面的分析和决策。
实时数仓:利用 DTS 和 AnalyticDB MySQL 实现数据实时同步,通过实时数据的快速分析和洞察,为业务决策提供了有力支持。
方案概览
一键加速, AnalyticDB MySQL 版构建企业级数据分析平台
使用 DMS 的测试数据构建模拟生成生产数据到云数据库 RDS MySQL 版实例,利用 DTS 实现用户可视化操作,通过一键数据同步,灵活配置云数据库 RDS MySQL版实例与云原生数据仓库 AnalyticDB MySQL 版集群之间的数据表实时同步。DTS 提供全量校验和增量校验功能,确保云数据库 RDS MySQL 版实例与云原生数据仓库 AnalyticDB MySQL 版集群的数据一致性。借助云原生数据仓库 AnalyticDB MySQL 版集群的在线实时分析能力,解决大规模业务数据的在线统计分析需求。
方案架构
1个专有网络 VPC:为云数据库 RDS MySQL 版实例和云原生数据仓库 AnalyticDB MySQL 版集群等云资源构建云上私有网络。
1个云数据库 RDS MySQL 版实例:用于在线事务处理(OLTP)系统的数据库,存储业务系统数据。
1个 DTS(数据传输服务)实例 : 用于实现云数据库 RDS MySQL 版实例与云原生数据仓库AnalyticDB MySQL 版集群之间的数据实时同步。
1个云原生数据仓库 AnalyticDB MySQL 版集群:作为 DTS 数据同步的目标端,同时优化数据查询性能,为实时报表生成和交互式运营分析等 OLAP 业务提供快速响应支持。
数据管理 DMS:用于数据库实例管理,用来连接云原生数据仓库 AnalyticDB MySQL 版集群和云数据库 RDS MySQL 版实例。
2.技术架构图如下:
操作流程
部署资源
一、创建专有网络 VPC 和交换机
二、创建云数据库 RDS MySQL 版实例
三、创建云原生数据仓库 AnalyticDB MySQL 版集群
创建数据同步账号
一、创建云原生数据仓库 AnalyticDB MySQL 版集群高权限账号与资源组
1、创建高权限账号
https://ads.console.aliyun.com/ , 根据控制台提示,设置账号名称(本方案示例为 adb_admin)和密码。账号类型选择高权限账号,单击确定。
2、创建Interactive型资源组
https://ads.console.aliyun.com/ ,在资源组管理页面,单击资源组列表右上角的新增资源组。设置资源组名称(本方案示例为 xihe_mpp),任务类型为 Interactive,Cluster 大小(本方案示例为16ACU),最小Cluster个数(本方案示例为 1),最大Cluster个数 (本方案示例为 2)。选择完成后,单击确定。
单击绑定用户。在弹出的绑定用户对话框,在用户名下拉框选择用户(本方案示例为adb_admin),然后单击绑定用户,最后单击右上角关闭图标。
二、创建云数据库 RDS MySQL 版实例高权限账号
https://rdsnext.console.aliyun.com/rdsList/cn-shanghai/basic,在用户账号页签中,单击创建账号按钮, 设置数据库账号(本方案示例为 db_user)、账号类型(本方案示例为高权限账号)、密码信息(用户自定义),填写完成后单击确定。
构建测试数据
本阶段构建用于测试的业务系统表数据,为后续数据同步、数据分析做准备。
在云数据库 RDS 控制台实例列表页,基本信息页面的右上角,单击登录数据库。
https://rdsnext.console.aliyun.com/rdsList/cn-shanghai/basic
输入云数据库 RDS MySQL 创建的数据库账号和密码,点击测试连接,连接通过,单击登录。
登录完成以后,默认数据库为 information_schema ,同时生成一个新的SQLConsole ,在 SQLConsole 中输入下面代码块中的 SQL 语句,然后单击,完成数据库和数据表的创建。
-- 创建数据库
CREATE DATABASE IF NOT EXISTS workshop;
-- 用户信息表
CREATE TABLE IF NOT EXISTS workshop.user_info (
user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
user_name VARCHAR(255) NOT NULL COMMENT '用户名',
gender ENUM('M', 'F') COMMENT '性别,M为男性,F为女性',
city_id INT COMMENT '城市ID',
create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='用户信息表';
-- 城市信息表
CREATE TABLE IF NOT EXISTS workshop.city_info (
city_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '城市ID',
city_name VARCHAR(255) NOT NULL UNIQUE COMMENT '城市名称',
create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='城市信息表';
-- 产品信息表
CREATE TABLE IF NOT EXISTS workshop.product_info (
product_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',
product_name VARCHAR(255) NOT NULL UNIQUE COMMENT '产品名称',
product_price DECIMAL(10, 2) NOT NULL COMMENT '产品价格',
create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='产品信息表';
-- 订单信息表
CREATE TABLE IF NOT EXISTS workshop.order_info (
order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
user_id INT NOT NULL COMMENT '用户ID',
product_id INT NOT NULL COMMENT '产品ID',
quantity INT NOT NULL COMMENT '数量',
order_status ENUM(
'PENDING', -- 待处理
'PAID', -- 已支付
'SHIPPED', -- 已发货
'DELIVERED', -- 已送达
'CANCELLED', -- 已取消
'RETURNED' -- 已退货
) NOT NULL DEFAULT 'PENDING' COMMENT '订单状态',
order_date DATETIME NOT NULL COMMENT '订单时间',
is_delete TINYINT DEFAULT 0 comment '0 表示未删除,1 表示已删除',
create_dt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='订单信息表';
单击页面左上角快捷菜单,单击全部功能,然后在筛选框中输入“测试数据构建”,单击测试数据构建。
进入测试数据构建工单列表页签,单击右侧测试数据构建。
测试数据构建,依次对city_info,user_info,product_info,order_info 进行测试数据构建。
单击 ,显示状态为任务执行完成,测试数据构建完成。
配置数据同步
到目前为止,我们通过测试数据构建模拟生成业务系统数据,接下来我们需要将云数据库 RDS MySQL 版实例中业务系统数据同步到云原生数据仓库 AnalyticDB MySQL 版集群中。
https://dtsnew.console.aliyun.com/sync/cn-shanghai
在左侧导航栏,单击数据同步。在数据同步页面中,单击创建任务按钮,按照如下规划配置 DTS 的相关配置项。
高级配置:
数据校验:
库表列配置,选择定义状态列为全部 ,类型列根据下图所示进行选择。
返回任务列表,等待任务启动,启动时间需要大概2分钟。可以单击实例 id (本方案示例:RDS2ADB),查看实例进展。当看到如下界面,表示存量数据已迁移完成,增量数据会实时同步。此时就可以进入下一步方案验证。
方案验证
数据已经同步到云原生数仓 AnalyticDB MySQL 版集群中,接下来通过执行复杂逻辑和使用窗口函数验证云原生数仓 AnalyticDB MySQL 版的高性能查询,并查看 SQL 查询绑定关系的资源组执行情况。
一、执行复杂逻辑,验证云原生数仓 AnalyticDB MySQL 高性能查询。
https://ads.console.aliyun.com/ 填写登录信息。
在 DMS 的 数据库实例 > 已登录实例中,找到上述创建的云数据库 AnalyticDB MySQL 实例,点开左侧 按钮,找到并双击目标数据库 workshop(本方案示例值),即可切换到新建 SQLConsole 中 。在新建的 SQLConsole 中执行下面文本框的复杂逻辑,验证 AnalyticDB MySQL 查询性能。
-- 查询每个城市的订单总数、总金额、平均订单金额,并且包括每个用户的订单统计信息
WITH user_order_stats AS (
SELECT
u.user_id,
u.user_name,
u.city_id,
COUNT(o.order_id) AS user_total_orders,
SUM(o.quantity * p.product_price) AS user_total_amount,
AVG(o.quantity * p.product_price) AS user_average_amount
FROM
workshop.order_info o
JOIN
workshop.user_info u ON o.user_id = u.user_id
JOIN
workshop.product_info p ON o.product_id = p.product_id
WHERE
o.is_delete = 0
GROUP BY
u.user_id, u.user_name, u.city_id
),
city_order_stats AS (
SELECT
c.city_id,
c.city_name,
COUNT(o.order_id) AS total_orders,
SUM(o.quantity * p.product_price) AS total_amount,
AVG(o.quantity * p.product_price) AS average_amount
FROM
workshop.order_info o
JOIN
workshop.user_info u ON o.user_id = u.user_id
JOIN
workshop.city_info c ON u.city_id = c.city_id
JOIN
workshop.product_info p ON o.product_id = p.product_id
WHERE
o.is_delete = 0
GROUP BY
c.city_id, c.city_name
)
SELECT
cos.city_id,
cos.city_name,
cos.total_orders,
cos.total_amount,
cos.average_amount,
uos.user_id,
uos.user_name,
uos.user_total_orders,
uos.user_total_amount,
uos.user_average_amount
FROM
city_order_stats cos
JOIN
user_order_stats uos ON cos.city_id = uos.city_id
ORDER BY
cos.total_orders DESC, uos.user_total_orders DESC
limit 100 ;
二、使用云原生数仓 AnalyticDB MySQL 窗口函数,进行数据分析。
1、使用排序窗口函数 ROW_NUMBER
-- 假设我们要计算user_id是1的用户,订单按购买金额倒序排序
SELECT
u.user_id,
u.user_name,
o.order_id,
o.quantity,
p.product_price,
o.quantity * p.product_price AS order_amount,
o.order_date,
ROW_NUMBER() OVER (PARTITION BY u.user_id ORDER BY o.quantity * p.product_price DESC) AS rank_by_amount
FROM
workshop.order_info o
JOIN
workshop.user_info u ON o.user_id = u.user_id
JOIN
workshop.product_info p ON o.product_id = p.product_id
WHERE u.user_id=1 and o.is_delete = 0
ORDER BY
u.user_id, o.quantity * p.product_price DESC;
-- 假设我们要计算user_id是1的用户,按照下单时间正序排序,查看截止到每一笔累计订单金额明细。
SELECT
u.user_id,
u.user_name,
o.order_date,
o.order_id,
o.quantity,
p.product_price,
o.quantity * p.product_price AS order_amount,
SUM(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS cumulative_amount
FROM
workshop.order_info o
JOIN
workshop.user_info u ON o.user_id = u.user_id
JOIN
workshop.product_info p ON o.product_id = p.product_id
WHERE u.user_id=1 AND o.is_delete = 0
ORDER BY
u.user_id, o.order_date ASC;
-- 假设我们要计算user_id是1的用户,按照下单时间正序排序,查看每个订单与其前一个订单的金额差异。
SELECT
o.order_id,
u.user_name,
o.order_date,
o.quantity,
p.product_price,
o.quantity * p.product_price AS order_amount,
LAG(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS previous_order_amount,
(o.quantity * p.product_price) - LAG(o.quantity * p.product_price) OVER (PARTITION BY u.user_id ORDER BY o.order_date ASC) AS amount_difference
FROM
workshop.order_info o
JOIN
workshop.user_info u ON o.user_id = u.user_id
JOIN
workshop.product_info p ON o.product_id = p.product_id
WHERE
o.is_delete = 0
AND u.user_id=1
ORDER BY o.order_date ASC;
三、查看 SQL 查询,根据绑定关系路由到相应资源组的执行情况。
https://ads.console.aliyun.com/在右上角功能说明中,选择“已完成的查询”和“最近24小时”。然后单击右下角的显示高级搜索,分别填写资源组(本方案示例:xihe_mpp)、用户名(本方案示例:adb_admin)、数据库(本方案示例:workshop)对应的参数值。单击右侧搜索,查询到的 SQL 列表就是使用高权限账号绑定 Interactive 类型资源组执行的查询记录。
点击阅读全文,查看本方案完整详情,解锁秒级 OLAP 分析性能极限。