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.minuteslog.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.iddatabase.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”时出错

Debezium - 自定义负载 - MySQL 连接器

重新启动数据库后尝试重新启动 debezium mysql 连接器时出错

为数据库中的多个表配置 debezium 连接器

一个 Mysql DB 的多个 debezium 连接器

Debezium 将 Avro 数据视为二进制