Zookeeper连接错误

时间:2012-11-09 22:10:44

标签: apache-zookeeper

我们在开发机器上设置了一个独立的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主机但没有任何效果。我们完全混淆为什么它与其他机器完全一致,除了这个。可能是什么原因造成的?

24 个答案:

答案 0 :(得分:14)

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

这就是你配置了直接导致的偶数动物园管理员的原因 这个问题,尝试将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

答案 1 :(得分:9)

我遇到了同样的问题,发现它是由于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安全组并重新启动。一切都对我很好

答案 2 :(得分:4)

我刚刚解决了这个问题。我正在使用centos 7.而麻烦制造者是防火墙。使用“systemctl stop firewalld”将每个服务器中的所有内容关闭都可以简单地解决问题。或者你可以使用像

这样的命令
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

最后使用

zkServer.sh restart

重新启动服务器并解决问题。

答案 3 :(得分:3)

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

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

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

127.0.0.1   localhost host-1

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

希望这可以提供帮助。

答案 4 :(得分:2)

当我尝试使用A记录指向Zookeeper IP将经纪人与Zookeeper集成连接时遇到相同的错误。问题出在我的动物园管理员身上。我的动物园管理员无法绑定到端口2181,因为我将A记录指向公共IP。这阻止了动物园管理员选择领导者并相互交流。将A记录指向私有IP,使动物园管理员可以选择一个领导者,并且集群变为活动状态。此后,当我尝试将我的一个经纪人连接到该集成系统时,它成功连接了。

答案 5 :(得分: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服务器是否正在运行

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

这应该有用。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

我的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

答案 10 :(得分:1)

我也有这个问题,事实证明我告诉zookeeper连接到错误的端口。您是否验证过zookeeper实际上是在开发机器上的端口2181上运行?

答案 11 :(得分:1)

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

尝试增加maxClientCnxns设置。

来自documentation

  

maxClientCnxns   (没有Java系统属性)

     

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

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

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

答案 12 :(得分:1)

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

如果它正在运行,只需停止它 服务防火墙停止

然后尝试一下。

答案 13 :(得分:1)

上周我也遇到了这个问题,现在已经设法解决了这个问题。我有了从@gukoff共享的响应中解决这个问题的想法。

我的要求和情况与目前共享的情况略有不同,但问题基本相同,所以我想在这个帖子上分享它。

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

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

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

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

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

  3.   

    netstat -no | grep:2181 | wc -l <​​/ p>

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

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

    我希望这有帮助!

答案 14 :(得分:0)

在/ etc / hosts文件中仅保留一个用于主机IP的条目,即可解决。

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

启动复制的zk时,我也遇到相同的错误,其中一个zkClient无法连接到本地主机:2181,我检查了apache-zookeeper-3.5.5-bin / logs目录下的日志文件,并发现了以下内容:

  

2019-08-20 11:30:39,763 [myid:5]-警告   [QuorumPeermyid = 5(安全=已禁用):QuorumCnxManager @ 677]   -无法在选举地址/ xxxx:3888 java.net.SocketTimeoutException上打开3频道:连接超时   java.net.PlainSocketImpl.socketConnect(本机方法)位于   java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)     在   java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)     在   java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)     在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)在   java.net.Socket.connect(Socket.java:589)在   org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:648)     在   org.apache.zookeeper.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)     在   org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247)   2019-08-20 11:30:44,768 [myid:5]-警告   [QuorumPeermyid = 5(安全=已禁用):QuorumCnxManager @ 677]   -无法在选举地址/ xxxxxx:3888 java.net.SocketTimeoutException上打开4频道:连接超时   java.net.PlainSocketImpl.socketConnect(本机方法)位于   java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)     在   java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)     在   java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)     在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)在   java.net.Socket.connect(Socket.java:589)在   org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:648)     在   org.apache.zookeeper.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)     在   org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1247)   2019-08-20 11:30:44,769 [myid:5]-信息   [QuorumPeermyid = 5(安全=已禁用):FastLeaderElection @ 919]   -通知超时:51200

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

希望这会有所帮助。

答案 17 :(得分:0)

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

tickTime=2000
initLimit=5
syncLimit=2

答案 18 :(得分:0)

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

我只更改了zoo.cfg文件中的代理数,然后重新启动了zookeeper和kafka服务

答案 19 :(得分:0)

在2节点群集上进行设置时遇到相同的错误。我发现我混淆了myid文件的内容与server.id = HOST_IP:端口条目。

基本上,如果你有两个服务器(SERVER1和SERVER2),你已经创建了#34; myid&#34; dataDir for zookeeper中的文件如下所示

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以使其正常工作。

答案 20 :(得分: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

答案 21 :(得分:0)

检查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

答案 22 :(得分:-1)

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

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

# ps -ef | grep zookeeper

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

您应该看到该进程作为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文件,它应该表明你的启动错误。

答案 23 :(得分:-1)

刚才我解决了同样的问题并发布了blog

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

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

然后xx的myid = 1必须