解决kafka.errors.NodeNotReadyError: NodeNotReadyError

在CentOS环境下使用Python3.8和kafka-python库向Kafka服务发送消息时遇到NodeNotReadyError。此错误并非由版本引起,而是因客户端无法解析Kafka broker的hostname。解决方案是在hosts文件中添加Kafka服务的IP和hostname映射。这样,客户端就能正确解析hostname,建立连接。此外,使用Kafka图形化工具OffsetExplorer时,也需要进行相同配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python3.8 kafka-python==2.0.0

问题回顾

​ ​ 今天在线上环境(centos)向另一台kafka服务中发送消息时,产生NodeNotReadyError,是kafka-python模块里面主动抛出的异常,异常为 in check_version raise Errors.NodeNotReadyError(),很难不误解为是版本的问题,在GitHub、stackoverflow中对这个问题的答案都指向在建立连接的时候加入api_version参数,然而加了也没用。

解决方案

​ 需要访问哪台机器的kafka,就需要配置hosts文件。即在hosts文件下面添加ip hostname

  • 文件位置
    • linux:/etc/hosts
    • windows: C:/Windows/System32/drivers/etc/hosts
原理解析

​ ​ bootstrap.servers实际上是引导地址,而不是客户端真正建立长链接的地址。也就是说,客户端会根据引导地址去broker询问集群的所有broker信息,拿到返回的broker服务信息之后,再向指定的broker发起链接请求。此时由于kafka borker的advertised_listeners配置的是hostname,那么返回给客户端的元信息中的地址也是hostname,当客户端准备根据这个hostname建立长连接请求数据的时候,发现并解析不了该hostname。 于是当在主机etc/hosts文件中添加该hostname的ip映射之后便会根据域名解析找到。

Offset Explorer

Offset Explorer官网

Offset Explorer是kafka的图形化工具,在使用的时候,当需要连接远程kafka服务器的时候也是需要配置hosts文件的。这个工具可以很方便的管理kafka,提高效率。

<think>好的,我现在需要解决用户在虚拟机中配置Kafka时遇到的NoBrokersAvailable错误。首先,我得回顾一下常见的导致这个错误的原因。根据经验,这类问题通常和网络配置、Kafka broker的配置是否正确有关。用户提到使用了SSH隧道,可能涉及到网络端口转发的问题。 首先,检查Kafka的broker配置是否正确。用户提供的代码中,KafkaProducer连接的是本地的三个端口19091、19092、19093。通常,Kafka broker的配置需要正确设置listeners和advertised.listeners,尤其是在虚拟机或容器环境中,这两个配置项不正确的话,客户端可能无法正确连接到broker。比如,如果broker配置的advertised.listeners是内网IP,而客户端通过外部IP或端口访问,就会导致连接失败。需要确认broker的listeners是否绑定到了正确的接口,比如0.0.0.0,而advertised.listeners是否配置为客户端能够访问的地址和端口。 其次,检查虚拟机的网络设置。如果Kafka运行在虚拟机里,而客户端在宿主机或其他地方,需要确保虚拟机的网络模式(如NAT、桥接)允许外部访问。此外,SSH隧道是否正确配置?用户配置了SSH隧道将虚拟机的Kafka端口映射到本地的19091-19093,那么需要确认SSH命令是否正确,比如端口转发是否有误。例如,是否每个broker的端口都正确映射了?比如,如果Kafka broker实际监听的是9092端口,而SSH隧道将虚拟机的9092转发到本地的19091,那么配置中的bootstrap.servers应该是localhost:19091等,而不是其他端口。 另外,防火墙设置也可能导致问题。虚拟机和宿主机的防火墙是否放行了相关端口?例如,在Linux系统中,需要检查iptables或ufw的设置,确保Kafka使用的端口是开放的。 接下来,检查Kafka服务是否正常运行。在虚拟机中,是否所有broker都成功启动?可以通过执行jps命令查看是否有Kafka进程,或者检查日志文件是否有错误信息。如果broker没有正常启动,客户端自然无法连接,导致NoBrokersAvailable错误。 然后,客户端的配置是否正确。用户代码中使用了KafkaProducer,bootstrap_servers设置为kafka_host列表,里面是本地地址和端口。但需要确认这些端口是否真的通过SSH隧道正确映射到了虚拟机的broker端口。例如,假设每个broker在虚拟机中的地址是192.168.1.100:9092,通过SSH隧道将每个9092映射到本地的19091、19092、19093,那么客户端的配置应该是正确的。但如果SSH隧道没有正确建立,或者端口映射错误,就会连接不上。 还需要检查Kafka的advertised.listeners配置是否正确。例如,如果broker的advertised.listeners设置为内网IP,而客户端通过外部的SSH隧道连接,这时候客户端获取到的broker地址可能是内网IP,导致无法连接。这时候需要将advertised.listeners设置为外部可访问的地址,或者在SSH隧道配置中正确转发。 此外,DNS解析或hosts文件是否正确?如果broker配置中使用的是主机名,而客户端无法解析该主机名,也会导致连接失败。可以尝试在客户端的hosts文件中添加虚拟机的主机名和IP映射。 最后,测试连接是否通畅。可以使用telnet或nc命令测试本地的19091等端口是否能够连通。如果无法连通,说明SSH隧道可能没有正确建立,或者broker没有监听相应的端口。 总结下来,可能的解决步骤包括: 1. 检查Kafka broker的listeners和advertised.listeners配置。 2. 确认SSH隧道命令是否正确,端口映射是否准确。 3. 检查虚拟机和宿主机的防火墙设置。 4. 确保Kafka服务正常运行,没有报错。 5. 验证客户端的连接配置是否正确,包括地址和端口。 6. 测试网络连通性,确认端口是否可达。 可能还需要用户提供更多的配置细节,比如broker的server.properties内容,SSH隧道命令的具体参数,以及Kafka的日志信息,以便进一步诊断问题。</think>### Kafka虚拟机NoBrokersAvailable错误解决方案 #### 1. 检查Kafka Broker配置 - **关键配置项**:确保`server.properties`中`listeners`和`advertised.listeners`配置正确。 示例配置(需替换虚拟机IP和映射端口): ```properties listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://{宿主机IP}:19091 ``` - `listeners`绑定到`0.0.0.0`允许外部连接[^1]。 - `advertised.listeners`需设置为客户端访问的地址(即SSH映射后的地址和端口)。 #### 2. 验证SSH隧道配置 - **隧道命令示例**(单个broker): ```bash ssh -L 19091:虚拟机内IP:9092 user@虚拟机IP ``` - 需确保每个broker的端口正确映射(如19091、19092、19093对应三个broker)。 - 检查隧道是否建立成功:`netstat -an | grep 19091`显示`LISTEN`状态。 #### 3. 防火墙与端口放行 - **虚拟机内防火墙**: ```bash sudo ufw allow 9092/tcp # 允许Kafka默认端口 ``` - **宿主机防火墙**: ```bash sudo ufw allow 19091:19093/tcp # 放行映射端口 ``` #### 4. 客户端连接配置优化 - **Python客户端示例**: ```python from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers=['127.0.0.1:19091', '127.0.0.1:19092', '127.0.0.1:19093'], api_version=(2, 8, 1) # 显式指定Kafka版本 ) ``` - 添加`api_version`参数避免版本协商失败。 #### 5. 服务状态与日志排查 - **检查Kafka是否运行**: ```bash jps # 确认Kafka进程存在 ``` - **查看日志**: ```bash tail -f /kafka/logs/server.log # 检查启动错误或连接拒绝记录 ``` #### 6. 网络连通性测试 - **从宿主机测试端口**: ```bash telnet 127.0.0.1 19091 # 成功应显示Connected ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楼下安同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值