TICDC 同步 kafka 异常

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.0.6
【 问题现象】
报错时写入kafka异常,然后修改下kafka的参数max-message-bytes 就可以恢复,再出现同样的问题时也需要修改 kafka 的max-message-bytes参数,不论改大或者改小max-message-bytes参数都可以恢复同步
【 报错信息】
[2024/06/03 20:59:52.366 +08:00] [WARN] [json.go:404] [“Single message too large”] [max-message-size=10485880] [length=10560460] [table=db_name.table_name]
[2024/06/03 20:59:52.443 +08:00] [ERROR] [processor.go:305] [“error on running processor”] [capture=xx.xx.xx.xx:8300] [changefeed=task-xxx-xxx-kafka-v2] [error=“[CDC:ErrJSONCodecRowTooLarge]json codec single row too large”] [errorVerbose=“[CDC:ErrJSONCodecRowTooLarge]json codec single row too large\ngithub.com/pingcap/errors.AddStack\n\tgithub.com/pingcap/errors@v0.11.5-0.20201126102027-b0a155152ca3/errors.go:174\ngithub.com/pingcap/errors.(*Error).GenWithStackByArgs\n\tgithub.com/pingcap/errors@v0.11.5-0.20201126102027-b0a155152ca3/normalize.go:156\ngithub.com/pingcap/tiflow/cdc/sink/codec.(*JSONEventBatchEncoder).AppendRowChangedEvent\n\tgithub.com/pingcap/tiflow@/cdc/sink/codec/json.go:406\ngithub.com/pingcap/tiflow/cdc/sink.(*mqSink).runWorker\n\tgithub.com/pingcap/tiflow@/cdc/sink/mq.go:353\ngithub.com/pingcap/tiflow/cdc/sink.(*mqSink).run.func1\n\tgithub.com/pingcap/tiflow@/cdc/sink/mq.go:282\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\tgolang.org/x/sync@v0.0.0-20201020160332-67f06af15bc9/errgroup/errgroup.go:57\nruntime.goexit\n\truntime/asm_amd64.s:1357”]
[2024/06/03 20:59:52.443 +08:00] [ERROR] [processor.go:144] [“run processor failed”] [changefeed=task-xxx-xxx-kafka-v2] [capture=xx.xx.xx.xx:8300] [error=“[CDC:ErrJSONCodecRowTooLarge]json codec single row too large”] [errorVerbose=“[CDC:ErrJSONCodecRowTooLarge]json codec single row too large\ngithub.com/pingcap/errors.AddStack\n\tgithub.com/pingcap/errors@v0.11.5-0.20201126102027-b0a155152ca3/errors.go:174\ngithub.com/pingcap/errors.(*Error).GenWithStackByArgs\n\tgithub.com/pingcap/errors@v0.11.5-0.20201126102027-b0a155152ca3/normalize.go:156\ngithub.com/pingcap/tiflow/cdc/sink/codec.(*JSONEventBatchEncoder).AppendRowChangedEvent\n\tgithub.com/pingcap/tiflow@/cdc/sink/codec/json.go:406\ngithub.com/pingcap/tiflow/cdc/sink.(*mqSink).runWorker\n\tgithub.com/pingcap/tiflow@/cdc/sink/mq.go:353\ngithub.com/pingcap/tiflow/cdc/sink.(*mqSink).run.func1\n\tgithub.com/pingcap/tiflow@/cdc/sink/mq.go:282\ngolang.org/x/sync/errgroup.(*Group).Go.func1\n\tgolang.org/x/sync@v0.0.0-20201020160332-67f06af15bc9/errgroup/errgroup.go:57\nruntime.goexit\n\truntime/asm_amd64.s:1357”]

表的行宽有超过限制吗?

表定义有两个 longtext和三个 text 字段

该问题的核心就是,用户没有配置 max-message-bytes 参数,老版本上默认为 10mb,你这里同步的消息大小,超过了该值,自然就报错了。

符合预期。

https://docs.pingcap.com/zh/tidb/stable/ticdc-sink-to-kafka#最佳实践

1 个赞

你的问题是什么呢?

max-message-bytes 这个参数 kafka 配置了,用户推送 kafka 也配置了,用户配置的跟 kafka 配置的都是一样的

Ticdc 推送 kafka 报错 [CDC:ErrJSONCodecRowTooLarge]json codec single row too large

这个报错是指 TiCDC 在将变更数据写入 Kafka 时,发现单行数据的 JSON 编码过大,导致无法正常写入。通常情况下,这可能是由于单行数据中包含了过多的字段或者字段值太大,超出了 Kafka 的消息大小限制所导致的。

针对这个问题,你可以考虑以下几点解决方法:

1. 检查表结构设计

检查相关表的设计,尤其是 VARCHAR、TEXT 或 BLOB 类型的字段是否包含过大的数据。如果是,可以考虑优化数据存储方式,例如将大数据拆分存储在其他地方,并在主表中保留引用或者摘要等信息。

2. 缩减字段

如果单行数据中包含了过多的字段,可以考虑是否所有字段都需要被同步到 Kafka 中。可以根据实际需求选择性同步必要的字段,减少单行数据的大小。

3. 使用 Avro 格式

考虑使用 Avro 格式代替 JSON 格式进行数据编码。Avro 格式通常比 JSON 更紴紧,可以减少数据传输时的大小。

4. 调整 CDC 配置

在 TiCDC 的配置中,可以调整 sink 对应的 JSON 编码参数,例如 max-message-bytes 参数,适当增大单条消息的大小限制。

5. 增加分区

如果单行数据较大,可以考虑增大 Kafka Topic 的分区数,以便更细粒度地划分数据,从而降低单个分区的压力。

6. 分批处理

在 TiCDC 中可以设置合适的数据分批策略,将大数据按照一定规则分批处理,避免单行数据过大导致的问题。

7. 监控数据变化

定期监控表数据的变化情况,特别是字段值的大小变化,及时发现并处理潜在问题。

感觉像是kafka配置有问题。能贴一下你修改的配置吗

在启动cdc同步任务的时候是否有指定 max-message-bytes参数呢

学习了,max-message-bytes参数配置