使用ticdc将blob类型的数据写入到kafka后,数据损坏导致无法解码

【TiDB 使用环境】生产环境
【TiDB 版本】7.5.4
【操作系统】Debian
【部署方式】lxc容器
【集群数据量】3T
【集群节点数】9
【问题复现路径】写入到 kafka 后数据变掉了,无法正常读取
【遇到的问题:问题现象及影响】使用ticdc将blob类型的数据写入到kafka后,数据损坏导致无法解码

blob 类型的字段,存储的二进制数据为
“\xe5\xa6\x82\xe6\xb2\x9f\xe9\x80\x9a\xef\xbc\x8c\xe8\xaf\xb7\xe4\xbf\xae\xe6\x94\xb9”

使用 utf8 可以正常解码,解码结果为 “如沟通,请修改”

该数据通过 ticdc 写入到 kafka,业务反馈乱码
经过我这里从 kafka 读取,该 blob 字段的数据变成了
“\xc3\xa5\xc2\xa6\xc2\x82\xc3\xa6\xc2\xb2\xc2\x9f\xc3\xa9\xc2\x80\xc2\x9a\xc3\xaf\xc2\xbc\xc2\x8c\xc3\xa8\xc2\xaf\xc2\xb7\xc3\xa4\xc2\xbf\xc2\xae\xc3\xa6\xc2\x94\xc2\xb9”

写入到 kafka 的数据是这样的,comment 为异常 blob 字段

无法正常解码

看起来像是跳过了奇数的二进制数据,用的什么协议呢?

连接 kafka 配置了这些,使用的是 canal-json 格式

kafka-version=1.1.1&max-message-bytes=10000000&partition-num=3&protocol=canal-json&replication-factor=2&sasl-mechanism=plain&sasl-password=xxxxx&sasl-user=xxxxx

是从 kafka 读出来的数据就错误了吗?确认过消费程序的问题吗

https://docs.pingcap.com/zh/tidb/stable/ticdc-canal-json/#binary-和-blob-类型

参考上面贴出来的代码,做一下转码

3 个赞

确认过的,发现乱码后我手动从 kafka 读取的,写进去的时候就是错的

按照上面提供的方式来解码一下呢。

我这里试了试编码解码给解出来了 :joy:,问下这个符合预期吗
image

就是 kafka 中读取的字符串按下面的顺序解码编码就能转出来

a.decode('utf-8').encode('ISO-8859-1').decode('utf-8')

符合预期,blob 类型的数据,会按照 ISO-8859-1 编码,这是 canal 官方的实现方式。

1 个赞

好滴感谢

正解,得解码