功能描述
DTS 写入到 Kafka 的同步数据支持兼容开源工具 Canal 格式,采用 ProtoBuf 或者 JSON 的序列化协议,您可以在配置 DTS 同步任务的过程中选择数据格式 Canal Protobuf 或者 Canal JSON,然后使用消费 Demo 进行业务适配,即可得到消费数据。

方案对比
功能 | DTS 同步到 Kafka 方案 | Canal 同步方案 |
数据类型 | 全量 + 增量 | 仅增量 |
数据格式 | Canal ProtoBuf、Canal JSON | Protobuf、JSON |
成本 | 购买云资源,初始配置完成后,后续基本不需要维护 | 需要客户自己部署和维护 |
Canal JSON 格式兼容性说明
DTS 支持两种模式的 Canal JSON,包括不完全兼容模式和完全兼容模式。
用户可使用之前 Canal 方案中的消费程序直接消费。对 DTS 方案中 Canal JSON 格式进行数据消费时的字段名称,与 Canal 方案中 JSON 格式的字段名称保持一致,仅需要注意以下差异。
1. 对于不完全兼容模式,源库中二进制相关类型的字段(包括 binary、varbinary、blob、tinyblob、mediumblob、longblob、geometry)同步到目标端后会转换为 HexString,请用户在消费数据时注意。对于完全兼容模式,源库中二进制相关类型与 Canal 一致。
2. 对于不完全兼容模式,源库中 Timestamp 类型的字段同步到目标端会转换为0时区(如"2021-05-17 07:22:42 +00:00"),用户在解析和转换的时候需要考虑时区信息。完全兼容模式与 Canal 一致。
3. Canal 方案的 JSON 格式中定义了 sqlType 字段,该字段在 JDBC(Java 数据库连接)中使用,表示 SQL 数据类型。因为 Canal 底层采用 Java 语言,而 DTS 底层采用 Golang 语言实现,所以 DTS 提供的 Canal JSON 格式中这个字段留空处理。
参数说明
参数 | 说明 |
database | 数据库名称。 |
es | 操作在源库的执行时间,13位 Unix 时间戳,单位为毫秒。 说明: 实际执行时间以秒为单位,补充000到毫秒单位。 Unix 时间戳转换工具可通过搜索引擎获取。 |
id | 操作的序列号。 说明: 通过时间戳和 DTS 内部偏移量的生成,可以辅助用作记录先后顺序。 |
isDdl | 是否是 DDL 操作,取值如下: true:是。 false:否。 |
mysqlType | 字段的数据类型。 说明: 不支持精度等数据类型的参数信息。 |
old 与 data | 变更前或变更后的数据。 |
pkNames | 主键名称。 |
sql | SQL 语句。 |
sqlType | 经转换处理后的字段类型。 |
table | 表名。 |
ts | 操作开始写入到目标库的时间,13位 Unix 时间戳,单位为毫秒。 说明: Unix 时间戳转换工具可通过搜索引擎获取。 |
type | 操作的类型,例如,DELETE、UPDATE、INSERT。 说明: 全量任务阶段固定为 INIT。 |
gtid | 全局事务标识 GTID(Global Transaction Identifier),具有全局唯一性,一个事务对应一个 GTID。 |
示例
{"data": [{"id": "500000287","shipping_type": null}],"database": "dbname","es": 1600161894000,"id": 58,"isDdl": false,"mysqlType": {"id": "bigint","shipping_type": "varchar"},"pkNames": ["id"],"sql": "","sqlType": {"id": -5,"shipping_type": 12},"table": "tablename","ts": 1600161894771,"type": "DELETE"}
{"database":"dbname","es":1600161894000,"id":58,"isDdl":true,"sql":"eg:createxxx","table":"tablename","ts":1600161894771,"type":"DDL"}
Canal ProtoBuf 格式兼容性说明
对 Canal ProtoBuf 格式的数据消费,需要使用 DTS 提供的协议文件,因为 DTS 协议文件中增加了如全量同步等功能逻辑,该协议文件已包含在消费 Demo 中。所以用户需要使用 DTS 提供的消费 Demo,并在这个 Demo 基础上适配自身业务逻辑,才能得到消费数据。
消费 DTS 提供的 Canal ProtoBuf 格式数据时的字段名称,与 Canal 方案提供的 ProtoBuf 格式一致,仅需要注意以下差异。
1. 源库中二进制相关类型的字段(包括 binary、varbinary、blob、tinyblob、mediumblob、longblob、geometry)同步到目标端后会转换为 HexString,请用户在消费数据时注意。
2. 源库中 Timestamp 类型的字段同步到目标端会转换为0时区(如"2021-05-17 07:22:42 +00:00"),用户在解析和转换的时候需要考虑时区信息。
数据转化逻辑
对于时间类型,转换逻辑如下。
datetime:DTS 对源库全量及增量数据的精度解析,与源库实际的精度保持一致(0~6位精度)。
示例1:源库 INSERT 数据 datetime 值为
2024-10-24 12:34:56.123456,消费到的数据为 2024-10-24 12:34:56.123456。示例2:源库 INSERT 数据 datetime 值为
2024-10-25 12:34:56,消费到的数据为 2024-10-25 12:34:56。time:DTS 解析的精度一定大于等于源端精度,必要时会补0~6位精度。
timestamp:DTS 对源库全量及增量数据的精度解析,与源库实际的精度保持一致(0~6位精度)。
说明:
建议用户在消费数据时,不必关注源库的精度,消费程序中对时间类型的字段解析0~6位精度的格式都进行兼容即可。