数据同步功能描述

最近更新时间:2024-03-25 16:29:21

我的收藏

功能概述

数据同步功能指两个数据源之间的数据实时同步,可应用于云上云下多活、异地多活、跨境数据同步,及实时数据仓库等业务场景。
数据同步不同于数据迁移,数据迁移是以整体数据库搬迁为目的,它属于一次性的短期任务,迁移完成后用户一般需要进行手动割接操作,将业务对接到新的数据库上。数据同步适合长期持续性的任务,可支持在源和目标端同时进行数据写入,增加了数据冲突处理、任务配置动态调整等功能,更方便用户对长期任务的管理。
腾讯云 DTS 支持将自建数据库、云数据库、第三方云厂商数据库等同步到腾讯云数据库。
云上云下同步:如将本地 IDC 自建数据库同步到腾讯云数据库实例,并且支持建立反向同步,实现云上云下双向同步。
多云厂商间同步:将第三方云厂商数据库同步到腾讯云数据库实例,实现双云同步。
腾讯云数据库实例间同步:如异地多活,跨境数据库同步,不同腾讯云账号下的数据库实例同步等。

实现原理

如下以 MySQL 同步为例进行介绍。整体流程为,数据从源实例中导出并导入到目标实例中,关键步骤包括结构初始化、全量数据初始化及增量数据处理。
结构初始化 结构初始化即在目标实例中创建与源实例相同的库表结构信息。同步任务配置时,用户可以选择是否同步库表结构,如果目标实例中已经创建了与源实例相同的结构信息,则不需要同步库表结构信息,只需要同步数据即可,否则需要同步库表结构信息。
全量数据初始化 结构初始化完成后,DTS 会进行存量数据初始化,即将源实例中的全部存量数据导出并导入到目标实例中。
增量数据处理 增量数据处理通过源实例 Binlog 持续获取增量数据,进行一系列过滤转换操作后,将增量数据持久化到中间存储。在全量数据导入完成后,开始在目标实例上持续回放中间存储上的增量变更数据,从而实现目标实例与源实例数据保持一致。


数据冲突处理

DTS 同步任务中,源库和目标库的数据可能存在冲突,DTS 支持进行同名表冲突和主键冲突检测。
同名表冲突
目标库与源库存在同名表时,支持选择任务报错提醒用户(前置校验并报错),或者将源库的数据追加到目标库的同名表中(忽略并继续执行)。
主键冲突
DTS 支持对主键冲突进行检测,并提供如下冲突处理机制。具体的实现示例请参考 数据同步冲突策略如何选择
冲突报错:同步任务中,源库插入(INSERT)主键数据与目标库存在冲突时,任务报错并暂停,需要用户手动处理后才能继续。
冲突忽略:同步任务中检测到源库的主键插入(INSERT)数据与目标库发生冲突时,忽略源库的主键插入数据,以目标库的内容为准。
冲突覆盖:同步任务中检测到源库的主键更新(INSERT 和 UPDATE)数据与目标库发生冲突时,用源库的主键数据覆盖目标的主键数据。

无锁逻辑说明

业内一般对 MySQL 进行“全量 + 增量”数据同步或者备份中,通常会在全量同步阶段对源库加全局锁(FTWRL)以获取增量同步开始的 Binlog 位点, 但加全局锁可能会影响源库业务,短暂(秒级)阻塞数据写入。
DTS 数据同步中,通过技术升级,实现了无锁同步方式。这里的有锁、无锁都是针对全量同步,其他非全量同步的场景,不存在有锁、无锁机制。
在 MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL MySQL/TDSQL TDStore/Kafka 之间的同步链路中,全量同步阶段都使用无锁同步,不需要对源库加全局锁(FTWRL),仅对无主键的表加表锁。

支持的拓扑结构

同步服务的基本单元为单向同步,配置时可以选择对 DDL(Data Definition Language)、DML(Data Manipulation Language)进行同步。通过对单向同步进行组合,可以定制各种复杂的拓扑。 在复杂拓扑中,对于 DML 操作,我们会通过技术手段来避免数据循环的发生。而对于 DDL,数据同步服务会在配置时进行循环检测,避免形成 DDL 循环。
以下为一些常见拓扑,用户均可通过购买多个同步实例进行定制。详细的构建复杂拓扑结构的指导请参考 构建双向同步数据结构构建多对一同步数据结构构建多活数据中心
一对一单向同步

级联单向同步

一对多单向同步

多对一单向同步

双向同步

级联双向同步


典型应用场景

异地双活
通过 DTS 数据同步服务在多地域的数据库间建立数据实时同步,可实现异地双活。其中各地域的数据库实例可以运行在云上,也可以运行在企业自建数据中心。

多对一同步
通过 DTS 多对一同步将不同数据库上的数据汇聚到同一个目标库上,方便业务数据整合和聚合分析。

同步到 Kafka
DTS 支持将源库数据投递到 Kafka,方便用户获取源库全量 + 增量数据,可应用于数据归档、数据分析等场景中。


约束限制

通过对单向同步的组合,从而实现的双向同步,存在以下限制:
数据一致性的保持需要用户业务配合,不要在两个节点上对同一个主键数据进行更新,避免主键冲突或相互覆盖。例如 A 节点更新1,3,5的主键数据,B 节点更新2,4,6的主键数据。
如果发生数据同步冲突,DTS 会严格按照用户选择的冲突策略对数据进行处理,请在配置时确认对应的冲突处理符合业务预期。
DML 语句支持双向同步,DDL 语句只支持单向同步。构建双向同步,请确保其中一个单向实例禁止 DDL 同步。

支持的数据库类型

数据同步支持的源库类型、目标库类型、版本、同步类型详情请参见 数据同步支持的数据库

支持的功能列表

支持功能
功能描述
相关文档
支持双向同步、环形同步、多对一同步
支持复杂的同步拓扑结构,双向同步、环形同步、多对一同步等。
支持跨账号同步
支持不同腾讯云账号下的实例间数据同步。
支持大部分数据库的跨版本同步
目标库版本大于等于源库即可,如5.5.x 版本支持同步到5.5.x、5.6.x 及更高版本,最后一位属于小版本,小版本不限制。
-
支持库表冲突检查
提供库表重名冲突检查策略。
-
支持主键冲突检查
支持如下三种主键冲突处理策略:
冲突报错:在同步时发现表主键冲突,报错并暂停数据同步任务。
冲突忽略:在同步时发现表主键冲突,保留目标库主键记录。
冲突覆盖:在同步时发现表主键冲突,用源库主键记录覆盖目标库主键记录。
支持过滤 DML 和 DDL
支持选择同步数据类型,包括 Insert、Update、Delete。
支持选择具体的 DDL 操作,如 CREATE TABLE、CREATE VIEW、 DROP INDEX 等。
支持 Where 条件过滤
支持对单个表设置自定义过滤条件。
支持同步视图和高级对象
支持同步视图、存储过程、函数。
支持无锁同步
无锁同步指全量数据同步阶段对源库不加全局锁(FTWRL),仅对无主键的表加表锁,其他不加锁。
-
支持任务进度可视化
支持显示同步的步骤和进度数据。
支持指标监控和事件告警
支持对数据同步的各项指标进行监控。
支持对数据同步事件进行监控,事件异常时自动通知用户。
支持实例重启或者升级
同步增量过程中,支持源实例和目标实例重启或者升级。
-
支持 HA 切换
开启 GTID 的前提下,支持源实例 HA 切换。
支持目标实例 HA 切换。
-
支持同步 Online DDL 临时表
使用 gh-ost、pt-osc 工具对源库中的表做 Online DDL,DTS 支持将 Online DDL 变更产生的临时表同步到目标库。
支持修改同步配置
任务运行中,支持增加、删除同步对象,修改 SQL 同步策略等。
支持暂停任务
任务启动后,如果源数据库连接数过多或者业务需要调整,用户可以选择暂停任务,等业务调整完成后继续同步任务。
支持自动重试
同步任务因网络异常等引起的任务临时中断,DTS 将在设置的时间范围内自动重试和恢复任务,不需要用户手动操作。
SSL 安全连接
DTS 与源/目标数据库之间的传输通道支持 SSL 安全连接,对传输通道进行加密。
-
支持 XA 事务
识别源库进行的 XA 事务操作,同步到目标端的数据是按照 XA 事务的逻辑进行解析。 如果源库发生了 XA 事务回滚(rollback),则源库上 rollback 及 rollback 之前的 SQL 语句不会再同步到目标端。
-