为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java Docker

背景

  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
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消