zoukankan      html  css  js  c++  java
  • 项目使用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 行业最新资料!

  • 相关阅读:
    getContentResolver()内容解析者查询联系人、插入联系人
    ContentProvider备份短信,以xml文件存储
    ContentProvider详解
    bindService初步了解
    Service之来电监听(失败的案例)
    Android帧动画
    AlertDialog之常见对话框(单选对话框、多选对话框、进度条对话框)
    BroadcastReceiver之(手动代码注册广播)屏幕锁屏、解锁监听、开机自启
    BroadcastReceiver之有序广播
    [FJOI2015]火星商店问题
  • 原文地址:https://www.cnblogs.com/noodlesmars/p/11956369.html
Copyright © 2011-2022 走看看