项目使用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服务重启后,项目就会报如下错误:docker

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

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

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

排查问题

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

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配置。spa

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

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

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

欢迎访问个人我的博客server

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

相关文章
相关标签/搜索