功能概述
数据同步功能指两个数据源之间的数据实时同步,可应用于云上云下多活、异地多活、跨境数据同步,及实时数据仓库等业务场景。
数据同步不同于数据迁移,数据迁移是以整体数据库搬迁为目的,它属于一次性的短期任务,迁移完成后用户一般需要进行手动割接操作,将业务对接到新的数据库上。数据同步适合长期持续性的任务,可支持在源和目标端同时进行数据写入,增加了数据冲突处理、任务配置动态调整等功能,更方便用户对长期任务的管理。
腾讯云 DTS 支持将自建数据库、云数据库、第三方云厂商数据库等同步到腾讯云数据库。
云上云下同步:如将本地 IDC 自建数据库同步到腾讯云数据库实例,并且支持建立反向同步,实现云上云下双向同步。
多云厂商间同步:将第三方云厂商数据库同步到腾讯云数据库实例,实现双云同步。
腾讯云数据库实例间同步:如异地多活,跨境数据库同步,不同腾讯云账号下的数据库实例同步等。
实现原理
如下以 MySQL 同步为例进行介绍。整体流程为,数据从源实例中导出并导入到目标实例中,关键步骤包括结构初始化、全量数据初始化及增量数据处理。
结构初始化
结构初始化即在目标实例中创建与源实例相同的库表结构信息。同步任务配置时,用户可以选择是否同步库表结构,如果目标实例中已经创建了与源实例相同的结构信息,则不需要同步库表结构信息,只需要同步数据即可,否则需要同步库表结构信息。
全量数据初始化
结构初始化完成后,DTS 会进行存量数据初始化,即将源实例中的全部存量数据导出并导入到目标实例中。
增量数据处理
增量数据处理通过源实例 Binlog 持续获取增量数据,进行一系列过滤转换操作后,将增量数据持久化到中间存储。在全量数据导入完成后,开始在目标实例上持续回放中间存储上的增量变更数据,从而实现目标实例与源实例数据保持一致。
数据冲突处理
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 语句不会再同步到目标端。 | - |