1.起因
之前用的zk是3.4.11,由于3.5.x支持了动态配置节点的功能,所以就顺便升级。
2.问题
下载这个地方我就略过了,克隆 https://github.com/apache/zookeeper.git 然后 checkout 到最新3.5.5 分支即可。
然后我更改了下 zookeeper 的 data/log 文件路径,按照之前的经验,通过 bin/zkServer.sh start
启动服务报错,查看日志后错误如下:
启动信息如下:
ZooKeeper JMX enabled by default
Using config: 安装路径/zookeeper-3.5.5/server/bin/../conf/zoo.cfg
FAILED TO START
日志信息如下:
错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
原因: java.lang.ClassNotFoundException: org.apache.zookeeper.server.quorum.QuorumPeerMain
这就有意思了,不过看样子可以推测出是没有找到对应的class。然后我看了下 zkServer.sh
里面的 CLASSPATH 变量,大致如下(只保留了重要信息):
安装路径/zookeeper-3.5.5/bin/../zookeeper-server/target/classes:
安装路径/zookeeper-3.5.5/bin/../build/classes ....etc
很显然就是没找到对应class,那么编译一下就行了。
之前的 3.4.x 因为直接把 zookeeper-3.4.x.jar 放在根目录了,所以可以直接启动。
3.解决
从 3.5.x 可以看出来现在的 zookeeper 做了点工程优化,拆分成了几个子工程,不像之前的版本都放在src下了。
需要启动 zookeeper server
,那么只需要把zookeeper-server
这个工程编译出来即可。
cd zookeer-server
# 略过test和doc
mvn clean package --settings xxx\settings.xml -DskipTests=true -Dmaven.javadoc.skip=true
然后就可以看到zookeeper-server/target
目录,接着在通过 zkServer.sh start/status
就可以正常启动服务了。
xxx-3:zookeeper-server xxx$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: xxx/zookeeper-3.5.5/server/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone