跳到主要内容

阿里云 RDS MySQL 迁移同步到 ClickHouse

NineData 数据复制支持将云数据库 RDS MySQL 的数据复制到云数据库 ClickHouse,支持结构复制、全量复制和增量复制。

功能介绍

NineData 数据复制支持数据源之间的结构、全量数据、增量数据的高性能复制,对于 MySQL 数据源之间的复制,还提供双向复制功能,实现快捷构建异地多活业务架构。

  • 结构:支持同构及异构数据源之间的对象结构复制,很大程度上降低了两个数据源之间的数据复制门槛。
  • 全量数据:通过智能数据分片实现行级并发批量复制能力,有效保障复制性能。自主研发的新型断点续传技术,保证无主键表的数据准确性。
  • 增量数据:支持全对象类型的 DML|DDL 增量数据复制,结合事务级并发、热点合并等技术,在保障事务一致性的基础上,提供强劲复制性能。
  • 双向数据实时复制(仅 MySQL 之间):直接多个节点之间的数据双向复制,保证所有节点的数据均保持最新状态。

通过以上功能,可以轻松高效地实现全量|增量数据复制全量|增量数据迁移全量|增量数据同步数据集成不停机无缝迁移等场景,为企业提供灵活和可靠的数据复制解决方案。

前提条件

  • 源和目标数据源的版本见下表。

    源数据源目标数据源
    • RDS MySQL 8.0
    • RDS MySQL 5.7
    ClickHouse 20.8 及以上
  • RDS MySQL 实例的 Binlog_row_image 参数必须为 FULL。如何配置参数,请参见设置实例参数

  • 用于登录 ClickHouse 的账号必须为高权限账号。更多信息,请参见账号管理

注意事项

  • RDS MySQL 实例中,如果有无符号整形类型字段,则 ClickHouse 中会被映射为 Uint 类型。RDS MySQL 和 ClickHouse 的其他数据类型映射关系,请参见附录

  • 通常 RDS MySQL 到 ClickHouse 的复制场景需要包含结构复制,系统会自动迁移 RDS MySQL 的表结构到 ClickHouse,并在 ClickHouse 涉及复制的表中插入两个系统列。如果复制类型不包含结构复制,则您在需要手动确保下列事项:

    • ClickHouse 实例中涉及复制的数据对象,其库表结构必须和 RDS MySQL 数据源一致。

    • ClickHouse 实例涉及复制的表中都需要手动插入如下两个系统列用于记录 DML 操作以及 Binlog 的时间。

      列名称数据类型
      列默认值
      说明
      _jz_data_signInt8DEFAULT 1记录 DML 操作的类型,保证 ClickHouse 端的数据和 MySQL 端一致。
      • INSERT 操作:该字段记录为 1。
      • DELETE 操作:该字段记录为 -1。
      • UPDATE 操作:拆分成 INSERT、DELETE 两条记录。
      _jz_data_timeStringDEFAULT now()记录 Binlog 的时间。

      示例:

      CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
      (
      ...
      _jz_data_sign Int8 DEFAULT 1 COMMENT 'replication data update sign: add = 1, remove = -1',
      _jz_data_time String DEFAULT now() COMMENT 'replication data update time'
      ) ENGINE = engine

使用限制

  • 数据复制功能仅针对数据源中的用户数据库,系统库不会被复制。例如:MySQL 类型数据源中的 information_schemamysqlperformance_schemasys 库不会被复制。
  • 源数据源的账号必须拥有复制对象的 SELECT 权限(结构复制、全量复制)、SHOW VIEW权限(视图复制)以及 REPLICATION CLIENTREPLICATION SLAVE 权限(增量复制),目标数据源的账号必须拥有DML、DDL权限。
  • 执行数据同步前需评估源数据源和目标数据源的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源数据源和目标数据源一定的读写资源,导致数据库负载上升。
  • 需要确保同步对象中的每张表都有主键或唯一约束、列名具有唯一性,否则可能会重复同步相同数据。

步骤一:将云数据库 RDS MySQL 实例添加到 NineData

为确保连接的传输速率,本章节将以私网连接为示例添加 RDS MySQL 实例到 NineData 控制台。如果您希望通过其他方式进行连接(例如公网),请参见添加数据源

前提条件

操作步骤

  1. 登录 NineData 控制台

  2. 在左侧导航栏,单击>

  3. 单击页面右上角的,在页面,根据下表配置参数。

    参数
    说明
    输入数据源的名称,为了方便后续查找和管理,请尽量使用有意义的名称。
    选择
    根据该数据源的实际业务用途进行选择,作为数据源的环境标识。默认提供环境,同时支持您创建自定义环境
    说明:在组织模式下,数据库环境还可应用于权限策略管理,例如,默认情况下的角色仅支持访问环境下的数据源,无法访问其他环境的数据源。更多信息,请参见管理角色
    选择
    选择 MySQL
    选择
    选择创建好的阿里云私网连接。请确保私网连接中配置的 VPC 和您的 RDS MySQL 实例所使用的 VPC 是同一个。
    选择
    选择创建好的阿里云访问凭证,请确保访问凭证有权限访问您的 RDS MySQL 实例。
    选择您的 RDS MySQL 实例所在的地域。
    选择您的 RDS MySQL 实例 ID。
    RDS MySQL 实例的用户名。
    RDS MySQL 实例的密码。
    是否使用 SSL 加密方式访问数据源。数据源如果强制 SSL 加密连接,则必须开启本开关,否则连接失败。
    单击右侧的开关可开启或关闭加密传输。您可以单击左侧的>展开详细配置。
    说明:SSL 加密的更多信息,请参见阿里云官方文档
  4. 全部配置完成后,单击右侧的可以测试该数据源是否可以正常访问,提示即可单击,完成数据源的添加。否则请重新检查连接设置,直到连接测试成功为止。

步骤二:将云数据库 ClickHouse 实例添加到 NineData

为确保连接的传输速率,本章节将以私网连接为示例添加云数据库 ClickHouse 实例到 NineData 控制台。如果您希望通过其他方式进行连接(例如公网),请参见添加数据源

前提条件

  • 已创建阿里云的云厂商访问凭证,并且请确保访问凭证有权限访问您的云数据库 ClickHouse 实例。更多信息,请参见创建阿里云的云厂商访问凭证
  • 已创建与阿里云之间的私网连接,并且请确保私网连接中配置的 VPC 为您的云数据库 ClickHouse 实例所使用的 VPC。更多信息,请参见创建与阿里云之间的私网连接

操作步骤

  1. 登录 NineData 控制台

  2. 在左侧导航栏,单击>

  3. 单击页面右上角的,在页面,根据下表配置参数。

    参数
    说明
    输入数据源的名称,为了方便后续查找和管理,请尽量使用有意义的名称。
    选择
    根据该数据源的实际业务用途进行选择,作为数据源的环境标识。默认提供环境,同时支持您创建自定义环境
    说明:在组织模式下,数据库环境还可应用于权限策略管理,例如,默认情况下的角色仅支持访问环境下的数据源,无法访问其他环境的数据源。更多信息,请参见管理角色
    选择
    选择 ClickHouse
    选择
    选择创建好的阿里云私网连接。请确保私网连接中配置的 VPC 和您的 ClickHouse 实例所使用的 VPC 是同一个。
    选择
    选择创建好的阿里云访问凭证,请确保访问凭证有权限访问您的 ClickHouse 实例。
    选择您的 ClickHouse 实例所在的地域。
    选择您的 ClickHouse 实例 ID。
    ClickHouse 实例的用户名。
    ClickHouse 实例的密码。
    是否使用 SSL 加密方式访问数据源。单击右侧的开关可开启或关闭加密传输,数据源如果强制 SSL 加密连接,则必须开启本开关,否则连接失败。
  4. 全部配置完成后,单击右侧的可以测试该数据源是否可以正常访问,提示即可单击,完成数据源的添加。否则请重新检查连接设置,直到连接测试成功为止。

步骤三:配置 MySQL 到 ClickHouse 的复制任务

  1. 登录 NineData 控制台

  2. 在左侧导航栏单击数据复制 > ,单击右上角的创建数据复制

  3. 数据源与目标页签,按照下表进行配置,并单击下一步

    mysql_to_ck_config1

    参数
    说明
    任务名称输入数据复制任务的名称,为了方便后续查找和管理,请尽量使用有意义的名称。最多支持 64 个字符。
    源数据源同步对象所在的 RDS MySQL 实例。
    目标数据源接收同步对象的 ClickHouse 实例。
    复制类型
    • 结构复制:只同步源数据源的库表结构,不同步数据。
    • 全量复制:同步源数据源的所有对象和数据,即全量数据复制。
    • 增量复制:在全量同步完成后,基于源数据源的日志进行增量同步。单击setting图标,可以根据需求取消勾选某一些操作类型,取消勾选后,这些操作会在增量同步中被忽略。
    说明:您还可以单击展开目标表准备设置,选择存在同名表或相同数据时的处理策略。
    (仅包含增量复制的情况下可用)开启该功能将允许 NineData 从您的 OSS 中下载 Binlog 日志,用来保证增量复制的稳定性,避免 RDS MySQL 的 Binlog 被清理到 OSS,导致复制任务无法找到 Binlog 的问题。
    开启的情况下需要选择,用来访问您的 OSS 下载 Binlog 日志。请注意,您的凭证必须拥有访问 OSS 的权限。如何授权,请参见为 RAM 用户授权
    增量开始时间单选增量复制时需要选择。
    • 从启动时间开始:以当前复制任务开始时间为基准,进行增量复制。
    • 自定义时间:选择增量复制开始的时间点,请根据您的数据源所在地域选择时区。如果将时间点配置为当前复制任务开始前,则如果该时间段内有 DDL 操作,复制任务将失败。
    目标表准备配置
    • 目标库存在同名对象(选中结构复制时需要选择)
      • 预检查报错并停止任务:预检查阶段检测到同名表时,停止任务。
      • 跳过并继续任务:预检查阶段检测到同名表时,发送提示并继续任务。 结构复制时,忽略该同名表。如果您同时进行了数据复制,则数据会在同名表中追加,而不会覆盖原有数据。
      • 删除对象并重建:预检查阶段检测到同名表时,发送提示并继续任务。结构复制时,删除目标库同名表,并从源库重新复制表结构。如果您同时进行了数据复制,则数据会在表结构复制完成后写入。
      • 保留结构并清空数据,再覆盖写入(同时进行结构和数据复制时可选):预检查阶段检测到同名表时,发送提示并继续任务。结构复制时在目标库保留该表结构,并在数据复制开始时清空同名表中的数据,然后重新从原表中复制。
    • 目标表存量数据处理策略(未选中结构复制时需要选择)
      • 预检查报错并退出:预检查阶段检测到目标表中存在数据时,停止任务。
      • 忽略存量数据,追加写入:预检查阶段检测到目标表中存在数据时,忽略该部分数据,追加写入其他数据。
      • 清空存量数据,重新写入:预检查阶段检测到目标表中存在数据时,删除该部分数据,重新写入。
  4. 选择复制对象页签,确认需要复制的内容,您可以选择全部实例同步源库所有内容,也可以选择自定义对象,在源对象列表中选定需要同步的内容,单击>添加到右侧目标对象列表,然后单击下一步

    mysql_to_ck_config2

  5. 配置映射对象页签,根据所选的复制类型选择不同操作。

    mysql_to_ck_config3

    • 包含结构复制:配置目标表同步到目标数据源之后的表名,单击保存并预检查

      提示

      您可以单击页面右侧的,自定义列名同步到目标数据源之后的名称。除此之外,您还可以设置,仅符合过滤条件的数据会同步到目标数据源。以 MySQL 官方测试数据 employees 表为例,将过滤条件设置为 emp_no>=10005,则 emp_no 列中小于 10005 的数据均不会同步到目标数据源。

    • 不包含结构复制:系统默认选择目标数据源中的同名数据库,如果不存在,则需要手动选择目标库。目标库中的表名、列名需要和同步对象一致。如果不一致,您也可以手动进行表名和列名的映射。

  6. 预检查页签,等待系统完成预检查,预检查通过后,单击启动任务

    mysql_to_ck_config4

    提示
    • 您可以勾选开启数据一致性对比。在同步任务完成后,自动开启基于源数据源的数据一致性对比,保证两端数据一致。根据您选择的复制类型,数据一致性对比的启动时机如下:

      • 结构复制:结构复制完成后启动。

      • 结构复制+全量复制:全量复制完成后启动。

      • 结构复制+全量复制+增量复制:当增量数据首次和源数据源一致且同步延迟为 0 秒时启动。您可以单击查看详情,在复制详情页面中查看同步延迟。

        sync_delay

    • 如果预检查未通过,需要单击目标检查项右侧操作列的详情,排查失败的原因,手动修复后单击重新检查重新执行预检查,直到通过。

    • 检查结果警告的检查项,可视具体情况修复或忽略。

  7. 启动任务页签,提示启动成功,同步任务开始运行。此时您可以进行如下操作:

    • 单击查看详情查看同步任务各个阶段的执行情况。
    • 单击返回列表可以返回数据复制列表。

步骤四:查看同步结果

  1. 登录 NineData 控制台

  2. 在左侧导航栏单击数据复制

  3. 数据复制页面单击目标同步任务的任务 ID,页面说明如下。

    mysql_to_ck_result1

    序号
    功能
    介绍
    1同步延迟源数据源和目标数据源之间的数据同步延迟,0 秒表示两端之间没有延迟,此时您可以选择将业务切换到目标数据源,实现平滑迁移。
    2配置告警配置告警后,系统会在任务失败时通过您选择的方式通知您。更多信息,请参见运维监控简介
    3更多
    • 暂停:暂停任务,仅状态为运行中的任务可选。
    • 终止:结束未完成或监听中(即增量同步中)的任务,终止任务后无法重启任务,请谨慎操作。如果同步对象中包含触发器,会弹出触发器复制选项,请按需选择。
    • 删除:删除任务,任务删除后无法恢复,请谨慎操作。
    4结构复制(包含结构复制的场景下显示)展示结构复制的进度和详细信息。
    • 单击页面右侧的日志:查看结构复制的执行日志。
    • 单击页面右侧的refresh:查看最新的信息。
    • 单击列表中目标对象右侧操作列的查看 DDL:可以查看 SQL 回放。
    5全量复制(包含全量复制的场景下显示)展示全量复制的进度和详细信息。
    • 单击页面右侧的监控:查看全量复制过程中的各监控指标。全量复制过程中,还可以单击监控指标页面右侧的限流设置,限制每秒写入到目标数据源的速率。单位为行/秒。
    • 单击页面右侧的日志:查看全量复制的执行日志。
    • 单击页面右侧的refresh:查看最新的信息。
    6增量复制(包含增量复制的场景下显示)展示增量复制的各项监控指标。
    • 单击页面右侧的:查看当前复制任务正在执行中的操作,包含:
      • :复制任务分多个线程执行复制操作,展示当前进行中的线程号。
      • :当前线程正在执行中的 SQL 语句详情。
      • :当前线程的响应时间,如果该数值变大,则代表当前线程可能由于某些原因卡住。
      • :当前线程开启的时间戳。
      • :当前线程的状态。
    • 单击页面右侧的限流设置:限制每秒写入到目标数据源的速率。单位为行/秒。
    • 单击页面右侧的日志:查看增量复制的执行日志。
    • 单击页面右侧的refresh:查看最新的信息。
    7修改对象展示同步对象的修改记录。
    • 单击页面右侧的修改同步对象,可对同步对象进行配置
    • 单击页面右侧的refresh:查看最新的信息。
    8数据对比展示源数据源和目标数据源之间数据对比的结果。包含结构对比数据对比。如果您未开启数据对比,请单击页面中的开启数据对比
    • 单击页面右侧的重新对比:对当前源和目标两端数据重新发起对比。
    • 单击页面右侧的日志:查看一致性对比的执行日志。
    • 单击页面右侧的监控(仅数据对比显示):查看对比 RPS(每秒对比的记录数)的走势图。单击详情可以查看更早之前的记录。
    • 在对比列表右侧操作列单击details数据对比页面只在不一致情况下显示):查看源端和目标端的对比详情。
    • 在对比列表右侧操作列单击sql(不一致情况下显示):生成变更 SQL,您可以直接复制该 SQL 到目标数据源执行,修改不一致的内容。
    9展开展示当前复制任务的详细信息,包括复制类型复制对象开始时间等。

附录一:MySQL 和 ClickHouse 数据类型的映射关系表

数据复制过程中,MySQL 的数据类型会被映射成对应的 ClickHouse 数据类型。

MySQLClickHouse
INT、MEDIUMNINTInt32
BITUInt64
TINYINTInt8
SMALLINT UNSIGNED、YEARUInt16
BIGINTInt64
DECIMALDecimal
FLOATFloat32
DOUBLEFloat64
DATEDate32
DATETIME、TIMESTAMPDateTime64
TIME、CHAR、VARCHAR、BINARY、VARBINARY、TINYBLOB、TINYTEXT、BLOB、TEXT、MEDIUMBLOB、MEDIUMTEXT、LONGBLOB、LONGTEXT、ENUM、SET、GEOMETRY、GEOMETRYCOLLECTION、JSONString
POINT、MULTIPOINTPoint
LINESTRING、MULTILINESTRINGRing
POLYGOPolygon
MULTIPOLYGONMultiPolygon

附录二:预检查项一览

检查项检查项说明未通过是否阻止任务继续失败原因及修复策略
源数据源连接检查检测源数据源的连通性
  • 失败原因:NineData 与源数据库之间的连接不通。
  • 修复方法:请确认云数据库的安全组|白名单设置,是否允许 NineData 服务 IP 的访问。如果不允许,可以修改安全组|白名单放开 NineData IP 后,重新预检查。
目标数据源连接检查检测目标数据源的连通性
  • 失败原因:NineData 与目标数据源之间的连接不通。
  • 修复方法:请确认云数据库的安全组|白名单设置,是否允许 NineData 服务 IP 的访问。如果不允许,可以修改安全组|白名单放开 NineData IP 后,重新预检查。
源库权限检查检测源数据源的账号权限
  • 失败原因:源数据库权限不足。
  • 修复方法:为源数据源的账号赋予 SELECT、REPLICATION CLIENT、REPLICATION SLAVE 权限,并重新预检查。
目标库权限检查检测目标数据源的账号权限
  • 失败原因:目标数据库权限不足。
  • 修复方法:为目标数据源的账号赋予 DML、DDL 权限,并重新预检查。
源数据库是否开启 Binlog检查源数据库是否开启 Binlog
  • 失败原因:您的源数据库未开启 Binlog。
  • 修复方法:将 Binlog 打开后,重新进行预检查。
源数据库 Binlog format 是否支持检查源数据库的 Binlog 格式是否为 rowRDS MySQL 实例的 Binlog 格式默认为 row 且无法修改。
元数据库 binlog_row_image 是否支持检查源数据库的 binlog_row_image 是否为 full
  • 失败原因:您的源数据库 binlog_row_image 不为 full。
  • 修复方法:登录 RDS 控制台将 binlog_row_image 参数修改为 full。更多信息,请参见 设置实例参数修改后,重新进行预检查。
同名库同名对象存在性检查检查目标是否存在跟待复制对象同名的对象
  • 是:当同名对象处理策略选择为“预检查报错并停止任务”。
  • 否:其他情况。
  • 失败原因:目标数据源中存在同名对象。
  • 修复方法:
    • 修改同名对象处理策略后重新预检查。
    • 删除同名对象后重新预检查。
目标库数据存在性检查检查目标数据源的复制对象是否已经存在数据
  • 是:当同名对象处理策略为“预检查报错并停止任务”。
  • 否:其他情况。
  • 失败原因:目标数据源中存在相同数据。
  • 修复方法:
    • 修改存量数据处理策略后重新执行预检查。
    • 手动清空目标数据源的存量数据后重新执行预检查。