一、错误信息:zookeeper进程存在,但状态为not running,如下:

[root@app1 bin]# ps -ef|grep 'zookeeper'
root      2338     1  0 12:31 pts/6    00:00:35 /opt/jdk1.7.0_80/bin/java -Dzookeeper.log.dir=/usr/local/zookeeper-3.5.1-alpha/bin/../logs -Dzookeeper.log.file=zookeeper-root-server-app1.log -Dzookeeper.root.logger=INFO,CONSOLE -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=kill -9 %p -cp /usr/local/zookeeper-3.5.1-alpha/bin/../build/classes:/usr/local/zookeeper-3.5.1-alpha/bin/../build/lib/*.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/slf4j-log4j12-1.7.5.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/slf4j-api-1.7.5.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/servlet-api-2.5-20081211.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/jline-2.11.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/jetty-util-6.1.26.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/jetty-6.1.26.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/javacc.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/jackson-mapper-asl-1.9.11.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/jackson-core-asl-1.9.11.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../lib/commons-cli-1.2.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../zookeeper-3.5.1-alpha.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.5.1-alpha/bin/../conf::/opt/jdk1.7.0_80/lib/dt.jar:/opt/jdk1.7.0_80/lib/tools.jar:/opt/jdk1.7.0_80/jre/lib -Xmx1000m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /usr/local/zookeeper-3.5.1-alpha/bin/../conf/zoo.cfg
root      3264  1896  0 14:17 pts/2    00:00:00 grep zookeeper
[root@app0 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.5.1-alpha/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.

二、网上搜到了几个解决办法:

1,打开zkServer.sh 找到status)

STAT=`echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e ‘s/.*=//‘) 2> /dev/null| grep Mode`
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
注:因为我用的zookeeper是3.4.5版本,所以在我的zkServer.sh脚本文件里根本没有这一行,所以没有生效

2,调用sh zkServer.sh status 遇到这个问题。百度,google了后发现有人是修改sh脚本里的一个nc的参数来解决,可在3.4.5的sh文件里并没有找到nc的调用。配置文档里指定的log目录没有创建导致出错,手动增加目录后重启,问题解决。
注:我想不是日志的问题所以这个方法根本就没有试

3,创建数据目录,也就是在你zoo.cfg配置文件里dataDir指定的那个目录下创建myid文件,并且指定id,改id为你zoo.cfg文件中server.1=localhost:2888:3888中的    1.只要在myid头部写入1即可.
注:发现网上很多人用这个办法解决了自己的问题,但是我的myid文件配置没有问题,所以这个也没有解决我的问题

4 因为防火墙没有关闭。关闭防火墙:

  #查看防火墙状态

   service iptables status 

  #关闭防火墙
   service iptables stop
  #查看防火墙开机启动状态
   chkconfig iptables --list
  #关闭防火墙开机启动
   chkconfig iptables off

5 没有建立主机和ip之间的映射关系。

  建立主机和ip之间映射关系的命令为 vim /etc/hosts   在文件的末端加入各个主机和ip地址之间的映射关系就可以了。

  注意:只有在建立了映射关系之后,才可以将在同一个网段下的机器利用主机名进行文件传递。问题解决!

三、我遇到的问题采用第四种方式得到解决,因为停电主机宕机,主机重启后防火墙为打开状态

1、zookeeper集群配置

server.1=zk-master:2888:3888:participant
server.2=zk-slave1:2888:3888:participant
server.3=zk-slave2:2888:3888:participant
[root@zk-master conf]# cat /etc/hosts
192.168.1.205 zk-master
192.168.1.155 zk-slave1
192.168.1.154 zk-slave2

2、问题

启动顺序为:205--155--154

205的zookeeper状态为

[root@app0 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.5.1-alpha/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.

155和154的主机状态分别是leader和follower.

注意:集群模式要所有主机全部启动才能分出主从,否则单独启动一台主机,状态仍为not running。

此时,从windows doc下执行telnet 192.168.1.205 2181 不能连接,telnet 192.168.1.205 2181连接正常。

3、解决

排除了n多原因(这其中也包括myid文件找不到了,新建了一个,但问题最终没解决,可见还有其他问题),把问题锁定在防火墙上,查看防火墙状态如下:

//此时防火墙为启动状态
[root@zk-master bin]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  

 
//执行防火墙关闭命令
[root@app0 bin]# service iptables stop


//此时防火墙为关闭状态
[root@app0 bin]# service iptables status
表格:filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

再次在windows doc下执行telnet 192.168.1.205 2181,能正常连接

linux下执行 ./zkServer.sh status,状态正常,为follower.


备注:当配置的master不能正常启动时,zookeeper会随机选择一台slave作为master。