tencent cloud

文档反馈

MySQL/MariaDB/Percona/TDSQL-C MySQL 数据库同步至 Kafka

最后更新时间:2023-09-05 15:03:51
    DTS 支持将源数据库的全量、增量数据同步到 Ckafka 中,方便用户快速获取业务变更数据并进行分析应用。本文为您介绍使用数据传输服务 DTS 将 MySQL/MariaDB/Percona/TDSQL-C MySQL 数据同步至腾讯云数据库 Ckafka 的过程。
    源数据库支持的部署类型如下:
    自建 MySQL、第三方云厂商 MySQL、腾讯云数据库 MySQL。
    自建 MariaDB、腾讯云数据库 MariaDB。
    自建 Percona。
    腾讯云数据库 TDSQL-C MySQL。

    注意事项

    同一个任务可以关联多个 Topic,但同一个 Topic 不能同时被多个同步任务使用,否则会导致数据错乱,消费到的数据是多个不同任务的数据,也可能导致在任务重试等场景中数据处理异常,任务报错。
    默认采用有锁同步方式,全量数据导出阶段会对源库加全局锁(FTWRL),锁表过程中会短暂(秒级)阻塞写入操作。
    如果用户在同步过程中确定会对某张表使用 rename 操作,投递到目标 Ckafka 中,分区规则会按照新的表名匹配 topic 和 partition。
    在全量同步阶段,每同步10万条数据,会在目标端 Kafka 插入一条 checkpoint 消息,标识当前的数据同步位点。
    在同步任务前,源库中已经存在的全量数据,因为没有数据写入的准确时间,在消费端 Demo 中 happenAt 字段会显示为1970-01-01 08:00:00,该时间字段无需关注。消费增量数据时,时间字段可以正确显示。
    DTS 在全量数据同步阶段,将源库数据导出并导入到目标端 Ckafka,均使用 utf8mb4 字符集,以避免因字符集不识别导致乱码问题。
    建议目标 Topic 为空,同时在同步任务中,不要在目标 Topic 中进行写入,否则可能会导致消息错乱,任务报错。
    DTS 同步到目标端 Kafka 的单条消息存在性能上限,建议用户源数据库中的单行数据不要超过8MB,否则在同步过程中可能会报错。

    前提条件

    源数据库和目标数据库符合同步功能和版本要求,请参考 数据同步支持的数据库 进行核对。
    同步任务账号需要具备源数据库的权限如下:
    GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SHOW VIEW,PROCESS,SELECT ON *.* TO '帐号'@'%' IDENTIFIED BY '密码';
    FLUSH PRIVILEGES;
    在目标 Ckafka 中修改消息保留时间和消息大小上限。
    消息保存时间建议设置为3天,超过保存时间的数据会被清除,请用户在设置的时间内及时消费;消息大小上限,即 Ckafka 可以接收的单个消息内存的大小,设置时需要大于源库表中单行数据的最大值,以确保源库的数据都可以正常投递到 CKafka 中。

    应用限制

    只支持同步基础表、视图、存储过程和函数。
    源端如果是非 GTID 实例,DTS 不支持源端 HA 切换,一旦源端 MySQL 发生切换可能会导致 DTS 增量同步中断。
    只支持同步 InnoDB、MyISAM、TokuDB 三种数据库引擎,如果存在这三种以外的数据引擎表则默认跳过不进行同步。
    相互关联的数据对象需要一起同步,否则会导致同步失败。如主外键关联表等。
    不支持同时包含 DML 和 DDL 语句在一个事务的场景,遇到该情况任务会报错。
    不支持 Geometry 相关的数据类型,遇到该类型数据任务报错。
    不支持 ALTER VIEW 语句,遇到该语句任务跳过不同步。
    为了保证数据一致性,同步到 Kafka 默认采用有锁同步,但源库为阿里云 MySQL5.5/5.6、AWS MySQL 5.7.18及之前的版本时无法加上锁,可能会造成同步到目标 Ckafka 的部分数据重复。用户如果对重复数据比较关注,请在消费数据时设置去重逻辑。
    同步任务过程中,如果发生任务重启,可能会导致同步到目标端 Ckafka 的数据出现重复。
    DTS 是按最小数据单元进行同步的(全量阶段单个表对象的一块数据即为最小数据单元,增量阶段每标记一个位点就是一个数据单元),如果重启时,刚好一个数据单元同步已完成,则不会导致数据重复;如果重启时,一个数据单元还正在同步中,那么再次启动后需要重新同步这个数据单元,这样就会导致数据重复。
    修改同步对象、任务错误时手动点操作列的重试按钮、变配、暂停任务再恢复,隔离后再解隔离,这些场景都会发生任务重启。
    用户如果对重复数据比较关注,请在消费数据时设置去重逻辑。
    目标端 Kafka 的版本,当前仅支持在腾讯云上可购买的专业版和标准版,并且为1.1.1版本及以后;历史已经下线的物理机标准版不支持作为目标端。

    操作限制

    同步过程中请勿进行如下操作,否则会导致同步任务失败。
    请勿修改、删除源数据库和目标 Ckafka 中用户信息(包括用户名、密码和权限)和端口号。
    请勿在源库写入 Binlog 格式为 STATEMENT 的数据。
    请勿在源库上执行清除 Binlog 的操作。
    请勿在目标端已选择同步的 Topic 中写入数据。

    支持同步的 SQL 操作

    操作类型
    SQL 操作语句
    DML
    INSERT、UPDATE、DELETE
    DDL
    CREATE DATABASE、DROP DATABASE、ALTER DATABASE、CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、CREATE VIEW、DROP VIEW、CREATE INDEX、DROP INDEX
    说明:
    暂不支持 CREATE TABLE 表名 AS SELECT 语句。

    环境要求

    类型
    环境要求
    源数据库要求
    源库和目标库网络能够连通。
    实例参数要求:
    源库 server_id 参数需要手动设置,且值不能设置为0。
    源库表的 row_format 不能设置为 FIXED。
    源库变量 connect_timeout 设置数值必须大于10。
    Binlog 参数要求:
    源端 log_bin 变量必须设置为 ON。
    源端 binlog_format 变量必须设置为 ROW。
    源端 binlog_row_image 变量必须设置为 FULL。
    MySQL 5.6 及以上版本 gtid_mode 变量不为 ON 时会报警告,建议打开 gtid_mode。
    不允许设置 do_db,ignore_db。
    源实例为从库时,log_slave_updates 变量必须设置为 ON。
    建议源库 Binlog 日志至少保留3天及以上,否则可能会因任务暂停/中断时间大于 Binlog 日志保留时间,造成任务无法续传,进而导致任务失败。
    外键依赖:
    外键依赖建议设置为 NO ACTION,RESTRICT 两种类型,其他类型可能会影响数据一致性结果。
    部分库表同步时,有外键依赖的表必须齐全。
    环境变量 innodb_stats_on_metadata 必须设置为 OFF。
    目标 Ckafka 要求
    目标 Ckafka 可以正常连通。
    目标 Ckafka 中消息大小设置的上限需要大于源库表中单行数据的最大值。

    操作步骤

    因为 MySQL/MariaDB/Percona/TDSQL-C MySQL 同步至腾讯云数据库 Ckafka,各场景的同步要求和操作步骤基本一致,本章节仅以 MySQL 到 Ckafka 的数据同步为例进行介绍,其他场景请参考相关内容。
    1. 登录 数据同步购买页,选择相应配置,单击立即购买
    参数
    描述
    计费模式
    支持包年包月和按量计费。
    源实例类型
    选择 MySQL,购买后不可修改。
    源实例地域
    选择源实例所在地域,购买后不可修改。如果源数据库为自建数据库,选择离自建地域最近的一个地域即可。
    目标实例类型
    选择 Kafka,购买后不可修改。
    目标实例地域
    选择目的实例所在地域,购买后不可修改。
    规格
    请根据业务诉求选择规格,规格越高,性能越好。详情请参考 计费概述
    2. 购买完成后,返回 数据同步列表,可看到刚创建的数据同步任务,单击操作列的配置,进入配置同步任务页面。
    3. 在配置同步任务页面,配置源端实例、帐号密码,配置目标端实例、帐号和密码,测试连通性后,单击下一步
    设置项
    参数
    描述
    任务设置
    任务名称
    DTS 会自动生成一个任务名称,用户可以根据实际情况进行设置。
    运行模式
    支持立即执行和定时执行两种模式。
    源实例设置
    源实例类型
    购买时所选择的源实例类型,不可修改。
    源实例地域
    购买时选择的源实例所在地域,不可修改。
    接入类型
    请根据您的场景选择,不同接入类型的准备工作请参考 准备工作概述
    公网:源数据库可以通过公网 IP 访问。
    云主机自建:源数据库部署在 腾讯云服务器 CVM 上。
    专线接入:源数据库可以通过 专线接入 方式与腾讯云私有网络打通。
    VPN 接入:源数据库可以通过 VPN 连接 方式与腾讯云私有网络打通。
    云数据库:源数据库属于腾讯云数据库实例。
    云联网:源数据库可以通过 云联网 与腾讯云私有网络打通。
    公网
    主机地址:源数据库 IP 地址或域名。
    端口:源数据库使用的端口。
    云主机自建
    云主机实例:云服务器 CVM 的实例 ID。
    端口:源数据库使用的端口。
    专线接入
    私有网络专线网关/:专线接入时只支持私有网络专线网关,请确认网关关联网络类型。
    私有网络:选择私有网络专线网关和 VPN 网关关联的私有网络和子网。
    主机地址:源数据库 IP 地址。
    端口:源数据库使用的端口。
    VPN 接入
    VPN 网关:VPN 网关,请选择通过 VPN 网关接入的 VPN 网关实例。
    私有网络:选择私有网络专线网关和 VPN 网关关联的私有网络和子网。
    主机地址:源数据库 IP 地址。
    端口:源数据库使用的端口。
    云数据库
    云数据库实例:源数据库的实例 ID。
    云联网
    主机地址:源数据库的主机 IP 地址。
    端口:源数据库使用的端口。
    私有网络云联网:云联网实例名称。
    接入 VPC:接入 VPC 指的是云联网中接入订阅链路的 VPC。请在云联网关联的所有 VPC 中,选择除了源数据库所属 VPC 外的其他 VPC。 例如,广州地域数据库作为源数据库,则接入 VPC 选择其他地域,如成都 VPC 或者上海 VPC。
    子网:已选择 VPC 网络的子网名称。
    接入 VPC 地域:购买任务时选择的源数据库地域与接入 VPC 地域需要保持一致,如果不一致,DTS 会将购买任务中选择的源数据库地域,改为接入 VPC 地域。
    帐号/密码
    帐号/密码:源数据库的帐号、密码。
    目标实例设置
    目标实例类型
    购买时选择的目标实例类型,不可修改。
    目标实例地域
    购买时选择的目标实例地域,不可修改。
    接入类型
    根据您的场景选择,本场景选择“Ckafka 实例”。
    实例 ID
    选择目标实例 ID。
    4. 在设置同步选项和同步对象页面,将对数据初始化选项、数据同步到 Kafka 策略、数据同步选项、同步对象选项进行设置,在设置完成后单击保存并下一步
    自定义 Topic 名称
    集中投递到单 Topic
    设置项
    参数
    描述
    数据初始化选项
    初始化类型
    结构初始化:同步任务执行时会先将源实例中表结构初始化到目标实例中。
    全量数据初始化:同步任务执行时会先将源实例中数据初始化到目标实例中。仅选择全量数据初始化的场景,用户需要提前在目标库创建好表结构。
    默认两者都勾上,可根据实际情况取消。
    投递到 Kakfa 数据格式
    Avro 为二进制格式,消费效率更高,JSON 为轻量级的文本格式,更加简单易用。
    数据同步到 Kafka 策略
    同步 Topic 策略
    自定义 Topic 名称:自行设置投递的 Topic 名称,设置后目标端 Kafka 会自动创建该 Topic。实现效果,将同步数据随机投递到该 Topic 下的不同分区中。如果目标端 Kafka 创建 Topic 没建成功,任务会报错。
    集中投递到单 Topic:选择一个目标端已有的 Topic,然后按照多种分区策略投递,支持单分区或者按表名或者按表名+主键划分分区,投递到不同分区中。
    自定义 Topic 名称规则
    用户添加了多条规则,自定义 Topic 匹配规则会从上到下逐条匹配。设置的库名和表名规则都匹配上,才会投递到该条规则对应的 Topic 中。如果没有匹配到库表匹配规则,则会投递到最后一条规则的 Topic 中;如果匹配到多条库表匹配规则,则会投递到所有匹配规则的 Topic 中。
    举例一:数据库实例 X 中,Users 库里有 Student、Teacher 表,需要将 Users 库里的数据都投递到Topic_A 中。配置规则如下:
    Topic 名称填入 Topic_A,库名匹配模式填入 ^Users$,表名匹配模式填入 .*
    Topic 名称填入 Topic_default,库名匹配模式(不符合匹配规则的剩余库),表名匹配模式(不符合匹配规则的剩余表)。
    示例二:数据库实例 X 中,Users 库里有 Student、Teacher 表,需要将 Student 表数据投递到Topic_A 中,Teacher 表数据投递到 Topic_default 中。配置规则如下:
    Topic 名称填入 Topic_A,库名匹配模式填入 ^Users$,表名匹配模式填入 ^Student$
    Topic 名称填入 Topic_default,库名匹配模式(不符合匹配规则的剩余库),表名匹配模式(不符合匹配规则的剩余表)。
    集中投递到单 Topic 规则
    选择指定的 Topic 后,系统会按照如下指定策略进行分区。
    全部投递至 Partition0:将源库的同步数据全部投递到第一个分区。
    按表名分区:将源库的同步数据按照表名进行分区,设置后相同表名的数据会写入同一个分区中。
    按表名+主键分区:将源库的同步数据按照表名+主键分区,适用于热点数据,设置后热点数据的表,通过表名+主键的方式将数据分散到不同分区中,提升并发消费效率。
    存储 DDL 的 Topic
    可选,如果用户需要将源库的 DDL 操作单独投递到指定 Topic 中,可以在此处选择设置。 设置后默认投递到已选 Topic 的 Partition0;如果没设置会根据上面选择的 Topic 规则进行投递。
    数据同步选项
    设置项
    参数
    描述
    数据同步选项
    同步操作类型
    支持操作:Insert、Update、Delete、DDL。勾选“DDL 自定义”,可以根据需要选择不同的 DDL 同步策略。详情请参考 设置 SQL 过滤策略
    同步对象选项
    源实例库表对象
    选择待同步的对象,支持基础库表、视图、存储过程和函数。高级对象的同步是一次性动作,仅支持同步在任务启动前源库中已有的高级对象,在任务启动后,新增的高级对象不会同步到目标库中。更多详情,请参考 同步高级对象
    已选对象
    在左侧选择同步对象后,单击
    
    ,即可在右侧看到已勾选的对象。
    是否同步 Online DDL 临时表
    如果使用 gh-ost、pt-osc 工具对源库中的表执行 Online DDL 操作,DTS 支持将 Online DDL 变更产生的临时表迁移到目标库。
    勾选 gh-ost,DTS 会将 gh-ost 工具产生的临时表名(`_表名_ghc`、`_表名_gho`、`_表名_del`)迁移到目标库。
    勾选 pt-osc, DTS 会将 pt-osc 工具产生的临时表名(`_表名_new`、 `_表名_old`)迁移到目标库。
    更多详情请参考 同步 Online DDL 临时表
    5. 在校验任务页面,完成校验并全部校验项通过后,单击启动任务。 如果校验任务不通过,可以参考 校验不通过处理方法 修复问题后重新发起校验任务。
    失败:表示校验项检查未通过,任务阻断,需要修复问题后重新执行校验任务。
    警告:表示检验项检查不完全符合要求,可以继续任务,但对业务有一定的影响,用户需要根据提示自行评估是忽略警告项还是修复问题再继续。
    6. 返回数据同步任务列表,任务开始进入运行中状态。
    说明
    选择操作列的更多 > 结束可关闭同步任务,请您确保数据同步完成后再关闭任务。
    
    7. (可选)您可以单击任务名,进入任务详情页,查看任务初始化状态和监控数据。

    常见问题

    增量同步中,源库同步对象长时间无写入,监控显示延迟大
    请用户先确认源库中,选择同步的对象是否长期无数据写入(其他未同步库表对象有数据写入),如果确认没有写入,则忽略此问题,这种场景监控指标失真,请参见如下解释;如果有写入,则 提交工单 处理。
    MySQL 系列数据库同步到 Kafka 链路中,DTS 需要先拉取源库的 Binlog,解析后识别出勾选对象的相关数据,同步到目标 Kafka。源库选择同步的库表对象长期无数据写入,其他未同步库表对象有数据写入,这种场景,DTS 拉取 Binlog 并解析后发现,不需要同步到目标端,目标端的数据一直没有更新,所以就显示了延迟。用户可以尝试在源库选择同步的对象中更新数据来刷新指标,进而得到真实的指标数据。

    后续操作

    数据同步到目标端 Kafka 后,可进行数据消费,我们为您提供了消费示例 Demo,方便您快速测试消费数据的流程,了解数据格式解析的方法。
    使用 Kafka 客户端消费数据(Avro)
    使用 Kafka 客户端消费数据(JSON)
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持