Kafka安装_zookeeper无法连接坑

本文详细解析了Kafka启动失败时,因Kafka与Zookeeper版本不兼容导致的连接问题。提供了检查本地Zookeeper运行状态及Kafka启动情况的方法,并指导如何通过更换版本来解决此问题。

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

Lison <cundream@163.com>, v1.0.3, 2019.03.27

摘要

解决和排查kafka安装过程中,由于kafka安装版本所使用zookeeper版本与本地zookeeper安装版本不兼容,导致kafka无法连接zookeeper的原因而导致kafka无法启动的问题

问题描述和错误展现方式

启动kafka时,kafka一直无法连接到zookeeper,控制台日志出现以下类似的错误

[2019-03-25 15:43:57,740] INFO Opening socket connection to server cundreamc7001/192.168.237.33:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn)
[2019-03-25 15:43:57,741] INFO Socket connection established to cundreamc7001/192.168.237.33:2181, initiating session (org.apache.zookeeper.ClientCnxn)
[2019-03-25 15:43:57,748] WARN Connected to an old server; r-o mode will be unavailable (org.apache.zookeeper.ClientCnxnSocket)
[2019-03-25 15:43:57,748] INFO Session establishment complete on server cundreamc7001/192.168.237.33:2181, sessionid = 0x169b3cac2f50002, negotiated timeout = 6000 (org.apache.zookeeper.ClientCnxn)
[2019-03-25 15:43:57,752] WARN Session 0x169b3cac2f50002 for server cundreamc7001/192.168.237.33:2181, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn)
java.io.IOException: Xid out of order. Got Xid 50 with err 0 expected Xid 49 for a packet with details: clientPath:null serverPath:null finished:false header:: 49,14  replyHeader:: 0,0,-4  request:: org.apache.zookeeper.MultiTransactionRecord@fabc5c55 response:: org.apache.zookeeper.MultiResponse@0
	at org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:830)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:94)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1145)

问题排查思路和解决步骤

排查思路

遇到上述Kafka启动出现问题时,我们则可以确定是kafka连接zookeeper时出了问题。

所以怀疑出现这样连接问题的原因有以下两种情况

  1. 本地所使用zookeeper是否已经正常启动和正常连接
  2. Kafka安装包自带的zookeeper是否能够正常启动

确定本地zookeeper能够正常启动和正常连接

首先打开zookeeper所在目录使用以下命令启动zookeeper

bin/zkServer.sh start

ZooKeeper使用log4j记录消息,会在启动目录生成zookeeper.out 的日志文件

执行玩该命令后 可使用jps命令,会出现如下进程

QuorumPeerMain

然后尝试连接zookeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

这使您可以执行简单的文件操作。连接后,您应该看到类似的内容:

Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]

确定Kafka能够正常启动

使用kafka一起打包的zookeeper便捷快速启动单节点zookeeper

​ 首先打开kafka所在目录使用以下命令启动kafka自带zookeeper本地节点

 bin/zookeeper-server-start.sh config/zookeeper.properties
 [2019-03-25 16:08:57,944] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
...

zookeeper启动成功后,现在启动Kafka服务

 bin/kafka-server-start.sh config/server.properties
[2019-03-25 16:29:01,562] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2019-03-25 16:29:01,562] INFO Property socket.send.buffer.bytes is overridden to 1048576 (kafka.utils.VerifiableProperties)
...
[2019-03-25 16:09:02,070] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

​ 若日志出现 INFO [KafkaServer id=0] started 则表示kafka启动成功。

问题总结

如果Kafka安装包和本地zookeeper都能够正常的启动,所以我们基本可以确定是因为我们所使用的kafka和zookeeper的版本出现了冲突或兼容问题

解决步骤

更换kafka版本

首先查看当前安装的zookeeper版本

使用以下命令查看zookeeper版本
echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
 /192.168.237.33:60380[1](queued=0,recved=236,sent=237)
 /127.0.0.1:33288[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/1/38
Received: 308
Sent: 312
Connections: 2
Outstanding: 0
Zxid: 0x31
Mode: standalone
Node count: 25

### 如未安装nc,请用root用户执行以下命令
### yum -y install nc

然后下载对应支持的kafka版本

更换zookeeper版本

​ 首先查看kafka支持zookeeper版本,由于kafka没有像别的软件一样有,kafka -version命令,但是可以以查看kafka/libs下的库文件,知道kafka的版本号和zookeeper支持的版本,然后下载对应的zookeeper版本进行安装;

<think>我们正在解决Kafka配置错误:缺少必需的配置`KAFKA_ZOOKEEPER_CONNECT`。 根据引用[2]:Kafka依赖Zookeeper来存储管理的元信息和配置信息。在高版本Kafka中,慢慢的就脱离了对Zookeeper的依赖。 但是,在Kafka 2.0.0版本(如引用[1]中使用的版本)以及2.7.1版本(引用[2]下载的版本)中,仍然需要配置Zookeeper连接。 错误信息:`ERROR: missing mandatory config: KAFKA_ZOOKEEPER_CONNECT` 表明在Kafka的配置文件中没有设置`zookeeper.connect`属性。 解决方案: 1. 确保Zookeeper已经启动(如引用[3]所示)。 2. 在Kafka的配置文件(例如`server.properties`)中设置`zookeeper.connect`属性,指向Zookeeper的地址和端口。 具体步骤: 步骤1:启动ZookeeperZookeeper服务器上执行启动命令(如引用[3]): ```bash /home/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start ``` 步骤2:配置Kafka的`server.properties`文件 打开Kafka的配置文件(例如`config/server.properties`),找到并设置`zookeeper.connect`属性,例如: ```properties zookeeper.connect=localhost:2181 ``` 如果Zookeeper运行在其他机器上,请将`localhost`替换为Zookeeper服务器的IP地址或主机名。 步骤3:启动Kafka服务器 使用配置文件启动Kafka服务器(如引用[1]所示): ```bash bin/kafka-server-start.sh config/server.properties & ``` 注意:在Kafka 2.8.0及以上版本,Kafka引入了Kraft协议,可以脱离Zookeeper运行。但如果使用的是旧版本(如2.7.1及以下),则必须配置Zookeeper。 如果使用的是新版本且不想依赖Zookeeper,可以配置Kraft模式(但需要不同的配置方式,不在本问题范围内)。 因此,针对当前错误,核心解决方法是正确配置`zookeeper.connect`属性并确保Zookeeper服务可用。 引用[4]提到了在.NET Core中消费Kafka的代码,虽然与配置无关,但说明在客户端使用Kafka时,通常只需要连接Kafka brokers,而不需要直接连接Zookeeper。但Kafka服务器本身需要连接Zookeeper。 总结:配置`zookeeper.connect`即可解决该问题。 相关问题: 1. 如何配置Kafka以使用外部Zookeeper集群? 2. Kafka脱离Zookeeper(Kraft模式)如何配置? 3. 如何验证ZookeeperKafka连接是否正常?</think>针对Kafka报错**`ERROR: missing mandatory config: KAFKA_ZOOKEEPER_CONNECT`**,以下是完整的解决方案及原理分析: --- ### 一、错误原因 此错误表示Kafka服务**未正确配置ZooKeeper连接地址**。Kafka依赖ZooKeeper进行以下核心功能[^2]: 1. **集群协调**:Broker注册、Leader选举 2. **元数据管理**:Topic分区信息、消费者偏移量 3. **配置存储**:Topic配置、ACL权限 > 在Kafka 2.8.0之前版本中,ZooKeeper是**强制依赖项**(高版本支持无ZK模式,但需显式配置)[^2]。 --- ### 二、解决方案 #### ✅ 步骤1:确认ZooKeeper已启动 检查ZooKeeper服务状态(如引用[3]所示): ```bash $ /path/to/zookeeper/bin/zkServer.sh status # 输出示例:Mode: leader 或 Mode: follower ``` #### ✅ 步骤2:在Kafka配置中添加ZooKeeper地址 编辑Kafka配置文件(如`server.properties`或`server-1.properties`): ```properties # 添加以下配置(假设ZK在localhost:2181) zookeeper.connect=localhost:2181 # 若ZK集群有多个节点(推荐生产环境) zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka # /kafka为可选命名空间 ``` #### ✅ 步骤3:验证配置并重启Kafka ```bash # 检查配置是否生效 $ grep "zookeeper.connect" config/server.properties # 重启Kafka服务 $ bin/kafka-server-start.sh config/server.properties & ``` #### ✅ 步骤4:验证连接状态 ```bash # 查看Kafka日志 $ tail -f logs/server.log # 正常输出示例:INFO [ZooKeeperClient] Connected (org.apache.kafka.zookeeper.ZooKeeperClient) # 使用ZooKeeper客户端验证 $ bin/zookeeper-shell.sh localhost:2181 ls /brokers/ids # 应返回已注册的Broker ID列表 ``` --- ### 三、配置详解 | 配置项 | 必填 | 默认值 | 说明 | |--------|------|--------|------| | **`zookeeper.connect`** | ✅ | `null` | ZooKeeper集群地址,格式:`host1:port1,host2:port2/chroot` | | `zookeeper.session.timeout.ms` | ❌ | 18000 | 会话超时时间(毫秒) | | `zookeeper.connection.timeout.ms` | ❌ | 15000 | 连接超时时间(毫秒) | > **关键点**: > - ZooKeeper地址必须在**所有Broker配置文件**中配置一致 > - 生产环境建议使用**ZK集群**(至少3节点)[^2] --- ### 四、特殊场景处理 #### 场景1:使用Docker时 在`docker-compose.yml`中配置环境变量: ```yaml services: kafka: environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 指向ZK容器名 ``` #### 场景2:Kafka ≥2.8.0的无ZK模式(KRaft) 需显式配置KRaft模式(但仍需ZK模拟层): ```properties # 在server.properties中 process.roles=broker,controller listeners=PLAINTEXT://:9092,CONTROLLER://:9093 controller.quorum.voters=1@kafka1:9093 # 自包含元数据管理 ``` --- ### 五、避指南 1. **防火墙问题** 确保Kafka节点可访问ZK的`2181`端口(生产环境需配置安全组) 2. **版本兼容性** Kafka 2.0.0需搭配ZooKeeper ≥3.5.0(如引用[1]环境) 3. **路径权限** ZooKeeper的`/brokers`路径需对Kafka Broker开放写权限 > 若问题仍存在,检查ZK日志`zookeeper.out`,常见错误如:`Connection refused`或`Session expired`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值