今天在嘗試本地安裝Zookeeper,在官網下載穩定版本apache-zookeeper-3.7.0到本地后,解壓文件並將apache-zookeeper-3.7.0-bin文件夾移動至/usr/local目錄。
照例先將安裝目錄conf中的zoo_sample.cfg文件名修改為zoo.cfg。然后進入bin目錄,開始執行啟動操作:sh zkServer.sh start 出現了問題1如下:
Using config: /usr/local/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
mkdir: illegal option -- e
usage: mkdir [-pv] [-m mode] directory ...
-n Starting zookeeper ...
zkServer.sh: line 175: -e /tmp/zookeeper/zookeeper_server.pid: No such file or directory
FAILED TO WRITE PID
最開始以為是操作權限問題,於是開始修改文件權限,但是依然無效。
經過查詢后得知原來問題出在zkServer.sh這個啟動文件上,打開啟動文件找到如下指令:
ZOO_DATADIR="$(echo -e "${ZOO_DATADIR}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
修改為:
ZOO_DATADIR="$(echo "${ZOO_DATADIR}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
在3.7.0版本,這段配置在zkServer.sh文件的第120行。
修改完后繼續執行啟動操作:sh zkServer.sh start 現在出現了問題2如下:
2022-01-06 10:24:34,946 [myid:] - ERROR [main:ZooKeeperServerMain@86] - Unable to start AdminServer, exiting abnormally
org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:179)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:155)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:113)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:68)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:141)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91)
Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080
at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.server.Server.doStart(Server.java:401)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:170)
... 5 more
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:455)
at java.base/sun.nio.ch.Net.bind(Net.java:447)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)
... 12 more
這個比較簡單,因為AdminServer啟動時默認使用8080端口,但是我本地8080端口已經被占用了。
找到conf/zoo.cfg配置文件,添加一行admin.serverPort=xxxx,修改一下啟動的端口即可。(是的,默認配置8080而且沒有把配置項寫入配置文件中
修改后繼續執行啟動操作:sh zkServer.sh start 然后遇到了問題3:
2022-01-06 10:38:32,300 [myid:] - INFO [main:NIOServerCnxnFactory@660] - binding to port 0.0.0.0/0.0.0.0:2181
2022-01-06 10:38:32,301 [myid:] - ERROR [main:ZooKeeperServerMain@91] - Unexpected exception, exiting abnormally
java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:455)
at java.base/sun.nio.ch.Net.bind(Net.java:447)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:73)
at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:662)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:160)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:113)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:68)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:141)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:91)
對的,又是一次端口被占用,但是這次是2181端口,細心的同學可能發現了,這是zookeeper client的默認端口。我懷疑我剛才在啟動server的時候server雖然因為端口被占用的原因沒有啟動,但是client卻正常啟動了。
執行操作:sh zkCli.sh close 即可解決問題。
現在再次執行zkserver啟動操作:sh zkServer.sh start
終於正常啟動了,打印日志如下:
Using config: /usr/local/apache-zookeeper-3.7.0-bin/bin/../conf/zoo.cfg
-n Starting zookeeper ...
STARTED