多数据源之间的数据复制
NineData 数据复制功能支持多个数据源之间的全量数据同步和增量数据同步。
功能说明
本文利用 NineData 的双向复制功能,搭建三个数据源之间的数据同步任务,保证每个数据源中所做的更改都会同步到另外两个数据源中。
假设有 A、B、C 三个数据源,以数据源 A 为主节点,分别创建 A 和 B、A 和 C 之间的双向复制任务,实现三个数据源的数据实时同步,适用于异地容灾、异地多活等场景。
此方法适用于三个,以及三个以上数据源之间的实时同步。
前提条件
已将所有参与数据复制的数据源添加至 NineData。如何添加,请参见添加数据源。
源和目标数据源的类型和版本为 MySQL 8.0、5.7、5.6、5.5、5.1,且源数据源版本和目标数据源版本建议保持一致。
不包含结构复制的场景下,目标数据源中必须包含源数据源中目标表的结构。例如,将 A 数据源中 A 表的增量数据复制到 B 数据源,则 B 数据源中必须包含 A 表,且表结构需要和 A 数据源中的 A 表一致。
MySQL 数据源必须开启 Binlog,并且 Binlog 相关参数设置如下:
binlog_format
=ROW
binlog_row_image
=FULL
提示如果源数据源为备库,为保证获取完整的 Binlog 日志,还需要开启
log_slave_updates
参数。
使用限制
- 数据复制功能仅针对数据源中的用户数据库,系统库不会被复制。例如:MySQL 类型数据源中的
information_schema
、mysql
、performance_schema
、sys
库不会被复制。 - 源数据源的账号必须拥有复制对象的
SELECT
权限(结构复制、全量复制)、SHOW VIEW
权限(视图复制)以及REPLICATION CLIENT
、REPLICATION SLAVE
权限(增量复制),目标数据源的账号必须拥有DML、DDL权限。 - 执行数据同步前需评估源数据源和目标数据源的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源数据源和目标数据源一定的读写资源,导致数据库负载上升。
- 同步过程中,如果源数据源中包含视图(VIEW)、函数(FUNCTION)、存储过程(PROCEDURE)、触发器(TRIGGER)、事件(EVENT),则同步到目标数据源后,上述对象的定义者(DEFINER)信息将在目标数据源中被修改为当前同步任务中访问目标数据源的账号。
- 需要确保同步对象中的每张表都有主键或唯一约束、列名具有唯一性,否则可能会重复同步相同数据。
- 同步过程中,如果源数据源存在触发器,则系统会在增量同步结束以后才会同步触发器。
步骤一:为参与复制的所有数据源添加多活标记
为防止发生数据循环复制,您需要为参与复制任务的所有数据源添加多活标记。
登录 NineData 控制台。
在左侧导航栏,单击数据源管理>数据源。
单击目标数据源 ID,打开数据源详情页面。
在数据源详情区域(即包含数据源名称、ID、创建人、创建时间等信息的区域),单击展开。
找到多活标记,单击其右侧的图标。
输入多活标记,单击确定。
提示- 多活标记可包含 1~64 个字符。
- 多活标记需为全局唯一,不可和其他多活标记重复。
步骤二:创建数据源 A 到数据源 B 之间的双向复制任务
登录 NineData 控制台。
在左侧导航栏单击数据复制 > 。
在数据复制页面,单击右上角的创建数据复制。
在数据源与目标页签,按照下表进行配置,并单击下一步。
参数 说明 任务名称 输入数据同步任务的名称,为了方便后续查找和管理,请尽量使用有意义的名称。最多支持 64 个字符。 源数据源 选择数据源 A,该数据源将作为中心数据节点,负责如下操作: - 将自身的 DDL、DML 等更改同步至其他数据源。
- 将其他所有节点的 DML 更改整合到自身。
目标数据源 选择数据源 B,该数据源将和数据源 A 进行双向数据复制。 复制方式 选择双向复制。 正向复制类型 选择数据源 A 到数据源 B 的复制类型。本示例将保持默认状态,即选中结构复制、全量复制以及增量复制。单击图标,可以根据需求取消勾选某一些操作类型,取消勾选后,这些操作会在增量同步中被忽略。
说明:双向复制场景下,增量复制会被强制选中,无法取消。正向增量开始时间 单选增量复制时需要选择。 - 从启动时间开始:以当前复制任务开始时间为基准,进行增量复制。
- 自定义时间:选择增量复制开始的时间点,请根据您的数据源所在地域选择时区。如果将时间点配置为当前复制任务开始前,则如果该时间段内有 DDL 操作,复制任务将失败。
反向复制类型 数据源 B 到数据源 A 的复制类型。仅支持增量复制,且默认选中无法取消。 支持 DDL 复制 增量复制时,是否复制 DDL 操作。 - 正向复制支持,反向不支持:源数据源中的增量 DDL 操作将同步到目标数据源。该场景下请不要在数据源 B 中做 DDL 操作,否则任务可能报错。
- 均不支持:所有增量的 DDL 操作都不会同步。该场景下请不要在数据源 A 或 B 中做 DDL 操作,否则任务可能报错。
目标表准备配置 - 目标库存在同名对象(选中结构复制时需要选择)
- 预检查报错并停止任务:预检查阶段检测到同名表时,停止任务。
- 跳过并继续任务:预检查阶段检测到同名表时,发送提示并继续任务。 结构复制时,忽略该同名表。如果您同时进行了数据复制,则数据会在同名表中追加,而不会覆盖原有数据。
- 删除对象并重建:预检查阶段检测到同名表时,发送提示并继续任务。结构复制时,删除目标库同名表,并从源库重新复制表结构。如果您同时进行了数据复制,则数据会在表结构复制完成后写入。
- 保留结构并清空数据,再覆盖写入(同时进行结构和数据复制时可选):预检查阶段检测到同名表时,发送提示并继续任务。结构复制时在目标库保留该表结构,并在数据复制开始时清空同名表中的数据,然后重新从原表中复制。
- 目标表存量数据处理策略(未选中结构复制时需要选择)
- 预检查报错并退出:预检查阶段检测到目标表中存在数据时,停止任务。
- 忽略存量数据,追加写入:预检查阶段检测到目标表中存在数据时,忽略该部分数据,追加写入其他数据。
- 清空存量数据,重新写入:预检查阶段检测到目标表中存在数据时,删除该部分数据,重新写入。
在选择复制对象页签,配置下列参数,然后单击下一步。
参数 说明 复制对象 选择需要复制的内容,您可以选择全实例复制源库所有内容,也可以选择自定义对象,在源对象列表中选中需要复制的内容,单击>添加到右侧目标对象列表。 黑名单(可选) 选择需要加入黑名单的库或对象,这些内容都不会被复制。用于在自定义对象的全库复制或全实例复制中排除某些库或对象。 - 左侧下拉框:选择需要加入黑名单的库名。
- 右侧下拉框:选择对应库中的对象,您可以单击多个对象进行多选,留空则将整个数据库加入黑名单。
在配置映射对象页签,根据所选的复制类型选择不同操作。
包含结构复制:配置目标表同步到目标数据源之后的表名,单击保存并预检查。
提示您可以单击页面右侧的,自定义列名同步到目标数据源之后的名称。除此之外,您还可以设置,仅符合过滤条件的数据会同步到目标数据源。以测试数据 employees 表为例,将过滤条件设置为
emp_no>=10005
,则 emp_no 列中小于 10005 的数据均不会同步到目标数据源。不包含结构复制:系统默认选择目标数据源中的同名数据库,如果不存在,则需要手动选择目标库。目标库中的表名、列名需要和同步对象一致。如果不一致,您也可以手动进行表名和列名的映射。
在预检查页签,等待系统完成预检查,预检查通过后,单击启动任务。
提示您可以勾选开启数据一致性对比。在同步任务完成后,自动开启基于源数据源的数据一致性对比,保证两端数据一致。数据一致性对比会在增量数据首次和源数据源一致且同步延迟为 0 秒时启动。
如果预检查未通过,需要单击目标检查项右侧操作列的详情,排查失败的原因,手动修复后单击重新检查重新执行预检查,直到通过。
检查结果为警告的检查项,可视具体情况修复或忽略。
在启动任务页面,提示启动成功,同步任务开始运行。此时您可以进行如下操作:
- 单击查看详情查看同步任务各个阶段的执行情况。
- 单击返回列表可以返回数据复制列表。
步骤三:创建数据源 A 到数据源 C 之间的双向复制任务
请参见步骤二操作,唯一不同点在于需要选择数据源 C 作为目标数据源。
操作结果
至此,您已完成三节点数据复制任务的部署,您在任意一个节点上所做的数据变更操作都会实时同步到其他两个节点。您也可以根据步骤二继续添加其他 MySQL 数据源,实现多节点数据同步,理论上可无限制添加。
查看同步结果
登录 NineData 控制台。
在左侧导航栏单击 > 。
在页面单击目标同步任务的,页面说明如下。
序号 功能 说明 1 同步延迟 源数据源和目标数据源之间的数据同步延迟,0 秒表示两端之间没有延迟,此时您可以选择将业务切换到目标数据源,实现平滑迁移。 2 配置告警 配置告警后,系统会在任务失败时通过您选择的方式通知您。更多信息,请参见运维监控简介。 3 更多 - 暂停:暂停任务,仅状态为运行中的任务可选。
- 终止:结束未完成或监听中(即增量同步中)的任务,终止任务后无法重启任务,请谨慎操作。如果同步对象中包含触发器,会弹出触发器复制选项,请按需选择。
- 删除:删除任务,任务删除后无法恢复,请谨慎操作。
4 结构复制(包含结构复制的场景下显示) 展示结构复制的进度和详细信息。 - 单击页面右侧的日志:查看结构复制的执行日志。
- 单击页面右侧的:查看最新的信息。
- 单击列表中目标对象右侧操作列的查看 DDL:可以查看 SQL 回放。
5 全量复制(包含全量复制的场景下显示) 展示全量复制的进度和详细信息。 - 单击页面右侧的监控:查看全量复制过程中的各监控指标。全量复制过程中,还可以单击监控指标页面右侧的限流设置,限制每秒写入到目标数据源的速率。单位为行/秒。
- 单击页面右侧的日志:查看全量复制的执行日志。
- 单击页面右侧的:查看最新的信息。
6 增量复制(包含增量复制的场景下显示) 展示增量复制的各项监控指标。 - 单击页面右侧的:查看当前复制任务正在执行中的操作,包含:
- :复制任务分多个线程执行复制操作,展示当前进行中的线程号。
- :当前线程正在执行中的 SQL 语句详情。
- :当前线程的响应时间,如果该数值变大,则代表当前线程可能由于某些原因卡住。
- :当前线程开启的时间戳。
- :当前线程的状态。
- 单击页面右侧的限流设置:限制每秒写入到目标数据源的速率。单位为行/秒。
- 单击页面右侧的日志:查看增量复制的执行日志。
- 单击页面右侧的:查看最新的信息。
7 修改对象 展示同步对象的修改记录。 - 单击页面右侧的修改同步对象,可对同步对象进行配置。
- 单击页面右侧的:查看最新的信息。
8 数据对比 展示源数据源和目标数据源之间数据对比的结果。包含结构对比和数据对比。如果您未开启数据对比,请单击页面中的开启数据对比。 - 单击页面右侧的重新对比:对当前源和目标两端数据重新发起对比。
- 单击页面右侧的日志:查看一致性对比的执行日志。
- 单击页面右侧的监控(仅数据对比显示):查看对比 RPS(每秒对比的记录数)的走势图。单击详情可以查看更早之前的记录。
- 在对比列表右侧操作列单击(数据对比页面只在不一致情况下显示):查看源端和目标端的对比详情。
- 在对比列表右侧操作列单击(不一致情况下显示):生成变更 SQL,您可以直接复制该 SQL 到目标数据源执行,修改不一致的内容。
9 查看反向 仅双向复制任务展示,单击可查看目标数据源到源数据源的复制详情。 10 展开 展示当前复制任务的详细信息,包括复制类型、复制对象、开始时间等。