项目使用Kafka镜像报错处理记录:this server does not host this topic-partition

背景

  1. 项目使用docker swarm部署
  2. 服务之间使用消息中间件 kafka 通信
  3. Kafka 使用 star 3.7k 的 wurstmeister/kafka:2.12-2.2.1 镜像
  4. Zookeeper 使用 zookeeper:3.5.5 镜像

问题描述

每当Kafka和Zookeeper服务重启后,项目就会报以下错误:

org.apache.kafka.common.errors.UnknownTopicOrPartitionException:
This server does not host this topic-partition

由于是开发环境,之前每次遇到这种问题,都是粗鲁的直接清掉KafkaZookeeper的存储文件,随后重启就工作正常。

在切CICD环境之前,我们一直使用物理机部署程序在跑,在物理机上安装的Kafka和Zookeeper, 项目运行了一年多从来没出现过这种问题。

排查问题

首先仔细阅读了kafka镜像的readme文件,问题出现在下面这块:

By default each broker will get a new port number and broker id on restart. Depending on your use case this might not be desirable. If you need to use specific ports and broker ids, modify the docker-compose configuration accordingly.

默认情况下,在重启Kafka镜像时每个broker会获取一个新的broker id。在你的项目中,这种机制或许是不合适的。如果你需要用指定的broker ids,请相应地修改你的docker-compose配置。

看了这一段说明,我追踪了以下zookeeper/borkers/ids 下面的节点信息,发现每次重启Kafka之后,都会生成新的id出来,这就是问题的根本。

于是我接着查看了一下物理机上Kafka的配置文件,发现 broker id 在配置项中是固定值 0。

file

解决方案

  1. 修改 docker-compose 文件中 kafka 的配置,明确配置 Kafka 的 broker id,例如:环境变量添加 KAFKA_BROKER_ID: 0
  2. 通过 BROKER_ID_COMMAND 命令配置,例如:BROKER_ID_COMMAND: "hostname | awk -F'-' '{print $$2}'"
  3. 如果你的环境支持自动伸缩,那么推荐使用 --no-recreate 选项来确保 container 不会重新创建,这样就会保留之前生成的 broker id

欢迎访问我的个人博客

关注公众号:JAVA九点半课堂,这里有一批优秀的程序猿,加入我们,一起探讨技术,共同进步!回复“资料”获取 2T 行业最新资料!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在hyperledger fabric的orderer中,目前发布的版本是使用kafka来做排序,并没有用到所谓的...
    y9g阅读 6,659评论 0 3
  • 大致可以通过上述情况进行排除 1.kafka服务器问题 查看日志是否有报错,网络访问问题等。 2. kafka p...
    生活的探路者阅读 7,638评论 0 10
  • 一、入门1、简介Kafka is a distributed,partitioned,replicated com...
    HxLiang阅读 3,442评论 0 9
  • Docker在很多时候都可以帮助我们快速搭建想要的开发环境,免去了很多安装配置上的麻烦。在涉及到Apache Ka...
    表现力阅读 63,574评论 1 24
  • 逻辑层次练习 逻辑层次的运用不仅能培养孩子成为高效的决策者,而且可以协助他们使用逻辑层次问题做出重要决定。 周末闲...
    何晓溪阅读 418评论 0 0