【问题标题】:Debezium connector for MySQL. The db history topic is missingMySQL 的 Debezium 连接器。缺少数据库历史主题
【发布时间】: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

标签: apache-kafka apache-kafka-connect debezium


【解决方案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 需要的所有数据。这些卷的路径是:

  1. /zookeeper/data
  2. /zookeeper/logs
  3. /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,我认为已解决。您可以阅读我上面的答案以了解更多信息,但正如我所说,它仍然解决了。
    猜你喜欢
    • 2020-11-30
    • 2019-01-10
    • 2013-10-19
    • 2014-02-20
    • 2022-11-29
    • 2021-08-24
    • 2019-03-26
    • 2015-02-07
    • 2017-05-04
    相关资源
    最近更新 更多