zookeeper集群重启后 Error contacting service. It is probably not running 的原因分析及解决方案

Zookeeper集群搭建相对比较容易,但有些细节需要注意,否则很可能会报错:Error contacting service. It is probably not running ,这个错误是查询集群节点状态的时候所反馈的报错信息,也就是 zkServer.sh status 这个命令的输出。

集群的根本在于节点之间互相知道对方的存在,从而互相之间能够通信,同步数据,进而达到ha高可用的状态,以上的报错最多的原因是节点间的通信受阻,而一般受阻的原因为系统防火墙的阻拦(iptables或者Firewalls)。

因此,解决方案为要么正确的设置防火墙,放行通信端口,要么关闭防火墙,使得通信端口正常工作。

在zookeeper中有三个端口需要特别注意,2888,3888,2181,其中的2888是节点服务器的对外服务端口,3888是节点之间的选举端口(通过3888端口节点内部商量选举一个leader),2181端口是客户端连接节点的端口,比如,一个服务要注册到zookeeper,那么,就需要通过2181端口告诉集群,我,是一个服务,我要你管理我,从而完成注册,以及后续的监听流程。

具体解决方案如下:

一,查看zookeeper进程,是否存在,如不存在查看zookeeper.out 文件,排查原因,直到错误解决,进程正常出现。

root@centos9 ~]# ps -ef | grep zookeep
root       947     1  0 11:51 ?        00:00:05 java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /usr/local/src/zookeeper-3.4.6/bin/../build/classes:/usr/local/src/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/src/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/src/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/src/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/src/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/src/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/src/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/src/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/src/zookeeper-3.4.6/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /usr/local/src/zookeeper-3.4.6/bin/../conf/zoo.cfg
root      3075  1063  0 12:26 pts/0    00:00:00 grep --color=auto zookeep

这个是正常的进程状态。

二,selinux和防火墙的状态

建议全部关闭,关闭方法不用多说。

三,vim /zookeeper.out

可能很多人不知道这个文件在哪,这个简单,find / -name zookeeper.out

如果文件内有timeout 或者refuse这样的字眼,请执行第二步。

2020-11-21 11:56:49,687 [myid:2] - INFO  [QuorumPeer[myid=2]/0:0:0:0:0:0:0:0:2181:ZooKeeperServer@162] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir /usr/local/zk/version-2 snapdir /usr/local/zk/version-2
2020-11-21 11:56:49,690 [myid:2] - INFO  [QuorumPeer[myid=2]/0:0:0:0:0:0:0:0:2181:Leader@358] - LEADING - LEADER ELECTION TOOK - 314353
以上是文件部分片段,表示成功选举出了leader。出现了什么错误,不要慌,找这个日志文件,仔细查看报错信息,针对解决。

四,节点ID标识文件myid是否正确

myid这个文件的内容要和主配置文件的内容相呼应,比如:

server.1=192.168.0.17:2888:3888 在192.168.0.17这个机器上的配置文件设定的myid是1,那么你新建的myid文件内容就应该是1,如果你修改配置文件内容为

server.22=192.168.0.17:2888:3888 ,那么myid文件的内容就应该是22。

其中的IP可以使用域名简化,但域名需要其余的节点能够解析,因此,要么搭建dns服务自己解析,要么写入hosts文件,让节点之间互相认识,才可以写域名,否则必定报以上的错。

总结:

这个报错九成都是防火墙和selinux的锅,如果可以查到进程,基本就是这两项的问题。主配置文件的域名需要节点之间都可以互相认识才可以使用域名,否则请使用IP。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐