今天試着在服務器搭建了一下zookeeper,結果無法啓動,在網上搜了資料大概有下面這麼幾種BUG.
是通過Zookeeper.out 日誌來排查的。
1.zookeeper 3.4.6 啓動失敗。
很有可能是配置的日誌目錄在文件系統中沒有新建。
2.zookeeper 3.5+ 啓動失敗。
這個是我今天遇上的問題,報錯:
2015-03-24 16:16:44,231 [myid:] - ERROR [main:ZooKeeperServerMain@72] - Unable to start AdminServer, exiting abnormally
org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on port 8080, command URL /commands
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:89)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:123)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:99)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:57)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:125)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
Caused by: java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
at java.net.ServerSocket.bind(ServerSocket.java:376)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:181)
at org.mortbay.jetty.bio.SocketConnector.newServerSocket(SocketConnector.java:80)
at org.mortbay.jetty.bio.SocketConnector.open(SocketConnector.java:73)
at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:283)
at org.mortbay.jetty.bio.SocketConnector.doStart(SocketConnector.java:147)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.Server.doStart(Server.java:235)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:85)
... 5 more
很明顯是由於端口占用。我服務器中的tomcat佔用了8080端口,而zookeeper最近的版本中有個內嵌的管理控制檯是通過jetty啓動,也會佔用8080 端口。
通過查看zookeeper的官方文檔,發現有3種解決途徑:
(1).刪除jetty。
(2)修改端口。
修改方法的方法有兩種,一種是在啓動腳本中增加 -Dzookeeper.admin.serverPort=你的端口號.一種是在zoo.cfg中增加admin.serverPort=沒有被佔用的端口號
(3)停用這個服務,在啓動腳本中增加"-Dzookeeper.admin.enableServer=false"
3.客戶端使用的zookeeper和部署在服務端的版本不一致。(這個是網上有人說的,我也沒遇到。)