问题产生背景
本地电脑中运行了三个zookeeper实例搭建的集群,在其正常运行的时候,电脑重启了,然后想要启动zookeeeper集群,但是提示:
ZooKeeper JMX enabled by default
Using config: apache-zookeeper-3.6.1/conf/zoo1.cfg
Starting zookeeper ... FAILED TO START
问题排查
查看运行日志,默认日志目录在zookeeper根目录有个logs,发现其中有一个后缀为 .out 的文件,zookeeper-localhost-server-root.out,cat查看该文件内容,发现日志中记录了如下异常信息:
2020-05-24 15:31:09,954 [myid:] - ERROR [main:QuorumPeerMain@98] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing apache-zookeeper-3.6.1/conf/zoo1.cfg
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:197)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:124)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:90)
Caused by: java.lang.IllegalArgumentException: myid file is missing
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.checkValidity(QuorumPeerConfig.java:810)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:681)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:506)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:193)
... 2 more
Invalid config, exiting abnormally
从异常信息来看是 myid 这个文件丢失了,然后查看对应的zookeeper的conf目录中对应配置文件中 dataDir配置的目录下果然没有myid这个文件了,搭建集群运行的时候是配置了的,既然没有,那就再在对应的dataDir目录中添加myid文件,我的目录是/tmp/zookeeper/zoo1,所以执行命令 echo 1 > /tmp/zookeeper/zoo1/myid 添加myid文件并且文件内容为1,这个id可以随意但是不能重复,因为zk集群中的节点需要获取myid文件内容来标识该节点.如果有多个cfg文件,那使用的目录也是要做同样操作的.
然后执行启动命令 bin/zkServer.sh start conf/zoo1.cfg,成功启动,日志如下:
ZooKeeper JMX enabled by default
Using config: conf/zoo1.cfg
Starting zookeeper ... STARTED
总结
现在看来文件丢失的原因就是因为我把这个目录建在了linux的/tmp 目录了,这个目录中的文件再系统关闭的时候会清除文件,因此,建议不要把zookeeper/conf目录中的配置文件中dataDir参数值(路径)设置到系统的/tmp 中.