【发布时间】:2022-01-20 16:34:29
【问题描述】:
当我在 Kafka 中运行 changefeed 时,它会发出一段时间的消息,但随后会卡住。在作业状态或日志中,我看到错误 kafka server: Message was too large, server rejected it to avoid allocation error.
这是什么意思,我该如何解决?
【问题讨论】:
当我在 Kafka 中运行 changefeed 时,它会发出一段时间的消息,但随后会卡住。在作业状态或日志中,我看到错误 kafka server: Message was too large, server rejected it to avoid allocation error.
这是什么意思,我该如何解决?
【问题讨论】:
Changefeeds 每行发出一条消息,单个消息的大小与更改的数据库行的大小成正比。如果您的最大行长度足够大,那么一个批次,甚至是一条单独的消息,可能会比您的 Kafka 服务器配置支持的要大。这最常发生在 jsonb 列中。这最终会阻止 changefeed 在包含这些大行的范围上取得进展,甚至可能导致重复重试,从而导致与较大消息一起批处理的较小消息下游出现大量重复。
如果可能,最简单的解决方案是增加 Kafka 的最大消息大小。这个答案会告诉你how to adjust broker configuration。
如果您无法调整 Kafka 的代理设置,您可以使用 kafka_sink_config 配置一些客户端设置,如文档中的 here 所述。默认情况下,Kafka changefeeds 配置为最小化消息大小(无批处理),因此这仅在 kafka_sink_config 已被使用时才有帮助。
最后的手段是删除或压缩表中的违规行,然后启动 changefeed 的副本。请注意,简单地恢复现有提要,或在行被修复之前使用光标启动一个提要,将不起作用,因为提要仍会尝试发出旧版本的行。
CockroachDB 的未来版本将更干净地处理从这个问题中恢复的问题。
【讨论】: