Canal Demo 说明(Canal ProtoBuf/Canal JSON)

最近更新时间:2026-01-12 12:01:01

我的收藏

功能描述

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

如果您想了解更多 Canal 信息,请参考 Canal 详情

方案对比

功能
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。

示例

更新数据
DDL 操作
{
"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位精度的格式都进行兼容即可。