使用无感集成同步RDS MySQL至ClickHouse集群

云数据库ClickHouse提供无感数据集成(Zero-ETL)功能,用于将RDS MySQL数据同步至云数据库ClickHouse,您无需搭建或维护数据同步链路,且数据同步链路不收费,减少数据传输成本和运维成本。

方案概述

在大数据时代,企业面临着大量分散在不同的系统和平台上的业务数据,为了有效地管理和利用这些数据,企业往往需要依赖于ETL工具对数据进行集中式管理。

ETL是将上层业务系统的数据经过提取(Extract)、转换清洗(Transform)、加载(Load)到数据仓库的处理过程,目的是将上游分散的数据整合到目标端数仓,通过在数仓中做进一步的计算分析,来为业务做出有效的商业决策。

传统的ETL流程通常会面临以下挑战:

  • 资源成本增加:不同的数据源可能需要不同的ETL工具,搭建ETL链路会产生额外的资源成本。

  • 系统复杂度增加:用户需要自行维护ETL工具,增加了运维难度,无法专注于业务应用的开发。

  • 数据实时性降低:部分ETL流程涉及周期性的批量更新,在近实时的应用场景中,无法快速产生分析结果。

为了解决这些问题,阿里云瑶池数据库提供了无感数据集成(Zero-ETL)功能,可以快速构建业务系统(OLTP)和数据仓库(OLAP)之间的数据同步链路,将业务系统(OLTP)的数据自动提取、转换清洗和加载到数据仓库(OLAP),从而一站式完成数据同步和管理,实现事务处理和数据分析一体化,帮助客户专注于数据分析业务。

功能优势

  • 简单易用:用户无需创建和维护执行ETL(提取、转换、加载操作)的复杂数据管道,仅需选择源端数据和目标端实例,自动创建实时数据同步链路,减少构建和管理数据管道所带来的挑战,专注于上层应用开发。

  • 零成本:Zero-ETL链路不额外收费,可免费实现在数据仓库中对上游数据进行分析。

  • 多源汇聚:通过Zero-ETL链路将多个实例中的数据实时同步至一个ClickHouse实例中,构建全局分析视角。

    说明

    多个实例中的数据实时同步至一个ClickHouse实例,仅支持不同任务之间的同步对象不重叠。

支持链路

RDS MySQL->ClickHouse

费用说明

无感数据集成(Zero-ETL)同步链路免费。

前提条件

使用限制

类型

说明

RDS MySQL限制

  • 待同步对象不支持无主键的表。

  • 不支持同步RENAME TABLE的操作。

  • 如同步对象为表级别,且需进行编辑(如表列名映射),则单次同步任务仅支持同步至多1000张表。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务。

  • Binlog日志:

    • RDS MySQL默认已开启Binlog,您需确保binlog_row_image的值为full,否则预检查阶段提示报错,且无法成功启动数据同步任务。参数设置方法,请参见设置实例参数

      重要
      • 若源实例为自建MySQL,则需开启Binlog,并且设置binlog_formatrowbinlog_row_imagefull。

      • 若源实例自建MySQL是双主集群(两者互为主从),为保障DTS能获取全部的Binlog日志,则您需开启参数log_slave_updates。具体操作请参见为自建MySQL创建账号并设置binlog

    • RDS MySQL实例的本地Binlog日志需保留3天及以上(建议保留7天),自建MySQL数据库的本地Binlog日志需保留7天及以上。否则DTS可能会因无法获取Binlog而导致任务失败,极端情况下甚至可能会导致数据不一致或数据丢失。由于您所设置的Binlog日志保存时间低于DTS要求的时间而导致的问题,不在DTSSLA保障范围内。

      说明

      RDS MySQL实例的本地Binlog日志保留时长的设置方法,请参见自动删除本地日志

  • 在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。

  • 在同步实例运行期间,不记录Binlog的变更操作所产生的数据(例如通过物理备份功能恢复、级联操作等产生的数据),不会被同步到目标库。

    说明

    若有该情况,您可以在业务允许的前提下,通过修改同步对象功能,移除该数据所属的库表,然后将该数据所属的库表重新添加到待同步对象。更多信息,请参见修改同步对象

  • 若源库为8.0.23及以后版本的MySQL数据库,且待同步的数据中包含不可见的隐藏列,则可能会因为无法获取该列的数据而导致数据丢失。

    说明
    • 您可以使用ALTER TABLE <table_name> ALTER COLUMN <column_name> SET VISIBLE;命令,将该隐藏列设置为可见。更多信息,请参见Invisible Columns

    • 无主键的表会自动生成不可见的隐藏主键,您也需要将该隐藏主键设置为可见。更多信息,请参见Generated Invisible Primary Keys

  • RDS MySQL实例已开通全密态(EncDB)功能,则不支持全量数据同步。

    说明

    开启透明数据加密TDE(Transparent Data Encryption)功能的RDS MySQL实例支持库表结构同步、全量数据同步和增量数据同步。

  • 不记录事务日志的RDS MySQL实例(如RDS MySQL 5.6版本的只读实例)不支持作为源库。

  • 无感集成会在源库定时执行CREATE DATABASE IF NOT EXISTS `test`命令以推进Binlog位点。

其他限制

云数据库ClickHouse的时间类型数据存在范围限制,若RDS MySQL中的时间不在该范围内,会导致同步到云数据库ClickHouse的时间不正确。范围限制,请参见时间信息

注意事项

  • 无感集成链路创建注意事项

    云数据库ClickHouse集群Zero-ETL链路数超过限制时,将无法创建新Zero-ETL链路。您可以使用DTS创建新的同步链路,或删除不再使用的Zero ETL链路以创建新的链路。Zero-ETL链路条数限制信息如下:

    • 企业版集群可建条数:[集群CCU下限/8]计算时向上取整,例如集群CCU下限为22CCU,上限为36CCU,则取集群的弹性下限22来计算可创建的链路数,计算结果为22/8=2.75,向上取整后为3,即允许创建的Zero-ETL链路上限为3。

    • 社区版集群可建条数:[集群总核数/8]计算时向上取整,例如集群每个节点规格为832GB,有2个节点,则取集群CPU的总核数8*2=16来计算可创建的链路数,计算结果为16/8=2,即允许创建的Zero-ETL链路上限为2。

  • 同步任务注意事项

    • 若源RDS MySQLDDL语句不是标准的MySQL语法,则可能导致同步任务失败或数据丢失。

    • 待同步数据库的数量符合云数据库ClickHouse的限制,即不超过256个。

    • 待同步数据库、表和列的名称符合云数据库ClickHouse的命名规范,相关规范请参见对象命名规范限制

    • 如同步对象为单个或多个表(非整库),那么在数据同步时,勿对源库的同步对象使用pt-online-schema-change等类似工具执行在线DDL变更,否则会导致同步失败。

    • 执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。

    • 在库表结构同步阶段,无感集成会在目标表中添加字段_sign_is_deleted_version

    • 如果目标端是云数据库ClickHouse社区兼容版集群,无感集成会为目标端创建一个本地表和一个分布式表。

      • 分布式表的名称与源端表的名称一致。

      • 本地表的名称为<分布式表名称>+_local

数据类型映射关系

由于MySQLClickHouse集群支持的数据类型不同,数据类型无法一一对应。所以DTS在进行结构初始化时,会根据目标库支持的数据类型进行类型映射,详情请参见结构初始化涉及的数据类型映射关系

准备工作

创建服务关联角色并授予RAM用户对应的管理权限。

  1. 创建服务关联角色AliyunServiceRoleForClickHouseZeroETL

    说明

    在创建链路进行配置,并点击数据库实例ID下拉列表项时,会有弹窗报错提示创建服务关联角色AliyunServiceRoleForClickHouseZeroETL(如下图),无需手动创建,系统会自动创建该角色

    image

  2. 授予RAM用户管理权限。

    RAM用户必须具备以下三种权限,才可以成功创建Zero-ETL链路。如何给RAM用户授权,请参见RAM用户授权

    • 源端RDS MySQL的权限:AliyunRDSFullAccess。

    • 目标端ClickHouse的权限:AliyunClickHouseFullAccess。

    • DTS的权限:DTS的自定义策略脚本如下,如何创建自定义权限,请参见创建自定义权限策略

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": "dts:*",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "ram:PassRole",
                  "Resource": "*",
                  "Effect": "Allow",
                  "Condition": {
                      "StringEquals": {
                          "acs:Service": "dts.aliyuncs.com"
                      }
                  }
              }
          ]
      }

同步数据

步骤一:进入无感数据集成(Zero-ETL)页面

  1. 登录云数据库ClickHouse控制台

  2. 在页面左上角,选择目标集群所在的地域。

  3. 集群列表页面,选择社区版实例列表,单击目标集群ID。

  4. 集群信息页面的左侧导航栏,单击无感集成(Zero-ETL),进入无感数据集成(Zero-ETL)页面。

步骤二:创建Zero-ETL任务并启动任务

无感数据集成(Zero-ETL)页面,单击创建Zero-ETL任务,进入创建Zero-ETL任务页面。

填写任务名称,并完成以下配置

  1. 配置源库及目标库。

    根据下述参数配置源库及目标库,配置完成后,单击测试连接以进行下一步

    源库信息

    源库信息

    说明

    数据库类型

    仅支持RDS for MySQL。

    接入方式

    仅支持云实例

    实例地区

    选择源实例所属地域。

    RDS实例ID

    RDS MySQL实例ID。

    数据库账号

    RDS MySQL实例的数据库账号。

    数据库密码

    RDS MySQL数据库账号的密码。

    连接方式

    根据需求选择非加密连接SSL安全连接。如果设置为SSL安全连接,您需要提前开启RDS MySQL实例的SSL加密功能,详情请参见使用云端证书快速开启SSL链路加密

    目标库信息

    目标库信息

    说明

    数据库类型

    ClickHouse

    接入方式

    仅支持云实例接入。

    实例地区

    目标库的集群所属地域。

    集群ID

    目标库的集群ID。

    集群类型

    集群的类型分为社区版和企业版。

    数据库账号

    目标库集群的数据库账号。

    数据库密码

    目标库集群的数据库账号的密码。

  2. 配置Zero-ETL。

    源库对象框的多选框中选择待同步对象,然后单击image将其移动至已选择对象框,单击下一步配置库表字段

    image

  3. 配置库表字段

    库表列配置页面,配置待同步表在目标库中的类型主键列排序键分布键分区键信息。

    说明
    • 页面默认展示未定义的表信息,您可以将定义状态选择为全部后进行修改。

    • 主键列排序键可以是组合键,即您可以在对应的下拉框中选择多个字段作为主键列排序键,且需要从主键列中选择一个或者多个列作分区键分布键只能选择一个字段。更多关于主键列、排序键、分区键的信息,请参见CREATE TABLE

    • 分区键可以不设置,但不可以选择为可空的字段,否则同步任务将会失败。

  4. 保存任务。

    配置库表字段完成后,单击下一步保存任务并预检查

    说明

    此操作完成后,无论预检查是否通过,任务创建均已保存。

  5. 预检查并启动任务。

    预检查通过率显示为100%时,单击启动,启动Zero-ETL任务。

    您可以在无感数据集成(Zero-ETL)页面,查看目标Zero-ETL任务的名称源/目标运行状态等信息。

    如果预检查失败,根据失败信息调整源库和目标库后,可以在无感数据集成(Zero-ETL)页面找到目标任务,进行任务修改,重新进行预检查。待预检查成功后,即可启动任务。

监控Zero-ETL任务

监控Zero-ETL任务有以下几种方式,建议您选择监控告警或订阅事件及时获取任务情况,在任务异常时,可结合主动查看方式,进行任务排查。

监控方式

优势

劣势

操作

主动查看

可全方面查看任务状况,比如同步性能、同步详情、任务日志等。

Zero-ETL任务异常时无法主动通知您处理异常。

通过ClickHouse控制台监控

告警监控

根据报警规则,云监控系统会自动发送报警通知,以帮助您及时获取异常监控数据并迅速进行处理。

仅支持监控Zero-ETL任务的同步延迟(毫秒)情况。

云监控ZeroETL延迟告警监控

订阅事件

Zero-ETL的系统事件达到报警条件时,云监控将自动发送报警通知,以便您及时了解任务的异常与恢复情况,并迅速采取相应措施。

仅支持监控Zero-ETL任务的失败和恢复。

云监控Zero-ETL任务事件订阅

通过ClickHouse控制台监控

  1. 登录云数据库ClickHouse控制台

  2. 在页面左上角,选择目标集群所在的地域。

  3. 集群列表页面,选择社区版实例列表,单击目标集群ID。

  4. 集群信息页面的左侧导航栏,单击无感集成(Zero-ETL)

  5. 在无感数据集成(Zero-ETL)页面,单击目标任务操作列的任务详情

    在任务详情页面,您可以对任务进行全面信息查看与监控。image

云监控ZeroETL延迟告警监控

通过云监控,您可以创建告警规则以监测ZeroETL延迟情况。当监测指标达到报警条件时,云监控系统将自动发送报警通知,帮助您及时获取异常监控数据并迅速进行处理。

步骤一:创建ZeroETL延迟告警

如何创建ZeroETL延迟告警,请参见通过云监控控制台。创建时,请务必注意以下参数的填写。

参数

说明

产品

固定选择云数据库Clickhouse - ZeroETL延迟。

监控指标

固定选择同步延迟。

步骤二:查看集群延迟情况

  1. 登录云监控 CloudMonitor (aliyun.com)

  2. 云数据库Clickhouse - ZeroETL延迟列表,单击目标集群操作列的监控图表,查看集群同步延迟情况。

云监控Zero-ETL任务事件订阅

如果您需要监控Zero-ETL任务的恢复与失败情况,且能及时得到通知,您可以对相关事件进行订阅。

如何订阅Zero-ETL事件,请参见管理事件订阅。在创建订阅策略时,请务必注意以下参数的填写。

订阅事件

参数

说明

Zero-ETL任务失败

订阅类型

固定选择系统事件。

产品

固定选择云数据库Clickhouse。

事件类型

固定选择异常。

事件名称

固定选择ZeroETL任务异常。

Zero-ETL任务恢复

订阅类型

固定选择系统事件。

产品

固定选择云数据库Clickhouse。

事件类型

固定选择Restore。

事件名称

固定选择ZeroETL任务恢复。

常见问题

Q:使用Zero-ETL同步数据到云数据库ClickHouse后,为什么目标库数据量比源库数据量多?

原因分析:当源端执行updatedelete操作时,ClickHouse都会写入一条新数据,并使用_signis_deleted字段以及version来标记这些操作。因此,目标库数据量多于源库数据量。

解决方案:查询的时候使用 _signis_deleted 条件过滤删除的数据(根据版本决定),并且在表名后加final 来去重。字段标识信息,请参见字段信息

Q:使用Zero-ETL同步数据到云数据库ClickHouse后,为什么目标库会出现_local的表?

如果目标端是云数据库ClickHouse社区兼容版集群,无感集成会为目标端创建一个本地表和一个分布式表。

  • 分布式表的名称与源端表的名称一致。

  • 本地表的名称为<分布式表名称>+_local