基于PolarDB和AnalyticDB构建实时数据仓库

更新时间:

本文介绍如何利用云原生数据库 PolarDB MySQL 版云原生数据仓库 AnalyticDB MySQL 版构建高性能实时数据仓库。通过数据同步技术,实现数据的高效传输与实时分析;同时,借助冷热分离存储技术,显著降低存储成本,满足企业对性能与成本的双重需求。

前提条件

  • AnalyticDB for MySQL集群与PolarDB for MySQL集群位于同一地域且所属同一VPC

  • AnalyticDB for MySQL集群的存储空间须大于PolarDB MySQL集群占用的存储空间。

示例数据

本文示例的PolarDB for MySQL数据库名为DB1,并在该库中创建了一个名为sales_range_columns的分区表。该表以create_date作为分区键,共包含12个分区,12条数据。

-- 创建数据库
CREATE DATABASE IF NOT EXISTS DB1;

-- 创建分区表
CREATE TABLE sales_range_columns (
    dept_no INT(11) NOT NULL AUTO_INCREMENT,
    part_no INT(11) DEFAULT NULL,
    country VARCHAR(20) DEFAULT NULL,
    create_date DATE NOT NULL,
    amount INT(11) DEFAULT NULL,
    PRIMARY KEY (dept_no, create_date)
)
ENGINE=InnoDB
AUTO_INCREMENT=1000001
DEFAULT CHARSET=utf8mb4
PARTITION BY RANGE COLUMNS(create_date) (
    PARTITION p1 VALUES LESS THAN ('2024-01-01') ENGINE = InnoDB,
    PARTITION p2 VALUES LESS THAN ('2024-02-01') ENGINE = InnoDB,
    PARTITION p3 VALUES LESS THAN ('2024-03-01') ENGINE = InnoDB,
    PARTITION p4 VALUES LESS THAN ('2024-04-01') ENGINE = InnoDB,
    PARTITION p5 VALUES LESS THAN ('2024-05-01') ENGINE = InnoDB,
    PARTITION p6 VALUES LESS THAN ('2024-06-01') ENGINE = InnoDB,
    PARTITION p7 VALUES LESS THAN ('2024-07-01') ENGINE = InnoDB,
    PARTITION p8 VALUES LESS THAN ('2024-08-01') ENGINE = InnoDB,
    PARTITION p9 VALUES LESS THAN ('2024-09-01') ENGINE = InnoDB,
    PARTITION p10 VALUES LESS THAN ('2024-10-01') ENGINE = InnoDB,
    PARTITION p11 VALUES LESS THAN ('2024-11-01') ENGINE = InnoDB,
    PARTITION p12 VALUES LESS THAN ('2024-12-01') ENGINE = InnoDB
);

-- 插入12条数据
INSERT INTO sales_range_columns (part_no, country, create_date, amount) VALUES
(101, 'USA', '2024-01-15', 500),
(102, 'UK', '2024-02-20', 700),
(103, 'Germany', '2024-03-10', 600),
(104, 'France', '2024-04-05', 800),
(105, 'Japan', '2024-05-25', 900),
(106, 'China', '2024-06-15', 1000),
(107, 'India', '2024-07-05', 1100),
(108, 'Brazil', '2024-08-20', 1200),
(109, 'Canada', '2024-09-10', 1300),
(110, 'Australia', '2024-10-25', 1400),
(111, 'Italy', '2024-11-15', 1500),
(112, 'Spain', '2024-11-30', 1600);

步骤一:开启PolarDB for MySQL集群的Binlog功能

重要

开启 Binlog 后集群会自动重启,重启任务会在 5 分钟之内完成。重启时服务闪断时间在 40 秒左右,具体时间与数据量和表数量相关,建议您在业务低谷期进行操作并确保应用程序具备重连机制。

  1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

  2. 您可以通过以下两种方式中的任意一种来开启Binlog:

    • 方式一:

      1. 进入集群的Binlog管理页面。

        image

      2. 单击立即开启按钮。

      3. 开启Binlog对话框中,选择生效方式为立即生效定时生效

        若选择定时生效,请指定具体的生效时间。

        image

      4. 单击确定

    • 方式二:通过设置参数loose_polar_log_bin的值来开启Binlog。

      1. 在左侧导航栏中选择配置与管理 > 参数配置

      2. 找到目标参数loose_polar_log_bin,修改参数值。具体操作请参见修改参数值

        说明
        • 若您的PolarDB MySQL集群版本为MySQL 5.6,当前值修改为ON_WITH_GTID

        • 若您的PolarDB MySQL集群版本为MySQL 5.7MySQL 8.0,当前值修改为ON

步骤二:数据同步

您可以选择以下任意一种方式,将PolarDB for MySQL集群的库表结构、全量数据、增量数据同步至AnalyticDB for MySQL

使用DTS

若您需要高度定制化控制(如过滤字段、跨地域同步或特殊容错策略),可以使用DTS同步数据。

说明

更多详细操作及相关参数参见PolarDB MySQL版同步至AnalyticDB MySQL 3.0

  1. 进入目标地域的同步任务列表页面(二选一)。

    通过DTS控制台进入

    1. 登录数据传输服务DTS控制台

    2. 在左侧导航栏,单击数据同步

    3. 在页面左上角,选择同步实例所属地域。

    通过DMS控制台进入

    说明

    实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式控制台自定义DMS界面布局与样式

    1. 登录DMS数据管理服务

    2. 在顶部菜单栏中,选择Data + AI > 数据传输(DTS) > 数据同步

    3. 同步任务右侧,选择同步实例所属地域。

  2. 单击创建任务,进入任务配置页面。

  3. 配置源库及目标库信息。

    类别

    配置

    说明

    源库信息

    数据库类型

    选择PolarDB for MySQL

    接入方式

    选择云实例

    实例地区

    选择源PolarDB MySQL集群所属地域。

    PolarDB实例ID

    选择源PolarDB MySQL集群ID。

    数据库账号

    填入源PolarDB MySQL集群的数据库账号,需具备待同步对象的读权限。

    数据库密码

    填入该数据库账号对应的密码。

    目标库信息

    数据库类型

    选择AnalyticDB MySQL 3.0

    接入方式

    选择云实例

    实例地区

    选择目标云原生数据仓库AnalyticDB MySQL 3.0集群所属地域。

    实例ID

    选择目标云原生数据仓库AnalyticDB MySQL 3.0集群ID。

    数据库账号

    填入目标云原生数据仓库AnalyticDB MySQL 3.0集群的数据库账号,需具备读写权限。

    数据库密码

    填入该数据库账号对应的密码。

  4. 配置任务对象。

    类别

    配置

    说明

    对象配置

    同步类型

    默认全部勾选。

    实例级别选择所需同步的DDLDML

    默认全部勾选。

    源库对象

    源库对象框中单击待同步对象,然后单击向右将其移动至已选择对象框。

    高级配置

    -

    保持默认选项。

    数据校验

    -

    保持默认选项。

    库表列配置

    定义状态

    选择全部

    分布键

    删除create_date

    分区键

    选择create_date

    分区规则

    选择yyyyMMdd

  5. 配置完上述所有参数后,请单击下一步保存任务并预检查

  6. 预检查通过,单击下一步购买

  7. 勾选服务条款,单击购买并启动,并在弹出的确认对话框,单击确定

使用AnalyticDB for MySQL的无感集成(Zero-ETL)

若您追求快速构建业务系统和数据仓库之间的数据同步链路,推荐使用AnalyticDB for MySQL的无感集成功能。

说明

更多详细操作及相关参数参见通过无感集成(Zero-ETL)同步数据

  1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表。在集群列表上方,选择产品系列,然后单击目标集群ID。

  2. 进入无感集成(Zero-ETL)功能页面,不同的产品系列功能入口不同。

    • 企业版、基础版或湖仓版集群:在左侧导航栏,选择数据接入 > DB数据同步

    • 数仓版集群:在左侧导航栏,选择数据传输服务 > 无感数据集成

  3. 单击创建Zero-ETL任务,在创建Zero-ETL任务页面配置源库信息和目标库信息。

    类别

    配置

    说明

    源库信息

    任务名称

    Zero-ETL任务名称。

    数据库类型

    选择PolarDB for MySQL

    接入方式

    选择云实例接入

    实例地区

    PolarDB for MySQL实例所属地域。

    Polar实例ID

    PolarDB for MySQL实例ID。

    数据库账号

    PolarDB for MySQL实例的数据库账号。

    数据库密码

    PolarDB for MySQL实例数据库账号的密码。

    目标库信息

    数据库类型

    选择AnalyticDB MySQL 3.0

    接入方式

    选择云实例接入

    实例地区

    AnalyticDB for MySQL集群所属的地域。

    实例ID

    AnalyticDB for MySQL的集群ID。

    数据库账号

    AnalyticDB for MySQL集群的数据库账号。

    数据库密码

    AnalyticDB for MySQL集群数据库账号的密码。

  4. 配置Zero-ETL。

    配置项目

    说明

    同步类型

    默认全部勾选。

    实例级别选择所需同步的DDLDML

    默认全部勾选。

    源库对象

    源库对象框中单击待同步对象,然后单击向右将其移动至已选择对象框。

  5. 配置库表字段。

    库表字段配置

    说明

    定义状态

    选择全部

    分布键

    删除create_date

    分区键

    选择create_date

    分区规则

    选择yyyyMMdd

  6. 配置完上述所有参数后,请单击下一步保存任务并预检查

  7. 预检查通过,单击启动,启动Zero-ETL任务。

步骤三:验证数据一致性

当同步链路的状态为运行中时,可以验证数据一致性。

全量数据同步

  1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

  2. 单击页面上方的登录数据库

    页面将会跳转至DMS控制台,并弹出登录实例的提示框。

  3. 输入数据库账号数据库密码,单击登录

  4. 选择AnalyticDB for MySQL左侧数据库实例已登录实例中的数据库DB1,检查表结构和记录总数,以确认与PolarDB for MySQL中数据库的数据一致性。

    -- 查看表结构
    SHOW CREATE TABLE sales_range_columns;
    -- 统计表内数据记录总数
    SELECT COUNT(*) FROM sales_range_columns

增量数据同步

新增分区

  1. PolarDB for MySQL表中添加一个分区p13

    -- 增加一个分区
    ALTER TABLE sales_range_columns ADD PARTITION (PARTITION p13 VALUES LESS THAN ('2025-01-01'));
  2. 查看PolarDB for MySQL表的分区数,已从12个变为13个。

    -- 查看现有分区,确认新分区已增加
    SHOW CREATE TABLE sales_range_columns;

    返回结果:

    image

  3. PolarDB for MySQL新增分区中写入1条数据。

    INSERT INTO sales_range_columns (part_no, country, create_date, amount) VALUES
    (113, 'USA', '2024-12-15', 1700);
  4. 统计PolarDB for MySQL表新增分区内数据记录总数。

    -- 统计新增分区内的数据记录总数
    SELECT COUNT(*) FROM sales_range_columns PARTITION (p13);

    返回结果:

    image

  5. 待数据同步后,须确保该表成功触发并完成BUILD任务。随后查看AnalyticDB for MySQL对应表存在新增分区20241215,且该分区的row_count值为1,与PolarDB for MySQL数据完全一致,表明增量数据同步已成功。

    SELECT
        partition_id,          -- 分区名
        row_count,             -- 分区总行数
        local_data_size,       -- 分区本地存储所占用空间大小
        index_size,            -- 分区的索引大小
        pk_size,               -- 分区的主键索引大小
        remote_data_size       -- 分区的远端存储所占用空间大小
    FROM
        information_schema.kepler_partitions
    WHERE
        schema_name = 'db1'
        AND table_name = 'sales_range_columns' 
        AND partition_id > 0;

    返回结果:

    image

新增列

  1. PolarDB for MySQL表中添加一列。

    -- 新增一列
    ALTER TABLE sales_range_columns ADD COLUMN new_col INT(11);
  2. PolarDB for MySQL表中查看最新表结构。返回结果中存在'new_col' INT(11) DEFAULT NULL,则表明已成功新增列。

    -- 查看最新表结构
    SHOW CREATE TABLE sales_range_columns;

    返回结果:

    image

  3. AnalyticDB for MySQL中查看最新表结构。返回结果中存在'new_col' INT,表明数据同步成功。

    -- 查看表结构
    SHOW CREATE TABLE sales_range_columns;

    返回结果:

    image

步骤四:指定冷热分离存储策略

为保证近期数据的查询性能并降低历史数据的存储成本,请按以下步骤对AnalyticDB for MySQL中的表设置冷热分离:

  1. 指定存储策略。执行以下SQL语句,设置表的存储策略为mixed(冷热混合存储),并将最近6个月数据保留在热存储中,其余历史数据迁移至冷存储。

    -- 修改存储策略
    ALTER TABLE sales_range_columns storage_policy = 'mixed', hot_partition_count = 6;

    变更冷热分层存储策略后,需要该表再次触发并完成BUILD任务后,新的存储策略才能生效。

  2. 监控迁移进度。执行以下SQL语句,查看冷热分离任务状态。

    -- 查看迁移进度
    SELECT 
        table_name,                -- 表名
        source_storage_policy,     -- 原始存储策略
        dest_storage_policy,       -- 目标存储策略
        progress,                  -- 进度(百分比)
        status                     -- 当前任务状态
    FROM 
        information_schema.storage_policy_modify_progress;

    任务状态(status):

    • INIT:任务初始化,表示冷热分离存储策略已提交但尚未开始执行。

    • RUNNING:任务执行中,表示数据正在从热存储向冷存储迁移。

    • FINISH:任务完成,表示冷热分离存储策略已成功应用,数据分布调整完毕。

  3. 验证存储策略生效。执行以下SQL语句,查看表当前存储策略是否生效。

    -- 查看最新表结构
    SHOW CREATE TABLE sales_range_columns;

    查询结果显示STORAGE_POLICY='MIXED' HOT_PARTITION_COUNT=6,表明冷热分离存储策略已成功生效。