You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重启后Kafka无法工作:NotLeaderOrFollowerException问题求助

问题描述

按照Kafka官方快速开始文档操作,初始运行正常,但重启电脑后,执行以下命令启动ZooKeeper和Kafka:

./bin/zookeeper-server-start.sh ./config/zookeeper.properties
./bin/kafka-server-start.sh ./config/server.properties

启动生产者时(命令如下):

./kafka-console-producer.sh --topic REPA1 --bootstrap-server localhost:9092

反复收到错误:

WARN [Producer clientId=console-producer] Got error produce response with correlation id 5 on topic-partition REPA1-0, retrying (2 attempts left). Error: NOT_LEADER_OR_FOLLOWERS

最终报错:

Received invalid metadata error in produce request on partition REPA1-0 due to org.apache.kafka.common.errors.NotLeaderOrFollowerException: For requests intended only for the leader, this error indicates that the broker is not the current leader. For requests intended for any replica, this error indicates that the broker is not a replica of the topic partition.. Going to request metadata update now

当前环境为单Broker单分区,主题描述信息如下:

./kafka-topics.sh --bootstrap-server localhost:9092 --topic REPA1 --describe
# 输出:
Topic: REPA1    TopicId: r16Oy0BMQpmm-FNVBaGInA PartitionCount: 1   ReplicationFactor: 1    Configs: 
    Topic: REPA1    Partition: 0    Leader: 0   Replicas: 0 Isr: 0

需要解决重启后Kafka服务无法正常工作的问题。

解决方案

针对单Broker环境下的这个问题,可按以下步骤排查修复:

1. 确认Kafka Broker完全启动且无异常

查看Kafka的server.log日志(默认在logs/server.log),检查两个关键信息:

  • 是否有[KafkaServer id=0] started日志,确认Broker启动完成
  • 是否存在与ZooKeeper连接失败、日志目录权限不足、分区加载失败等异常日志

如果发现日志目录权限问题,执行命令修复权限(假设日志目录为/tmp/kafka-logs):

chmod -R 755 /tmp/kafka-logs

2. 验证ZooKeeper中的元数据一致性

使用ZooKeeper命令行客户端连接服务:

./bin/zkCli.sh -server localhost:2181

进入客户端后,执行以下命令检查元数据:

  • 确认Broker节点存在:
    get /brokers/ids/0
    
    输出应包含当前Broker的地址、端口等信息,无异常。
  • 检查分区状态:
    get /brokers/topics/REPA1/partitions/0/state
    
    正常输出应显示{"leader":0,"isr":[0],"controller_epoch":1,"leader_epoch":1}这类内容,确保leader和isr都是0。

如果元数据异常,可重启ZooKeeper和Kafka,让Broker重新注册元数据。

3. 检查Kafka配置文件的核心参数

打开config/server.properties,确认以下参数:

  • broker.id=0:确保每次启动Broker使用相同的ID,避免元数据混乱
  • listeners=PLAINTEXT://localhost:9092:监听地址与生产者连接的地址一致,避免无法通信
  • log.dirs=/tmp/kafka-logs:日志目录路径正确,且该目录未被系统清理(部分系统重启后会清空/tmp目录)

如果日志目录是/tmp下的路径,建议修改为非临时目录,比如:

log.dirs=/var/lib/kafka-logs

修改后创建目录并赋予权限:

mkdir -p /var/lib/kafka-logs
chown -R <你的用户> /var/lib/kafka-logs

4. 强制生产者刷新元数据

生产者可能缓存了旧的元数据,可在启动命令中强制刷新:

./kafka-console-producer.sh --topic REPA1 --bootstrap-server localhost:9092 --metadata-max-age-ms 0

该参数会让生产者每次请求都从Broker获取最新元数据,避免使用缓存的无效信息。

5. 重建主题(最后手段)

如果以上步骤都无效,可删除并重新创建主题:

# 删除主题
./kafka-topics.sh --bootstrap-server localhost:9092 --topic REPA1 --delete
# 重新创建主题
./kafka-topics.sh --bootstrap-server localhost:9092 --topic REPA1 --create --partitions 1 --replication-factor 1

之后再测试生产者是否正常。


内容的提问来源于stack exchange,提问作者John Keeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:40:41