無法啟動 Zookeeper

您正在查看 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 節點上都有兩個檔案:

  1. /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
    
  2. /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
    

診斷

  1. 檢查 ZooKeeper 記錄 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 是否有錯誤。
  2. 如果你看到類似「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)
    
  3. 查看 /opt/apigee/apigee-zookeeper/conf/zoo.cfg 檔案,並記下目前 ZooKeeper 節點的 server.#。
  4. 檢查 /opt/apigee/data/apigee-zookeeper/data/myid 檔案,看看這個檔案中的文字是否與步驟 #2 中註記的 server.# 相符。
  5. 如果出現不相符情形,您已經找出 ZooKeeper 無法啟動的原因。

解析度

如果 myid 檔案的設定不正確,請編輯 myid 檔案,並將值替換為代表 Zoo.cfg 中 server.# 參數的正確文字。

ZooKeeper 通訊埠正在使用中

診斷

  1. 檢查 ZooKeeper 記錄 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 是否有錯誤。
  2. 如果在繫結至通訊埠 #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)
    
  3. 請使用下方的 netstat 指令,確認 ZooKeeper 通訊埠 2181 確實由其他程序使用:
    netstat -an | grep 2181
    

解析度

如果 ZooKeeper 通訊埠 2181 仍在使用中,請按照下列步驟解決這個問題:

  1. 使用 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
    
  2. 清理 pid 並鎖定檔案 (如有):
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
    
  3. 重新啟動 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 檔案未刪除,就有可能發生這種情況。

診斷

  1. 執行 ps 指令,取得目前執行 ZooKeeper 程序的程序 ID:
    ps -ef | grep zookeeper
    
  2. 檢查 /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid 檔案是否存在。如果有,請記下寫入這個檔案的程序 ID。
  3. 比較步驟 1 和 2 取得的程序 ID。如果兩者不同,就會造成這個問題的 apigee-zookeeper.pid file. 含有不正確的程序 ID

解析度

  1. 編輯 apigee-zookeeper.pid 檔案,並將不正確的程序 ID 換成從 ps 指令取得的正確程序 ID (請見上述步驟 #1)。
  2. 重新啟動 ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
    

ZooKeeper 領袖選舉失敗

診斷

診斷方法:

  1. 檢查 ZooKeeper 記錄 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 是否有錯誤。
  2. 檢查是否有任何設定變更可能導致 ZooKeeper 選拔主要變因。
  3. 檢查 /opt/apigee/apigee-zookeeper/conf/zoo.cfg,確認叢集中的所有 ZooKeepers 都具備正確的 server.# 參數編號和 IP 位址。另請注意,選區的選民必須至少有 3 名選民,且選民人數須為奇數,才能取得勝利。如果選民人數太少 (例如只有 2 名選民),就無法根據 2 名投票者的推論,判斷出領先者。

解析度

一般而言,ZooKeeper 選舉失敗是由於 myid 設定錯誤所致。請使用設定錯誤的 ZooKeeper myid 中的解決方法來解決選舉失敗問題。

如果問題持續發生,且需要進一步診斷,請與 Apigee Edge 支援團隊聯絡。