症状
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 つのファイルがあります。
/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
/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
診断
- ZooKeeper のログ
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log
でエラーを確認します。 - 次の図に示す「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)
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
ファイルを調べて、現在の ZooKeeper ノードのサーバー番号をメモします。/opt/apigee/data/apigee-zookeeper/data/myid
ファイルを調べて、ファイル内のテキストがステップ 2 でメモしたサーバー番号と一致するかどうか確認します。- 一致しない場合、それが 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 ファイルや lock ファイルが存在する場合、これらのファイルをクリーンアップします。
/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
ファイルに、現在実行中の ZooKeeper プロセスのものではない古い PID か誤った PID が設定されていることが考えられます。この問題は、ZooKeeper プロセスが予期せずに、または突然終了し、apigee-zookeeper.pid
ファイルが削除されなかった場合に発生します。
診断
ps
コマンドを実行して、現在実行中の ZooKeeper プロセスのプロセス ID を取得します。ps -ef | grep zookeeper
/opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid
ファイルが存在するかどうか確認します。存在する場合、そのファイルに書き込まれているプロセス ID をメモします。- ステップ 1 で取得したプロセス ID と、ステップ 2 でメモしたプロセス ID を比較します。この 2 つが異なる場合、この問題の原因は、誤ったプロセス ID が
apigee-zookeeper.pid file.
に設定されていることにあります。
解決策
- apigee-zookeeper.pid ファイルを編集し、誤ったプロセス ID を、ps コマンド(上記のステップ 1)で取得した正しいプロセス ID で置き換えます。
- 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
を調べて、クラスタ内のすべての ZooKeeper の server.# パラメータに正しい番号と IP アドレスが設定されていることを確認します。また、リーダー選出が成功するには、少なくとも 3 つのボーターが必要であること、ボーターの数は奇数でなければならないことに注意してください。たとえば、ボーターが 2 つしかないなど、ボーターの数が少なすぎると、リーダーを決定できるだけのクォーラムに達しません。したがって、2 つのボーターの間でリーダーを選出することはできません。
解決策
通常、ZooKeeper リーダー選出エラーは、myid が誤って構成されていることが原因で発生します。Misconfigured ZooKeeper の myid 構成が誤っているで説明している解決策に沿って、選出エラーに対処します。
それでも問題が解決せず、さらに診断する必要がある場合は、Apigee サポートにご連絡ください。