一、功能描述
如果你想了解更多 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。说明:全量任务阶段固定为 INITINSERT,增量任务阶段固定为 INSERT。 |
| 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位精度的格式都进行兼容即可。