ZooKeeper を起動できない

症状

ZooKeeper プロセスを開始できない。

エラー メッセージ

ZooKeeper プロセスを開始しようとすると、ZooKeeper を起動できなかったことを意味する次のエラー メッセージが返されます。

    + apigee-service apigee-zookeeper status
    apigee-service: apigee-zookeeper: Not running (DEAD)
    apigee-all: Error: status failed on [apigee-zookeeper]
    

考えられる原因

次の表に、このエラーで考えられる原因を記載します。

原因 対象
ZooKeeper の myid 構成が誤っている Edge Private Cloud ユーザー
ZooKeeper ポートが別のプロセスで使用されている Edge Private Cloud ユーザー
apigee-zookeeper.pid ファイルに誤ったプロセス ID が設定されている Edge Private Cloud ユーザー
ZooKeeper リーダー選出エラー Edge Private Cloud ユーザー

この表のリンクをクリックすると、問題の解決策を確認できます。

ZooKeeper の myid 構成が誤っている

以降のセクションで、myid ファイルの概要と、構成ミスの問題を診断して解決する方法を説明します。

myid ファイルの概要

各 ZooKeeper ノードには、次の 2 つのファイルがあります。

  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.2=33.33.33.33:2888:3888
        
  2. /opt/apigee/data/apigee-zookeeper/data/myid ファイル。その特定の ZooKeeper ノードのサーバー番号に対応する 1 行のテキストを格納するファイルです。サーバー 1 の myid には「1」というテキストしか格納されていません。この ID は、該当するアンサンブル内で一意である必要があります。ID の値の範囲は 1~255 です。

    たとえば、ZooKeeper サーバー.1 の /opt/apigee/data/apigee-zookeeper/data/myid ファイルには、次のように、1 というテキストだけが格納されています。

        $ cat myid
        1
        

診断

  1. ZooKeeper のログ /opt/apigee/var/log/apigee-zookeeper/zookeeper.log でエラーを確認します。
  2. 次の図に示す「Connection broken for id #, my 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 ノードのサーバー番号をメモします。
  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. ポート 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 ファイルや lock ファイルが存在する場合、これらのファイルをクリーンアップします。
        /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 ファイルに、現在実行中の ZooKeeper プロセスのものではない古い PID か誤った PID が設定されていることが考えられます。この問題は、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 で取得したプロセス ID と、ステップ 2 でメモしたプロセス ID を比較します。この 2 つが異なる場合、この問題の原因は、誤ったプロセス ID が apigee-zookeeper.pid file. に設定されていることにあります。

解決策

  1. apigee-zookeeper.pid ファイルを編集し、誤ったプロセス ID を、ps コマンド(上記のステップ 1)で取得した正しいプロセス ID で置き換えます。
  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 を調べて、クラスタ内のすべての ZooKeeper の server.# パラメータに正しい番号と IP アドレスが設定されていることを確認します。また、リーダー選出が成功するには、少なくとも 3 つのボーターが必要であること、ボーターの数は奇数でなければならないことに注意してください。たとえば、ボーターが 2 つしかないなど、ボーターの数が少なすぎると、リーダーを決定できるだけのクォーラムに達しません。したがって、2 つのボーターの間でリーダーを選出することはできません。

解決策

通常、ZooKeeper リーダー選出エラーは、myid が誤って構成されていることが原因で発生します。Misconfigured ZooKeeper の myid 構成が誤っているで説明している解決策に沿って、選出エラーに対処します。

それでも問題が解決せず、さらに診断する必要がある場合は、Apigee サポートにご連絡ください。