【kafka】Error while fetching metadata xxx: {TEST=LEADER_NOT_AVAILABLE}

作者分享Kafka集群报错的解决思路。公司开启消费者处理日志时出现问题,作者先检查Kafka服务是否正常、代码有无错误,后发现是注册在zookeeper上的信息有问题,将advertised.listeners改成内网ip,advertised.port改成内网端口,重启服务后问题解决。强调遇到报错要有目的排查。

本人菜鸡一只,该文章会比较短,而且没有比较详细的报错和图片,但是我想解决问题的思路还是可以分享下的!

公司有一个kafka集群,我接手做了些文字匹配的东西之后,好久都没人用过了。

然后最近公司想做统一日志的收集,打算开启一个消费者来处理多个项目的日志,结果就发生了如下的问题!

 

19/06/12 10:25:37 WARN clients.NetworkClient: 
[Producer clientId=console-producer] Error while fetching metadata with correlation id 62 : {my_test_topic=LEADER_NOT_AVAILABLE}

我发现有人的报错和我一样,报错就是类似这个:https://www.orchome.com/1108

 

情况大概是这样的,需要检查几个地方:

1、kafka服务是否正常?

-1.我们kafka服务是通过CM启动的,可以在CM上面查看运行情况(我这个报错,CM上看是正常的)

-2.可以去到具体启动kafka的那几台机器上通过:jps -ml来查看(jps -ml可以查看该broker启动的时候我读取哪个配置文件),这个很关键!因为如果服务用A配置文件启动,结果你改的是B配置文件,就算你把B配置文件改上天了,都不会生效的!!

 

2、是否是自己的代码或者其他东西写错了?

当你确认服务正常的时候,那么可以使用自带的生产者和消费者来测试,因为这个是可以确保生产者和消费者没问题的一个点(因为你手写的生产者或者消费者代码有可能会有问题啊!!!)

测试命令如下:

1、创建topic
kafka-topics.sh --create --zookeeper zk1:2181 --replication-factor 1 --partitions 1 --topic mytest_topic


2、开启生产者:
kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092... --topic mytest_topic 
 

3-1、消费者操作:
kafka-console-consumer.sh --broker-list kafka1:9092,kafka2:9092...  --from-beginning --topic mytest_topic
3-2、也可以这么开启消费者:
bin/kafka-console-consumer.sh --zookeeper zk1:2181 --topic topic mytest_topic

结果我就是在这一步开启生产者要发数据的时候报错了!!!

 

3、如何解决该报错?

当我通过前两步确认了你的环境没什么大问题,但是却发送不了数据,我开始静下心来看报错!

1、Error while fetching metadata (获取元数据异常)

2、LEADER_NOT_AVAILABLE (无法获取该topic的leader)

也就是说,很可能是注册在zookeeper上的信息有问题!通过新创建topic,也不能发送消息的情况,我确认了,这个异常跟topic没有什么关系,所以肯定还是broker的问题!

因此我回想起了之前的事情:

【kafka】报错:advertised.listeners参数的重要性(外部访问局域网kafka):https://blog.youkuaiyun.com/lsr40/article/details/84135959

这个集群的advertised.listeners参数,还是外网的ip和端口,是不是有可能这个外网ip和端口被运维关掉了的原因,导致节点之间通讯异常,topic选不出leader呢(因为topic是通过leader来与生产者和消费者交互的,这部分知识大家可以自行百度,或者查阅我的kafka的相关文章)

果然经过我的确认,确实那个ip和外网端口已经关闭,所以我将kafka的配置文件进行修改:

advertised.listeners改成内网ip(默认当前机器的ip)

advertised.port改成内网端口(默认9092)

重启kafka服务,就修好了该kafka环境

 

总结:当遇到一些报错的时候,还是要一点一点的有目的的找,不要盲目的乱试(当然这需要对该框架有一定了解的情况下),大部分报错是环境问题,其次才是代码问题!

 

好了,本文还满短的,主要是为了把这个解决问题的思路和方法记录下来,菜鸡一只,下次再见拜拜~

(题外话:最近工作,天天跑数据跑的头都疼了!!!!嘎嘎嘎嘎)

 

<think>嗯,用户现在遇到了一个Kafka的错误,错误信息是“Error while fetching metadata with correlation id 2 : {test1=LEADER_NOT_AVAILABLE}”。我需要先理解这个错误的原因,然后给出解决方案。 首先,这个错误通常出现在Kafka客户端尝试获取主题元数据时,但对应的分区的Leader副本不可用。可能的情况有很多,我需要逐一分析。可能的因素包括Kafka集群不可达、主题未正确创建、Broker配置问题、网络问题,或者防火墙设置阻止了通信。 用户之前的问题是关于如何清除Kafka消息队列的记录,现在转向了错误处理,说明他们在操作过程中可能遇到了这个问题。他们可能是在尝试删除主题或者生产/消费消息时遇到了这个错误。需要考虑到用户可能对Kafka的运维不熟悉,因此需要给出详细的排查步骤。 接下来,我应该分步骤解释可能的原因和解决方法。首先检查Broker是否运行正常,确保所有Kafka节点都启动并且健康状态良好。然后确认主题是否存在,特别是用户提到的test1主题。如果主题不存在,客户端请求元数据时会导致这个错误,因此需要创建主题。 然后,检查Broker的配置,特别是advertised.listeners是否正确设置。如果配置错误,客户端可能无法连接到Broker,导致无法找到Leader。另外,网络问题也不能忽视,需要检查客户端和Broker之间的网络连通性,包括端口是否开放,防火墙是否允许通信。 另外,可能需要检查Zookeeper的连接状态,虽然新版本的Kafka逐渐减少了对Zookeeper的依赖,但在某些情况下,Zookeeper的问题也可能影响Broker的状态管理。此外,日志分析也很重要,查看Broker的日志和客户端的日志,寻找更详细的错误信息。 用户可能是开发者或者运维人员,他们需要快速解决问题,所以步骤需要清晰,避免使用过于专业的术语,但又要足够详细。同时,要提醒他们在生产环境中操作时需谨慎,比如正确配置Broker,确保主题创建正确,以及处理网络问题的方法。 最后,总结常见原因和解决方案,帮助用户系统地排查问题。可能还需要给出具体的命令示例,比如使用kafka-topics.sh创建主题,检查Broker状态等,让用户可以直接执行这些命令来解决问题。</think>这个错误 `LEADER_NOT_AVAILABLE` 是 Kafka 客户端(生产者或消费者)尝试与集群通信时,无法找到主题分区的 Leader 副本导致的。常见于集群初始化、Broker 配置问题或网络故障场景。以下是可能的原因和解决方案: --- ### **1. 常见原因** - **Broker 未完全启动**:Kafka Broker 未完成启动或初始化(如 Zookeeper 未连接成功)。 - **主题未正确创建**:客户端请求的主题(如 `test1`)未被正确创建或元数据未同步。 - **Broker 配置问题**:Broker 的 `advertised.listeners` 配置错误,导致客户端无法连接 Leader。 - **网络问题**:客户端与 Broker 之间的网络不通,或防火墙阻止了端口访问。 - **分区无 Leader**:主题分区的 Leader 副本因故障未选举成功(例如 Broker 宕机)。 --- ### **2. 排查与解决步骤** #### **步骤 1:检查 Broker 状态** 确保所有 Kafka Broker 已正常启动并注册到 Zookeeper/Kraft(新版本): ```bash # 查看 Broker 是否在线 bin/zookeeper-shell.sh localhost:2181 ls /brokers/ids # 检查 Broker 日志(日志路径默认在 logs/server.log) tail -f logs/server.log ``` - 如果 Broker 未启动,重启并观察日志中的错误(如端口冲突、Zookeeper 连接失败)。 --- #### **步骤 2:确认主题是否存在** 检查主题 `test1` 是否已正确创建: ```bash # 列出所有主题 bin/kafka-topics.sh --bootstrap-server BROKER_HOST:9092 --list # 查看主题详情(确认分区 Leader 信息) bin/kafka-topics.sh --bootstrap-server BROKER_HOST:9092 --describe --topic test1 ``` - 如果主题不存在,**手动创建主题**: ```bash bin/kafka-topics.sh -- #### **步骤 3:检查 Broker 配置** 确保 Broker 的 `advertised.listeners` 配置正确(客户端实际连接的地址): ```properties # server.properties 关键配置 listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://BROKER_HOST:9092 # 必须能被客户端访问 ``` - 修改配置后重启 Broker。 --- #### **步骤 4:验证网络连通性** 确保客户端可以访问 Broker 的地址和端口: ```bash # 测试端口是否可达(替换为实际 Broker IP 和端口) telnet BROKER_HOST 9092 # 检查防火墙规则(如 AWS/Aliyun 安全组是否开放 9092 端口) ``` --- #### **步骤 5:查看客户端日志** 在客户端代码或日志中搜索更详细的错误信息: - 如果是生产环境,检查客户端与 Broker 的版本兼容性。 - 如果是代码连接,检查 `bootstrap.servers` 配置是否正确: ```java properties.put("bootstrap.servers", "broker1:9092,broker2:9092"); ``` --- #### **步骤 6:强制触发 Leader 选举** 如果分区 Leader 丢失,尝试重启 Broker 或手动触发选举: ```bash # 触发 Leader 重新选举(谨慎操作) bin/kafka-leader-election.sh --bootstrap-server BROKER_HOST:9092 --topic test1 --partition 0 --election-type PREFERRED ``` --- ### **3. 典型场景示例** - **场景 1**:首次创建主题后立即生产消息 **原因**:主题元数据未同步到所有 Broker。 **解决**:等待几秒后重试,或客户端配置重试机制: ```properties # 生产者/消费者配置 retries=3 retry.backoff.ms=1000 ``` - **场景 2**:Broker 的 `advertised.listeners` 配置为内网 IP,但客户端从外网连接。 **解决**:配置为公网 IP 或域名,确保客户端可访问。 --- ### **总结** - **核心问题**:客户端无法找到主题分区的 Leader 副本。 - **优先检查**:Broker 状态、主题是否存在、网络和配置。 - **临时规避**:客户端配置重试(`retries`)和超时(`request.timeout.ms`)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值