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 版本,其中包含此问题的修复。请注意,之前创建的数据库历史主题应按照上述说明进行重新配置。如果您对该问题有任何疑问,请随时在下方的评论区、聊天室或邮件列表中与我们联系。
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。