Debezium 的 MySQL 连接器用户向我们反映了一个关于连接器内部数据库历史主题配置的潜在问题,该问题可能导致该主题的部分内容被删除(DBZ-663)。如果您正在使用 Debezium MySQL 连接器的 0.7.3 或 0.7.4 版本,请继续阅读。

这个问题是什么?

在 Debezium 0.7.3 中,我们推出了一项功能,可以在数据库历史主题不存在时自动创建它(DBZ-278)。虽然此功能为主题设置了“无限”的保留时间,但它没有为历史主题指定“retention.bytes”选项。如果同时满足以下所有条件,则可能会导致历史主题的部分内容被删除:

  • 您正在使用 Debezium MySQL 连接器的 0.7.3 或 0.7.4 版本

  • 数据库历史主题是由连接器创建的(即您自己没有创建它)

  • Broker 级别的选项“log.retention.bytes”设置为 -1 以外的值(请注意,默认值**是** -1,在这种情况下,一切正常)

  • 数据库历史主题的大小超过了通过“log.retention.bytes”配置的阈值

如果历史主题不完整,连接器将在重启连接器后无法恢复数据库历史记录,并且不会继续读取 MySQL binlog。

如何防止此问题?

您应该自己创建一个具有无限保留期的数据库历史主题,或者覆盖连接器创建的历史主题的“retention.bytes”配置。

<KAFKA_DIR>/bin/kafka-configs.sh \
  --zookeeper zookeeper:2181 \
  --entity-type topics \
  --entity-name <DB_HISTORY_TOPIC> \
  --alter \
  --add-config retention.bytes=-1

如果历史主题的部分内容已被删除,并且自连接器上次提交的偏移量以来没有发生任何 schema 更改,您可以使用 `schema_only_recovery` 快照模式来重新创建历史主题。或者,应该进行一次全新的快照,例如通过设置一个新的连接器实例。

后续步骤

我们将在下周早些时候发布 Debezium 0.7.5 版本,其中包含此问题的修复。请注意,之前创建的数据库历史主题应按照上述说明进行重新配置。如果您对该问题有任何疑问,请随时在下方的评论区、聊天室或邮件列表中与我们联系。

Gunnar Morling

Gunnar 是一位软件工程师,内心是一个开源爱好者,目前在 Confluent 担任技术专家。此前,他曾帮助构建一个基于 Apache Flink 的实时流处理平台,并领导了 Debezium 项目,这是一个用于变更数据捕获的分布式平台。他是 Java Champion,并创立了多个开源项目,如 JfrUnit、kcctl 和 MapStruct。Gunnar 是一位热情的博主 (morling.dev),并曾在 QCon、Java One 和 Devoxx 等各种会议上发表演讲。他居住在德国汉堡。

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×