MySQL 的 Debezium 连接器。缺少数据库历史主题
Posted
技术标签:
【中文标题】MySQL 的 Debezium 连接器。缺少数据库历史主题【英文标题】:Debezium connector for MySQL. The db history topic is missing 【发布时间】:2019-06-15 18:36:39 【问题描述】:我正在使用 Debezium 连接器 0.8 版从 mysql 数据库中捕获更改并将其移动到 Kafka。我正在使用 Docker,其中一个容器用于 MySQL,另一个用于连接器,另一个用于 Kafka。
当我停止 Docker (docker-compose down
) 并再次启动 Docker 时,通常会收到以下错误:
org.apache.kafka.connect.errors.ConnectException: The db history topic is missing. You may attempt to recover it by reconfiguring the connector to SCHEMA_ONLY_RECOVERY
我已经在官方页面上阅读了这个问题的解决方案:
https://debezium.io/blog/2018/03/16/note-on-database-history-topic-configuration/
但我遵循了这些步骤,我认为我的配置还可以:
log.retention.bytes = -1
log.retention.hours = 168
log.retention.minutes = null
log.retention.ms = -1
请注意,如果我将log.retention.ms
设置为-1,那么log.retention.minutes
和log.retention.hours
将不会像官方文档解释的那样被使用,然后我已经解决了保留大小和保留时间问题。
那么,有人知道我为什么会收到这个错误吗?
这是大学工作的一部分。我想我无法在我的大学发布之前分享完整的docker-compose
文件,但我可以向您展示与此问题相关的重要信息。我不认为这是配置问题,因为我的 docker-compose
没有什么特别之处。
mysql:
image: mysql/5.7:configured (Little changes like enabling queries...)
environment:
- MYSQL_ROOT_PASSWORD=debezium
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqlpw
volumes:
- "sql_Data:/var/lib/mysql"
- "sql_LogError:/var/log/mysql"
kafka:
image: debezium/kafka:0.8
depends_on:
- zookeeper
environment:
- HOST_NAME=xxxx
- ADVERTISED_HOST_NAME=xxxx
- ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_CREATE_TOPICS="events:1:1"
- KAFKA_LOG_RETENTION_MS=-1
volumes:
- "kafka_Data:/kafka/data"
- "kafka_Log:/kafka/logs"
- "kafka_Conf:/kafka/config"
connect:
image: debezium/connect:0.8
depends_on:
- zookeeper
- kafka
- mysql
environment:
- HOST_NAME=xxxx
- ADVERTISED_HOST_NAME=xxxx
- BOOTSTRAP_SERVERS=xxxx:9092
- GROUP_ID=1
- CONFIG_STORAGE_TOPIC=my_connect_configs
- OFFSET_STORAGE_TOPIC=my_connect_offsets
- STATUS_STORAGE_TOPIC=my_connect_statuses
volumes:
sql_Data:
sql_LogError:
kafka_Data:
kafka_Log:
kafka_Conf:
而其他部分只是网络或无关的东西。
【问题讨论】:
你使用的是什么版本的 Debezium? 你也可以分享你的 Docker Compose 文件吗? 我已经编辑了最初的帖子以添加 docker-compose 部分。我希望这是足够的信息 能否请您检查是否创建了具有架构历史记录的主题?如果有,有数据吗?您可以使用kafka-topics
工具获取有关该主题的元数据信息吗?
dbhistory 存在并且里面有数据(我用 kafka 工具监控它)。我看看我是否使用 docker-compose stop 而不是 docker-compose down 它工作正常。这可能是数量问题,但我没有发现问题。我尝试将 kafka 卷用作外部卷,但问题仍然存在。我可能需要设置更多的环境变量吗?我已经检查了有关如何为此 kafka 映像创建卷的官方文档,并且我认为我已经完成了正确的卷配置。 link
【参考方案1】:
我遇到了类似的问题。 mysql.properties
配置文件中的 database.server.id
和 database.server.name
必须是唯一的。
【讨论】:
问题是 debezium/zookeeper 图像文档中的勘误表(我不知道是否真的修复了)。阅读下面我的答案,也许它可以帮助你 更改database.server.name
帮助我解决了这个问题!【参考方案2】:
终于在这个问题苦苦挣扎了很多天后,找到了问题的原因和解决办法。
debezium/zookeeper
图像的文档中有一个勘误表。正如您在此链接中看到的:
link to debezium/zookeeper image in dockerHub
文档建立了 3 个卷来保存 zookeeper 需要的所有数据。这些卷的路径是:
/zookeeper/data
/zookeeper/logs
/zookeeper/conf
这里的问题是第二个是错误的。根据它的Dockerfile
,第二个用来保存事务日志的路径必须是:
/zookeeper/txns
这是它的Dockerfile
的sn-p。
# Expose the ports and set up volumes for the data, transaction log, and configuration
EXPOSE 2181 2888 3888
VOLUME ["/zookeeper/data","/zookeeper/txns","/zookeeper/conf"]
【讨论】:
【参考方案3】:永远不要让历史主题过期或删除历史主题。这就是导致问题的原因。
为避免主题过期,请按照此处的 Kafka 文档运行以下命令:https://debezium.io/blog/2018/03/16/note-on-database-history-topic-configuration/
<KAFKA_DIR>/bin/kafka-configs.sh --zookeeper zookeeper:2181 --entity-type topics --entity-name <DB_HISTORY_TOPIC> --alter --add-config retention.bytes=-1
要在开发环境中从这个问题中恢复,只需删除您的原始连接器并重新创建一个具有不同名称的新连接器。
【讨论】:
写完问题后,我找到了解决方案,这是文档中的勘误表,报告为issues.jboss.org/browse/DBZ-1231,我认为已解决。您可以阅读我上面的答案以了解更多信息,但正如我所说,它仍然解决了。以上是关于MySQL 的 Debezium 连接器。缺少数据库历史主题的主要内容,如果未能解决你的问题,请参考以下文章
尝试运行连接器类“io.debezium.connector.mysql.MySqlConnector”时出错