Debezium 刷新超时和 OutOfMemoryError 错误 MySQL

Debezium flush timeout and OutOfMemoryError errors with MySQL

使用 Debezium 0.7 从 MySQL 中读取,但在初始快照阶段出现刷新超时和 OutOfMemoryError 错误。查看下面的日志,似乎连接器试图一次性写入太多消息:

WorkerSourceTask{id=accounts-connector-0} flushing 143706 outstanding messages for offset commit   [org.apache.kafka.connect.runtime.WorkerSourceTask]
WorkerSourceTask{id=accounts-connector-0} Committing offsets   [org.apache.kafka.connect.runtime.WorkerSourceTask]
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
WorkerSourceTask{id=accounts-connector-0} Failed to flush, timed out while waiting for producer to flush outstanding 143706 messages   [org.apache.kafka.connect.runtime.WorkerSourceTask]

想知道大型数据库 (>50GB) 的正确设置是什么 http://debezium.io/docs/connectors/mysql/#connector-properties。对于较小的数据库,我没有这个问题。简单地增加超时似乎不是一个好策略。我目前使用的是默认连接器设置。

更新

按照下面的建议更改了设置并解决了问题:

OFFSET_FLUSH_TIMEOUT_MS: 60000  # default 5000
OFFSET_FLUSH_INTERVAL_MS: 15000  # default 60000
MAX_BATCH_SIZE: 32768  # default 2048
MAX_QUEUE_SIZE: 131072  # default 8192
HEAP_OPTS: '-Xms2g -Xmx2g'  # default '-Xms1g -Xmx1g'

这是一个非常复杂的问题 - 首先,Debezium Docker 图像的默认内存设置非常低,因此如果您正在使用它们,可能需要增加它们。

接下来,有多种因素在起作用。我建议执行以下步骤。

  1. 增加 max.batch.sizemax.queue.size - 减少提交次数
  2. 增加offset.flush.timeout.ms - 给予 Connect 处理累积记录的时间
  3. 减少offset.flush.interval.ms - 应该减少累积偏移量

可惜有一个issue KAFKA-6551潜伏在后台,还能大闹

补充 Jiri 所说的话:

Debezium bugtracker 中现在有一个未解决的问题,如果您有任何关于根本原因、日志或复制的更多信息,请随时提供。

对我来说,更改 Jiri 在他的评论中提到的值并没有解决问题。唯一可行的解​​决方法是在同一个 worker 上创建多个连接器,每个连接器负责所有表的一个子集。为此,您需要启动连接器 1,等待快照完成,然后启动连接器 2,依此类推。在某些情况下,当较晚的连接器开始快照时,较早的连接器将无法刷新。在这些情况下,您可以在所有快照完成后重新启动 worker,连接器将再次从 binlog 中获取(确保您的快照模式为“when_needed”!)。

我可以确认 Jiri Pechanec 上面发布的答案解决了我的问题。这是我使用的配置:

kafka connect worker 配置设置在 worker.properties 配置文件中:

offset.flush.timeout.ms=60000
offset.flush.interval.ms=10000
max.request.size=10485760

Debezium 配置通过 curl 请求进行初始化:

max.queue.size = 81290
max.batch.size = 20480

我们没有 运行 使用暂存 MySQL 数据库 (~8GB) 解决这个问题,因为数据集要小得多。对于生产数据集 (~80GB),我们必须调整这些配置。

希望对您有所帮助。