38

我们在开发机器上有一个独立的 Zookeeper 设置。它适用于除这台 testdev 机器之外的所有其他开发机器。

尝试通过 testdev 连接到 zookeeper 时,我们一遍又一遍地收到此错误:

2012-11-09 14:06:53,909 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@947] - Socket connection established to zk01.dev.bunchball.net/192.168.8.58:2181, initiating session
2012-11-09 14:06:53,911 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@1183] - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
2012-11-09 14:06:55,366 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@1058] - Opening socket connection to server zk01.dev.bunchball.net/192.168.8.58:2181
2012-11-09 14:06:55,368 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@947] - Socket connection established to zk01.dev.bunchball.net/192.168.8.58:2181, initiating session
2012-11-09 14:06:55,368 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@1183] - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
2012-11-09 14:06:57,271 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@1058] - Opening socket connection to server zk01.dev.bunchball.net/192.168.8.58:2181
2012-11-09 14:06:57,274 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@947] - Socket connection established to zk01.dev.bunchball.net/192.168.8.58:2181, initiating session
2012-11-09 14:06:57,275 - INFO  [main-SendThread(zk01.dev.bunchball.net:2181):ClientCnxn$SendThread@1183] - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect

我们尝试重新启动测试开发机器,并重新启动 Zookeeper 主机,但没有任何效果。我们完全困惑为什么它可以与除这台以外的其他机器完美配合。这可能是什么原因?

4

24 回答 24

18

我的情况和你一样,我刚刚解决了这个问题。

这是您配置偶数个zookeeper直接导致此问题的原因,尝试将您的zookeeper节点数更改为奇数。

例如我的zookeeper集群的原始状态是由4个节点组成,然后只删除其中一个,导致节点数为3,现在可以启动zookeeper集群了

下面是成功连接到 Zookeeper 服务器的输出

2013-04-22 22:07:05,654 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@1321ed6
Welcome to ZooKeeper!
2013-04-22 22:07:05,704 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2013-04-22 22:07:05,727 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/127.0.0.1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2013-04-22 22:07:05,846 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x13e3211c06e0000, negotiated timeout = 30000
于 2013-04-22T14:10:29.093 回答
13

我遇到了同样的问题,发现这是由于 Zookeeper 集群节点需要打开端口才能相互通信。

server.1=xx.xx.xx.xx:2888:3888

server.2=xx.xx.xx.xx:2888:3888

server.3=xx.xx.xx.xx:2888:3888

一旦我通过 aws 安全组允许这些端口并重新启动。一切对我来说都很好

于 2014-11-07T05:39:16.283 回答
4

I have just solved the problem. I am using centos 7. And the trouble-maker is firewall.Using "systemctl stop firewalld" to shut it all down in each server can simply solve the problem.Or you can use command like

firewall-cmd --zone=public --add-port=2181/udp --add-port=2181/tcp --permanent" to configure all three ports ,include 2181,2888,3888 in each server.And then "firewall-cmd --reload

Finally use

zkServer.sh restart

to restart your servers and problem solved.

于 2016-04-29T01:55:44.973 回答
3

就我而言,我像这样配置 zoo.cfg:

server.1=host-1:2888:3888
server.2=host-2:2888:3888
server.3=host-3:2888:3888

但是,在 host-1 中,我在 /etc/hosts 中将 host-1 解析为 127.0.0.1:

127.0.0.1   localhost host-1

这可能会导致其他主机无法与其通信。将 host-1 解析为其真实 ip 解决了这个问题。

希望这能有所帮助。

于 2015-07-30T01:16:54.057 回答
3

在 2 节点集群上设置期间出现相同的错误。我发现我混淆了 myid 文件的内容与 server.id=HOST_IP:port 条目。

本质上,如果您有两台服务器(SERVER1 和 SERVER2),您在 dataDir 中为 zookeeper 创建了“myid”文件,如下所示

SERVER1 (myid)
1

SERVER2 (myid)
2

确保您的 zoo.cfg 文件中的条目对应于其中的每一个,即 server.1 应使用 SERVER1 主机名,server.2 应使用 SERVER2 主机名后跟端口,如下所示

SERVER1 (zoo.cfg)
... (other config omitted)
server.1=SERVER1:2888:3888
server.2=SERVER2:2888:3888

SERVER2 (zoo.cfg)
... (other config omitted)
server.1=SERVER1:2888:3888
server.2=SERVER2:2888:3888

为了确保,我还删除了 dataDir 中的 version-* 文件夹,然后重新启动 Zookeeper 以使其正常工作。

于 2017-12-07T17:12:29.003 回答
2

我也遇到了这个问题,结果我告诉zookeeper连接到错误的端口。您是否验证过 Zookeeper 确实在开发机器上的 2181 端口上运行?

于 2012-12-07T22:46:59.707 回答
2

当我尝试使用 A 记录指向 Zookeeper IP 将代理与 Zookeeper 集成连接时,我遇到了同样的错误。问题出在我的动物园管理员身上。我的动物园管理员无法绑定到端口 2181,因为我将 A 记录指向公共 IP。这阻止了 zookeeper 集合选择领导者并相互通信。将 A 记录指向私有 IP 使 zookeeper 集群能够选择领导者,并且集群变得活跃。在此之后,当我尝试将我的一个经纪人连接到合奏时,它连接成功。

于 2018-09-12T21:43:19.020 回答
2

我的情况和你一样,我刚刚解决了这个问题。

conf/zoo.cfg就是这样:

server.1=10.194.236.32:2888:3888
server.2=10.194.236.33:2888:3888
server.3=10.208.177.15:2888:3888
server.4=10.210.154.23:2888:3888
server.5=10.210.154.22:2888:3888

然后我data/myid像这样设置文件内容:

1      //at host  10.194.236.32
2      //at host  10.194.236.33
3      //at host  10.208.177.15
4      //at host  10.210.154.23
5      //at host  10.210.154.22

最后重启zookeeper

于 2016-07-05T11:57:20.863 回答
2

还要检查本地防火墙、 服务防火墙状态

如果它正在运行,只需停止它 service firewalld stop

然后试一试。

于 2019-06-13T20:53:10.257 回答
1

我也有这个问题,我发现我只需要重新启动zookeeper,然后重新启动tomcat,这样我的webapp就可以很好地连接了

于 2014-05-07T14:15:02.250 回答
1

我能够从 zookeeper 和 kafka 开始,每个节点都有 2 个节点。我收到错误是因为我使用 ./zkServer.sh 而不是 kafka 包装器 bin/zookeeper-server-start.sh config/zookeeper.properties 启动了 zookeeper

于 2014-05-28T03:53:04.110 回答
1

确保所有必需的服务都在运行

第 1 步:检查 hbase-master 是否正在运行

sudo /etc/init.d/hbase-master status

如果没有,那就开始吧sudo /etc/init.d/hbase-master start

第 2 步:检查 hbase-regionserver 是否正在运行

sudo /etc/init.d/hbase-regionserver status

如果没有,那就开始吧sudo /etc/init.d/hbase-regionserver start

第 3 步:检查 zookeeper-server 是否正在运行

sudo /etc/init.d/zookeeper-server status

如果没有,那就开始吧sudo /etc/init.d/zookeeper-server start


或者干脆连续运行这 3 个命令。

sudo /etc/init.d/hbase-master restart
sudo /etc/init.d/hbase-regionserver restart
sudo /etc/init.d/zookeeper-server restart

之后不要忘记检查状态

sudo /etc/init.d/hbase-master status
sudo /etc/init.d/hbase-regionserver status
sudo /etc/init.d/zookeeper-server status

你可能会发现 zookeeper 仍然没有运行:那么你可以运行 zookeeper

sudo /usr/lib/zookeeper/bin/zkServer.sh stop
sudo /usr/lib/zookeeper/bin/zkServer.sh start

之后再次检查状态并确保其正在运行

sudo /etc/init.d/zookeeper-server status

这应该有效。

于 2014-07-31T08:53:46.330 回答
1

我在我的机器上启动独立实例,并遇到同样的问题。最后,我将ip“127.0.0.1”更改为“localhost”,问题就消失了。

于 2015-11-19T12:22:49.950 回答
1

检查 zookeeper 日志(/var/log/zookeeper)。看起来已经建立了连接,这应该意味着有它的记录。

我遇到了同样的情况,这是因为一个进程打开了连接但未能关闭它们。这最终超过了每台主机的连接限制,我的日志充满了

2016-08-03 15:21:13,201 [myid:] - WARN  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@188] - Too many connections from /172.31.38.64 - max is 50

假设 zookeeper 在通常的端口上,您可以通过以下方式进行检查:

lsof -i -P | grep 2181
于 2016-08-03T15:32:42.913 回答
1

我上周也遇到了这个问题,现在已经设法解决了。我从@gukoff 分享的回复中得到了解决这个问题的想法。

我的要求和情况与迄今为止分享的略有不同,但问题基本相同,所以我想在这个线程上分享它。

我实际上是在尝试从我的应用程序中查询 zookeeper quorum(每 30 秒后)以获取一些信息,并且为此目的使用了Curator 框架( LeaderLatch类中可用的方法)。所以,基本上我正在启动一个CuratorFramework客户端并将其提供给LeaderLatch对象。

只有在我遇到这个线程中提到的错误之后 - 我才意识到我没有关闭在我的应用程序中建立的 zookeeper 客户端连接。该maxClientCnxns属性的值为 60,一旦连接数(所有这些都是过时的连接)达到 60,我的应用程序就开始抱怨此错误。

我通过以下方式了解了打开的连接数:

  1. 检查 Zookeeper 日志,其中有警告消息指出“来自 {IP 地址的主机} 的连接太多”

  2. netstat从运行我的应用程序的上述日志中提到的同一主机运行以下命令:

网络统计-否 | grep :2181 | wc -l

注意:2181 端口是 zookeeper 的默认端口,作为 grep 中的参数提供以匹配 zookeeper 连接。

为了解决这个问题,我手动清除了所有这些陈旧的连接,然后在我的应用程序中添加了用于优雅地关闭 zookeeper 客户端连接的代码。

我希望这有帮助!

于 2018-04-04T14:49:14.527 回答
1

如果打开的连接太多,就会发生这种情况。

尝试增加maxClientCnxns设置。

文档

maxClientCnxns(无 Java 系统属性)

限制由 IP 地址标识的单个客户端可以与 ZooKeeper 集合的单个成员建立的并发连接数(在套接字级别)。这用于防止某些类别的 DoS 攻击,包括文件描述符耗尽。将此设置为 0 或完全忽略它会消除对并发连接的限制。

您可以在配置文件中编辑设置。很可能可以在/etc/zookeeper/conf/zoo.cfg.

在现代 ZooKeeper 版本中,默认值为 60。您可以通过maxClientCnxns=4096在配置文件末尾添加该行来增加它。

于 2017-08-28T12:17:48.510 回答
0

我也遇到了同样的问题。就我而言,问题在于 iptables 规则。

为了与zookeeper节点通信,2181端口必须接受传入请求,对于zookeeper节点之间的内部通信,2888,3888端口必须为传入请求打开。

iptables -t nat -I PREROUTING -p tcp -s 10.0.0.0/24 --dport 2181 -j DNAT --to-destination serverIp:2181
iptables -t nat -I PREROUTING -p udp -s 10.0.0.0/24 --dport 2181 -j DNAT --to-destination serverIp:2181

iptables -t nat -I PREROUTING -p tcp -s 10.0.0.0/24 --dport 2888 -j DNAT --to-destination serverIp:2888
iptables -t nat -I PREROUTING -p udp -s 10.0.0.0/24 --dport 2888 -j DNAT --to-destination serverIp:2888

iptables -t nat -I PREROUTING -p tcp -s 10.0.0.0/24 --dport 3888 -j DNAT --to-destination serverIp:3888
iptables -t nat -I PREROUTING -p udp -s 10.0.0.0/24 --dport 3888 -j DNAT --to-destination serverIp:3888

sudo service iptables save
于 2016-09-02T10:50:12.943 回答
0

在 /etc/hosts 文件中只为您的主机 IP 留下一个条目,它已解决。

于 2020-03-19T04:16:31.087 回答
0

当我启动复制的 zk 时,我也遇到了同样的错误,其中一个 zkClient 无法连接到 localhost:2181,我检查了 apache-zookeeper-3.5.5-bin/logs 目录下的日志文件,发现了这个:

2019-08-20 11:30:39,763 [myid:5] - WARN [QuorumPeermyid=5(secure=disabled):QuorumCnxManager@677] - 无法在选举地址/xxxx:3888 java.net.SocketTimeoutException 处打开通道 3:在 java.net 的 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 的 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 的 java.net.PlainSocketImpl.socketConnect(Native Method) 连接超时。 AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.apache.zookeeper.server.quorum .QuorumCnxManager.connectOne(QuorumCnxManager.java:648) 在 org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:705) 在 org.org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:910) 在 org.apache.zookeeper.server.quorum 的 apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:733)。 QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,768 [myid:5] - 警告 [QuorumPeermyid=5(secure=disabled):QuorumCnxManager@677] - 无法在选举地址打开通道 4 /xxxxxx:3888 java.net.SocketTimeoutException: 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl) 的 java.net.PlainSocketImpl.socketConnect(Native Method) 连接超时.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl。在 org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:648) 在 org.apache.zookeeper 的 java.net.Socket.connect(Socket.java:589) 连接(SocksSocketImpl.java:392) .server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:705) 在 org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:733) 在 org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader (FastLeaderElection.java:910) at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,769 [myid:5] - 信息 [QuorumPeermyid=5(安全=禁用):FastLeaderElection@919] - 通知超时:51200648) 在 org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:733) 在 org.apache.zookeeper .server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:910) at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,769 [myid:5 ] - 信息 [QuorumPeermyid=5(secure=disabled):FastLeaderElection@919] - 通知超时:51200648) 在 org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:733) 在 org.apache.zookeeper .server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:910) at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,769 [myid:5 ] - 信息 [QuorumPeermyid=5(secure=disabled):FastLeaderElection@919] - 通知超时:51200zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,769 [myid:5] - 信息 [QuorumPeermyid=5(secure=disabled):FastLeaderElection@919] - 通知时间出:51200zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247) 2019-08-20 11:30:44,769 [myid:5] - 信息 [QuorumPeermyid=5(secure=disabled):FastLeaderElection@919] - 通知时间出:51200

这意味着这个zk服务器无法连接到其他服务器,我发现这个服务器ping其他服务器失败,从副本中删除这个服务器后,问题解决了。

希望这会有所帮助。

于 2019-08-20T03:41:12.560 回答
0

如果 Zookeeper 服务器未运行或不再运行(即它在您启动后崩溃),这是一个常见问题。

因此,首先,检查您是否正在运行 Zookeeper 服务器。一个简单的检查方法是 grep 正在运行的进程:

# ps -ef | grep zookeeper

(运行几次以查看相同的进程 ID 是否仍然存在。它可能会继续使用新的进程 ID 重新启动。或者,如果您的 Linux 发行版支持 systemd,您可以使用“systemctl status zookeeper”)

您应该看到该进程作为 java 进程运行:

# ps -ef | grep zookeeper
root       492     0  0 00:01 pts/1    00:00:00 java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /root/zookeeper-3.5.0-alpha/bin/../build/classes:/root/zookeeper-3.5.0-alpha/bin/../build/lib/*.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/slf4j-log4j12-1.7.5.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/slf4j-api-1.7.5.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/servlet-api-2.5-20081211.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/netty-3.7.0.Final.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/log4j-1.2.16.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/jline-2.11.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/jetty-util-6.1.26.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/jetty-6.1.26.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/javacc.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/jackson-mapper-asl-1.9.11.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/jackson-core-asl-1.9.11.jar:/root/zookeeper-3.5.0-alpha/bin/../lib/commons-cli-1.2.jar:/root/zookeeper-3.5.0-alpha/bin/../zookeeper-3.5.0-alpha.jar:/root/zookeeper-3.5.0-alpha/bin/../src/java/lib/*.jar:/root/zookeeper-3.5.0-alpha/bin/../conf: -Xmx1000m -Xmx1000m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /root/zookeeper-3.5.0-alpha/bin/../conf/zoo.cfg

如果它不存在,那么 zookeeper 日志文件中可能有一些东西表明了这个问题。

要查找 zookeeper 日志文件,您应该首先确定其配置日志的位置。在我的情况下,我在我的根目录下安装了 zookeeper(不建议你安装它):

[root@centos6_zookeeper conf]# pwd
/root/zookeeper-3.5.0-alpha/conf

您可以在此文件中找到日志设置:

[root@centos6_zookeeper conf]# grep "zookeeper.log" log4j.properties 
zookeeper.log.dir=/var/log
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=INFO
zookeeper.log.maxfilesize=256MB
zookeeper.log.maxbackupindex=20

所以 Zookeeper 被配置为在 /var/log 下登录。

然后通常有一个 zookeeper.log 和/或 zookeeper.out 文件,它应该指示您的启动错误。

于 2017-11-30T00:13:13.807 回答
0

如果一个或多个 ZooKeeper 磁盘空间不足,即使 ZooKeeper 服务器启动并运行并且套接字打开并接受连接,也会发生这种情况。如果从不清理旧的 ZK 快照和日志文件,则很容易发生这种情况:

ZooKeeper 服务器创建快照和日志文件,但从不删除它们。数据和日志文件的保留策略在 ZooKeeper 服务器之外实现。服务器本身只需要最新的完整模糊快照、它之后的所有日志文件以及它之前的最后一个日志文件。后一个要求是必要的,以包括在此快照启动后发生但当时进入现有日志文件的更新。这是可能的,因为在 ZooKeeper 中,日志的快照和翻转在某种程度上是独立进行的。有关设置保留策略和维护 ZooKeeper 存储的更多详细信息,请参阅本文档中的维护部分。

可以运行维护作业来清理旧快照和日志文件:请参阅https://zookeeper.apache.org/doc/r3.4.12/zookeeperAdmin.html#sc_maintenance

于 2020-01-27T16:41:45.680 回答
0

无法从服务器 sessionid 0x0 读取其他数据,可能服务器已关闭套接字、关闭套接字连接并尝试重新连接 (org.apache.zookeeper.ClientCnxn)

我只更改了 zoo.cfg 文件中的 broker 数量并重新启动 zookeeper 和 kafka 服务

于 2019-04-10T08:10:32.553 回答
0

我遇到了同样的问题,我使用的是 Windows 10。在我的 zookeeper 属性文件中添加以下提到的行后,我的问题得到了解决。

tickTime=2000
initLimit=5
syncLimit=2
于 2021-06-30T14:01:12.663 回答
-1

刚才我解决了同样的问题并发表了一篇博客

简而言之,如果 xx 的 zoo.cfg 像:

server.1=xx:2888:3888
server.2=yy:2888:3888
server.3=zz:2888:3888

那么xx的myid=1是必须的

于 2017-05-19T08:18:03.523 回答