kafka无法启动,提示连接zookeeper超时

想必不少人都遇到过这种场景,明明昨天环境还好好的,今天怎么就不行了呢?关键是这种情况,有时候连重启大法都不管用了,顿时陷入了毫无头绪的茫然中。。。

好了,聊回话题本身,因为升级程序,会自动重启zookeeper和kafka。程序升级成功之后,zookeeper服务正常,kafka服务未正常启动。查看其日志,显示连接zookeeper超时,然后自动退出程序。因为对kafka service设置了服务失败时自动重启,所以,kafka就一直在那无限重启。以下是kafka启动失败以及自动重启的日志:

bash 复制代码
[2024-08-15 12:15:46,799] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
        at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:254)
        at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:108)
        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1980)
        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:500)
        at kafka.server.KafkaServer.startup(KafkaServer.scala:203)
        at kafka.Kafka$.main(Kafka.scala:109)
        at kafka.Kafka.main(Kafka.scala)
[2024-08-15 12:15:46,800] INFO shutting down (kafka.server.KafkaServer)
[2024-08-15 12:15:46,805] INFO App info kafka.server for 0 unregistered (org.apache.kafka.common.utils.AppInfoParser)
[2024-08-15 12:15:46,806] INFO shut down completed (kafka.server.KafkaServer)
[2024-08-15 12:15:46,806] ERROR Exiting Kafka. (kafka.Kafka$)
[2024-08-15 12:15:46,808] INFO shutting down (kafka.server.KafkaServer)
[2024-08-15 12:15:48,120] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2024-08-15 12:15:48,480] INFO Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation (org.apache.zookeeper.common.X509Util)
[2024-08-15 12:15:48,592] INFO Registered signal handlers for TERM, INT, HUP (org.apache.kafka.common.utils.LoggingSignalHandler)
[2024-08-15 12:15:48,596] INFO starting (kafka.server.KafkaServer)

说明一下,当前的zookeeper和kafka的连接是使用了SASL机制。最开始怀疑是不是SASL的配置升级时被破坏了,导致问题发生。于是,从其他正常的环境将zookeeper和kafka的相关配置文件都复制过来,再重启,看下是否正常。很不幸,不是配置的问题。

继续翻看日志的时候,发现了这行日志:

bash 复制代码
[2024-08-15 12:15:46,679] INFO Session establishment complete on server 10.10.10.1/10.10.10.1:2181, session id = 0x10071c4a84a000b, negotiated timeout = 18000 (org.apache.zookeeper.ClientCnxn)

协商时间是18000毫秒,也就是18s,既然你报连接超时,那我就把这个时间配置大一点,再看看你报什么错。找到kafka的配置文件server.properties,然后修改这个参数:

bash 复制代码
# Timeout in ms for connecting to zookeeper
# zookeeper.connection.timeout.ms=18000
zookeeper.connection.timeout.ms=60000

我直接将默认的18s给改到60s,然后重启kafka。神奇的事情发生了。。。kafka连上zookeeper了,不再报超时的错误了。

虽然连上了,但是这个并正常啊,zookeeper和kafka都是本机运行的,他们之间通信哪里需要那么长的时间啊,默认的18s都足够长了,一定是系统哪里设置的不对,影响到了kafka与zookeeper的网络连接。

这时候,想起之前也遇到过类似的情况,当时好像还通过打断点的方式跟踪了代码的执行情况。详细的过程就不讲了,只说一下,当时怀疑是/etc/resolv.conf配置文件,里面配置了谷歌的域名解析服务器地址。如下:

bash 复制代码
search localdomain
nameserver 8.8.8.8
nameserver 8.8.4.4

由于机房并未通外网,所以,当前主机ping这两个域名服务器的地址是ping不通的。既然ping不通,那就不要使用它了,而且,我们的程序都是使用的ip地址,不是域名,也用不到域名服务器进行解析。我选择屏蔽这两个地址,如下:

bash 复制代码
search localdomain
#nameserver 8.8.8.8
#nameserver 8.8.4.4

修改完了之后,为了保证生效,我是直接reboot的操作系统,最开始是systemctl restart network来重启的网卡,但好像没生效。系统重启好了之后,再将kafka的service.properties配置改为默认的18s:

bash 复制代码
# Timeout in ms for connecting to zookeeper
zookeeper.connection.timeout.ms=18000
# zookeeper.connection.timeout.ms=60000

然后重启kafka,看下日志,是否还会提示连接超时。理论上,kafka应该恢复了正常。

回头想想,因为/etc/resolv.conf导致类似的问题,在我身上发生了不止一次,这次也是定位了半天,才想到可能是它导致的。公共环境,大家都在用,也不知道是谁,什么时候加上去的,只能说,太坑了。。。

而且,我想不明白的是,记得当时断点跟踪代码时,使用的ip连接网络的时候,底层还是要会找域名服务器解析一下?这已经超过我的业务能力了,搞不懂。。。

相关推荐
richard_yuu2 小时前
工控场景落地|分布式协调与动态重配置管理,如何实现产线不停机升级?
分布式
Devin~Y2 小时前
互联网大厂Java面试:Spring Boot/Redis/Kafka/K8s 可观测 + RAG(向量检索/Agent)三轮追问实录
java·spring boot·redis·kafka·kubernetes·spring mvc·webflux
MoFe12 小时前
【.net core】【RabbitMq】rabbitmq在.net core中的简单使用
分布式·rabbitmq·.netcore
路飞说AI2 小时前
Kafka消息不丢失全攻略
kafka
何中应3 小时前
在windows本地部署RabbitMQ
分布式·消息队列·rabbitmq
Wild API3 小时前
按任务轻重做模型分流的实战思路
分布式·微服务·架构
落子君3 小时前
kafka接受消息
kafka
下地种菜小叶4 小时前
接口幂等怎么设计?一次讲清重复提交、支付回调、幂等键与防重落地方案
java·spring boot·spring·kafka·maven
低客的黑调4 小时前
RabbitMQ-从入门到生产落地
分布式·rabbitmq
宸津-代码粉碎机4 小时前
Spring Boot 4.0虚拟线程实战续更预告:高阶技巧、监控排查与分布式场景落地指南
java·大数据·spring boot·分布式·后端·python