您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
無法啟動 ZooKeeper 程序。
錯誤訊息
嘗試啟動 ZooKeeper 程序時,會傳回以下錯誤訊息,表示無法啟動 ZooKeeper:
+ apigee-service apigee-zookeeper status apigee-service: apigee-zookeeper: Not running (DEAD) apigee-all: Error: status failed on [apigee-zookeeper]
可能原因
下表列出這個問題的可能原因:
原因 | 適用於 |
---|---|
設定錯誤的 ZooKeeper 我的 ID | Edge Private Cloud 使用者 |
ZooKeeper 通訊埠正在使用中 | Edge Private Cloud 使用者 |
apigee-zookeeper.pid 檔案中的程序 ID 不正確 | Edge Private Cloud 使用者 |
ZooKeeper 領袖選舉失敗 | Edge Private Cloud 使用者 |
點選表格中的連結,即可查看該原因可能的解決方法。
設定錯誤的 ZooKeeper 我的 ID
下列各節將概略說明 myid 檔案,並說明如何診斷及解決設定錯誤問題。
myid 檔案總覽
每個 ZooKeeper 節點上都有兩個檔案:
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
檔案,內含叢集內所有 ZooKeeper 節點的 IP 清單。舉例來說,假設
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
包含叢集中 3 個 ZooKeeper 節點部分的 IP,如下所示:server.1=11.11.11.11:2888:3888 server.2=22.22.22.22:2888:3888 server.3=33.33.33.33:2888:3888
/opt/apigee/data/apigee-zookeeper/data/myid
檔案包含一行文字,對應特定 ZooKeeper 節點的伺服器編號。伺服器 1 的 myid 含有「1」文字,而且不包含其他文字。ID 內的 ID 不得重複,且值必須介於 1 至 255 之間。舉例來說,在 ZooKeeper server.1 上,
/opt/apigee/data/apigee-zookeeper/data/myid
檔案應只包含文字 1,如下所示:$ cat myid 1
診斷
- 檢查 ZooKeeper 記錄
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log
是否有錯誤。 - 如果你看到類似「ID #,<我的 ID> = # 的連線毀損」的 WARN 訊息 (如下圖所示),可能是因為 myid 檔案中的伺服器 # 設定錯誤或損毀。
[myid:2] - WARN [RecvWorker:2:QuorumCnxManager$RecvWorker@762] - Connection broken for id 2, my id = 2, error = java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:375) at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker. run(QuorumCnxManager.java:747)
- 查看
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
檔案,並記下目前 ZooKeeper 節點的 server.#。 - 檢查
/opt/apigee/data/apigee-zookeeper/data/myid
檔案,看看這個檔案中的文字是否與步驟 #2 中註記的 server.# 相符。 - 如果出現不相符情形,您已經找出 ZooKeeper 無法啟動的原因。
解析度
如果 myid 檔案的設定不正確,請編輯 myid 檔案,並將值替換為代表 Zoo.cfg 中 server.# 參數的正確文字。
ZooKeeper 通訊埠正在使用中
診斷
- 檢查 ZooKeeper 記錄
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log
是否有錯誤。 - 如果在繫結至通訊埠 #2181 時發現
java.net.BindException: Address already in use
例外狀況 (如下圖所示),這表示其他程序正在使用 ZooKeeper 通訊埠 2181。因此 ZooKeeper。2017-04-26 07:00:10,420 [myid:3] - INFO [main:NIOServerCnxnFactory@94] - binding to port 0.0.0.0/0.0.0.0:2181 2017-04-26 07:00:10,421 [myid:3] - ERROR [main:QuorumPeerMain@89] - Unexpected exception, exiting abnormally java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67) at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:95) at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
- 請使用下方的 netstat 指令,確認 ZooKeeper 通訊埠 2181 確實由其他程序使用:
netstat -an | grep 2181
解析度
如果 ZooKeeper 通訊埠 2181 仍在使用中,請按照下列步驟解決這個問題:
- 使用
netstat
指令找出保留通訊埠 2181 的程序。終止使用 ZooKeeper 通訊埠 2181 的程序:$ netstat -antp | grep 2181 tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 28016/java <defunct> $ kill -9 28016
- 清理 pid 並鎖定檔案 (如有):
/opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
- 重新啟動 ZooKeeper:
/opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
apigee-zookeeper.pid 檔案中的程序 ID 不正確
當您嘗試停止/重新啟動 ZooKeeper 時,可能會因為 apigee-zookeeper.pid
檔案包含較舊/不正確的 pid,而並非目前執行中的 ZooKeeper 程序而失敗。如果 ZooKeeper 程序因故意外終止,且 apigee-zookeeper.pid
檔案未刪除,就有可能發生這種情況。
診斷
- 執行
ps
指令,取得目前執行 ZooKeeper 程序的程序 ID:ps -ef | grep zookeeper
- 檢查
/opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid
檔案是否存在。如果有,請記下寫入這個檔案的程序 ID。 - 比較步驟 1 和 2 取得的程序 ID。如果兩者不同,就會造成這個問題的
apigee-zookeeper.pid file.
含有不正確的程序 ID
解析度
- 編輯 apigee-zookeeper.pid 檔案,並將不正確的程序 ID 換成從 ps 指令取得的正確程序 ID (請見上述步驟 #1)。
- 重新啟動 ZooKeeper:
/opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
ZooKeeper 領袖選舉失敗
診斷
診斷方法:
- 檢查 ZooKeeper 記錄
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log
是否有錯誤。 - 檢查是否有任何設定變更可能導致 ZooKeeper 選拔主要變因。
- 檢查
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
,確認叢集中的所有 ZooKeepers 都具備正確的 server.# 參數編號和 IP 位址。另請注意,選區的選民必須至少有 3 名選民,且選民人數須為奇數,才能取得勝利。如果選民人數太少 (例如只有 2 名選民),就無法根據 2 名投票者的推論,判斷出領先者。
解析度
一般而言,ZooKeeper 選舉失敗是由於 myid 設定錯誤所致。請使用設定錯誤的 ZooKeeper myid 中的解決方法來解決選舉失敗問題。
如果問題持續發生,且需要進一步診斷,請與 Apigee Edge 支援團隊聯絡。