ticdc发送kafka消息过大

【 TiDB 使用环境】生产环境
【 TiDB 版本】v7.1.5
【复现路径】
【遇到的问题:问题现象及影响】
ticdc发送消息到kafka, 使用 canal-json 协议, max-message-bytes设置100M,但是在kafka端收到超过800M的消息,导致kafka报错,消息无法发送。

changefeed配置和 kafka报错信息:

kafka默认消息最大大小是1MB。

可以考虑使用 TiCDC 的数据压缩功能,通过配置 large-message-handle-compression 参数(如 lz4snappy ),在发送到 Kafka 之前压缩消息,以减少消息大小。
https://docs.pingcap.com/zh/tidb/stable/ticdc-sink-to-kafka#ticdc-层数据压缩功能

kafka的消息大小已经做过设置了

压缩功能 v7.4 才支持

没注意你的版本…… :joy:

考虑下升级到 v7.5吗?

刚升级到v7.1.5不久,优先看看什么问题,是不是bug,目前版本有没有办法绕过,实在不行再考虑升级问题

麻烦提供一下 kafka 的版本号。

上面的截图中有,3.1.0

  1. 调整Kafka的配置参数
  • 增加Kafka的message.max.bytes参数值,将其调大到1GB(1073741824)。
  • 增加replica.fetch.max.bytes参数值,同样调大到1GB(1073741824)。
  • 对于消费者,适当调大fetch.message.max.bytes参数值,确保它大于message.max.bytes
  1. 使用TiCDC的large-message-handle-option参数
  • 从TiDB v7.3.0开始,TiCDC Kafka sink支持在消息大小超过限制时只发送Handle Key的数据,这可以显著减少消息的大小。
  • changefeed配置中设置large-message-handle-option = "handle-key-only",这样当消息超过大小时,只会发送Handle Key。
1 个赞

先不要操作,我们这边还在调查。

错误来自于 nio 层,调大 socket.requet.max.bytes 参数。

看了下kafka的参数,目前设置为:
socket.request.max.bytes=904857600 //900M了
socket.request.timeout.ms=60000

设置完了之后,又出现更大的值,最大的都1.8G了

请提供一下监控. sink-MQ Sink 部分,尤其是 outgoing bytes 这块儿。

你们的数据,最大大小大概在多少?设置到 100mb 的目的是什么?

检查 cdc 日志,是否有 “invalid request size ” 内容,有的话提供一下。

没有这么大的消息,现在调整到20M,还是报错。 设置大一点主要考虑支持批量发送,性能会高一点。

cdc的日志中看不到以上错误信息, 错误日志是kafka端的。 因为kafka那边报错,导致cdc这边发送消息性能很低, 好像也在推进,很慢。

提供一下 kafka 相关监控内容呢。

监控看起来,outgoing bytes 数量很低,这个值是对每一个 request 大小的记录,也就是说发送端实际每次发送的数据大小。

1 个赞