在啟動zookeeper集群的單個zookeeper節點時總是報如下錯誤
[root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg Error contacting service. It is probably not running. [root@zookeeper1 zookeeper-3.4.5]#
於是嘗試解決它,首先要想到的是是否安裝了JDK,因為zookeeper的運行需要JVM環境,可以使用java和java -version命令來驗證,如下所示,可以看到JDK已經正確安裝。
[root@zookeeper1 zookeeper-3.4.5]# java 用法: java [-options] class [args...] (執行類) 或 java [-options] -jar jarfile [args...] (執行 jar 文件) 其中選項包括: -d32 使用 32 位數據模型 (如果可用) -d64 使用 64 位數據模型 (如果可用) -server 選擇 "server" VM 默認 VM 是 server. -cp <目錄和 zip/jar 文件的類搜索路徑> -classpath <目錄和 zip/jar 文件的類搜索路徑> 用 : 分隔的目錄, JAR 檔案 和 ZIP 檔案列表, 用於搜索類文件。 -D<名稱>=<值> 設置系統屬性 -verbose:[class|gc|jni] 啟用詳細輸出 -version 輸出產品版本並退出 -version:<值> 警告: 此功能已過時, 將在 未來發行版中刪除。 需要指定的版本才能運行 -showversion 輸出產品版本並繼續 -jre-restrict-search | -no-jre-restrict-search 警告: 此功能已過時, 將在 未來發行版中刪除。 在版本搜索中包括/排除用戶專用 JRE -? -help 輸出此幫助消息 -X 輸出非標准選項的幫助 -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] 按指定的粒度啟用斷言 -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] 禁用具有指定粒度的斷言 -esa | -enablesystemassertions 啟用系統斷言 -dsa | -disablesystemassertions 禁用系統斷言 -agentlib:<libname>[=<選項>] 加載本機代理庫 <libname>, 例如 -agentlib:hprof 另請參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help -agentpath:<pathname>[=<選項>] 按完整路徑名加載本機代理庫 -javaagent:<jarpath>[=<選項>] 加載 Java 編程語言代理, 請參閱 java.lang.instrument -splash:<imagepath> 使用指定的圖像顯示啟動屏幕 有關詳細信息, 請參閱 http://www.oracle.com/technetwork/java/javase/documentation/index.html。 [root@zookeeper1 zookeeper-3.4.5]# java -version java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode) [root@zookeeper1 zookeeper-3.4.5]#
那么下面我們便查看zookeeper的端口2181是否已經被占用了(當然,有可能大家已經改用其它端口了,這個根據大家的實際來操作),如下所示,可以看到,2181端口還真的被占用了!這就是問題的根源,我們可以看到占用2181端口的進程號是1403,那么我們便殺掉這個進程。
[root@zookeeper1 zookeeper-3.4.5]# netstat -apn | grep 2181 tcp 0 0 :::2181 :::* LISTEN 1403/java [root@zookeeper1 zookeeper-3.4.5]#
殺掉進程的命令是kill -9 1403,殺掉進程之后再檢查一下是否還有進程占用2181端口,發現已經沒有進程占用了。
下面我們再來啟動zookeeper,就應該能正常啟動了。
[root@zookeeper1 zookeeper-3.4.5]# kill -9 1403 [root@zookeeper1 zookeeper-3.4.5]# netstat -apn | grep 2181 [root@zookeeper1 zookeeper-3.4.5]#
如果上面的操作還解決不了問題,那么我們接着到zookeeper-3.4.5的data目錄下,可以看到如下所示的文件,其中version-2文件夾和zookeeper_server.pid兩個文件都是需要刪除掉的。
-
[root@zookeeper1 data]# ll
-
總用量 12
-
-rw-r--r--. 1 root root 2 4月 26 05:31 myid
-
drwxr-xr-x. 2 root root 4096 4月 26 07:03 version-2
-
-rw-r--r--. 1 root root 4 4月 28 04:25 zookeeper_server.pid
-
[root@zookeeper1 data]#
刪除操作如下,刪完只剩下myid文件了。
[root@zookeeper1 data]# rm -rf version-2/ zookeeper_server.pid [root@zookeeper1 data]# ls myid [root@zookeeper1 data]#
我們再次嘗試啟動zookeeper,如下所示,發現zookeeper終於正常啟動了。
-
[root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh start
-
JMX enabled by default
-
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
-
Starting zookeeper ... STARTED
-
[root@zookeeper1 zookeeper-3.4.5]# bin/zkServer.sh status
-
JMX enabled by default
-
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
-
Mode: follower
-
[root@zookeeper1 zookeeper-3.4.5]#
還有一種情況就是,啟動zookeeper集群的某個節點時死活啟動不了,把上面所說的三種情況都檢查過了還是啟動不了,這時我們可以先啟動zookeeper的另外幾個節點,等把其它節點啟動好了,這個啟動不了節點就自動啟動好了!!!
基本上這幾種情況便可以解決zookeeper無法啟動的問題了(如果還是不行,就要看看是不是安裝zookeeper的步驟有錯誤了)