無法啟動 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 會包含文字「1」其他東西這個 ID 在組合中不得重複 且值介於 1 到 255 之間

    以 ZooKeeper 伺服器 為例, /opt/apigee/data/apigee-zookeeper/data/myid 檔案只能包含文字 1 如下所示:

    $ cat myid
    1
    

診斷

  1. 查看 ZooKeeper 記錄 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log: 發生錯誤。
  2. 如果您看到 WARN 訊息,類似「ID 為 #,我的 id = # 的連線已中斷」, 如下圖所示,這個問題的可能原因為伺服器編號 中的檔案設定錯誤或損毀。
    [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 檔案,並記下 server.#。
  4. 檢查 /opt/apigee/data/apigee-zookeeper/data/myid 檔案,看看當中是否包含文字 與步驟 2 記下的伺服器相符。
  5. 如果兩者不一致,就表示您已找出 ZooKeeper 無法 。

解析度

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

正在使用 ZooKeeper 通訊埠

診斷

  1. 查看 ZooKeeper 記錄 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log: 發生錯誤。
  2. 如果 java.net.BindException: Address already in use 繫結至通訊埠 #2181 (如下圖所示) 時,表示 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,以及目前變更的 pid 執行 ZooKeeper 程序。如果 ZooKeeper 程序意外終止,就會發生這種情況。 意外發現,且 apigee-zookeeper.pid 檔案並未刪除。

診斷

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

解析度

  1. 請編輯 apigee-zookeeper.pid 檔案,並將錯誤的程序 ID 替換為正確的程序 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 人 投票者,但無法透過仲裁決定一名選民的票數。

解析度

通常,ZooKeeper 選舉失敗的原因通常是我的 ID 設定錯誤。請使用以下解析度: 設定錯誤的 ZooKeeper myid 以解決選舉失敗問題。

如果問題仍未解決,需要進一步診斷,請與 Apigee Edge 支援團隊聯絡。