症状
ZooKeeper の接続問題は、以下のようなさまざまな症状として現れることがあります。
- API プロキシのデプロイエラー
- 管理 API 呼び出しが 5XX エラーで失敗する
- Router または Message Processor 起動しない
- 分析コンポーネントから ZooKeeper への接続が失われたと system.logs に書き込まれる
エラー メッセージ
以下は、ZooKeeper ノードへの接続が失われたときに表示される可能性があるエラー メッセージの例です。
- ZooKeeper への接続が失われたために API Proxy のデプロイに失敗した場合、Management Server のログに次のエラーが表示されます。
org: env: main INFO ZOOKEEPER - ZooKeeperServiceImpl.exists() : Retry path existence path: /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable, reason: KeeperErrorCode = ConnectionLoss org: env: main ERROR ZOOKEEPER - ZooKeeperServiceImpl.exists() : Could not detect existence of path: /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable , reason: KeeperErrorCode = ConnectionLoss org: env: main ERROR KERNEL.DEPLOYMENT - ServiceDeployer.startService() : ServiceDeployer.deploy() : Got a life cycle exception while starting service [ServerRegistrationService, Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable] : com.apigee.zookeeper.ZooKeeperException{ code = zookeeper.ErrorCheckingPathExis tence, message = Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable, associated contexts = []} 2015-03-25 10:22:39,811 org: env: main ERROR KERNEL - MicroKernel.deployAll() : MicroKernel.deployAll() : Error in deploying the deployment : EventService com.apigee.zookeeper.ZooKeeperException: Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:339) ~[zookeeper-1.0.0.jar:na] at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists( ZooKeeperServiceImpl.java:323) ~[zookeeper-1.0.0.jar:na] at ... snipped
- 起動中に Router と Message Processor は ZooKeeper への接続を試みます。ZooKeeper との接続に問題がある場合、これらのコンポーネントは起動できず、次のようなエラーが返されます。
2017-08-01 23:20:00,404 CuratorFramework-0 ERROR o.a.c.f.i.CuratorFrameworkImpl - CuratorFrameworkImpl.logError() : Background operation retry gave up org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss at org.apache.zookeeper.KeeperException.create(KeeperException.java:99) ~[zookeeper-3.4.6.jar:3.4.6-1569965] at org.apache.curator.framework.imps.CuratorFrameworkImpl.checkBackgroundRetry(CuratorFrameworkImpl.java:710) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.performBackgroundOperation(CuratorFrameworkImpl.java:827) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:793) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.access$400(CuratorFrameworkImpl.java:57) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl$4.call(CuratorFrameworkImpl.java:275) [curator-framework-2.5.0.jar:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
- Edge UI が API プロキシのデプロイ ステータスを確認できなかったときに、次のエラーが表示されることがあります。
Error Fetching Deployments Error while checking path existence for path: path
考えられる原因
このエラーの考えられる原因を次の表に示します。
原因 | 対象 |
---|---|
複数のデータセンター間のネットワーク接続の問題 | Edge Private Cloud ユーザー |
ZooKeeper ノードがリクエストを処理しない | Edge Private Cloud ユーザー |
この表のリンクをクリックすると、問題の解決策を確認できます。
複数のデータセンター間のネットワーク接続の問題
診断
ZooKeeper クラスタには、DC-1 や DC-2 など、複数のリージョン / データセンターにまたがるノードがあります。典型的な Apigee Edge 2 DC トポロジは次のとおりです。
- DC-1 で ZooKeeper サーバー 1、2、3 をボーターとして指定
- DC-2 で ZooKeeper 4、5 をボーター、ZooKeeper 6 をオブザーバとして指定
DC-1 リージョンがダウンしたり、DC-1 と DC-2 との間のネットワーク接続が切断された場合、ZooKeeper ノードは DC-2 の新しいリーダーを選べず、リーダーノードと通信できなくなります。ZooKeeper のオブザーバは新しいリーダーを選べません。新しいリーダーの選出にはボーター ノードが 3 つ以上のクォーラムが必要ですが、DC-2 には 2 つしかボーターが残っていません。したがって、DC-2 の ZooKeepers はリクエストを処理できません。DC-2 の残りの ZooKeeper ノードは、リーダーを見つけるために ZooKeeper のボーターに接続しようとして、再試行ループに入ります。
解決策
次の解決策を使用して、この問題を解決します。
これらの解決策を試しても問題を解決できない場合は、Apigee サポートにお問い合わせください。
解決策 1
- ネットワーク管理者と協力して、データセンター間のネットワーク接続の問題を修復します。
- データセンター間で ZooKeeper アンサンブルが通信を回復し、ZooKeeper リーダーを選ぶことができると、ノードは正常になり、リクエストを処理できるようになります。
解決策 2
- ネットワークの接続に修復に時間がかかる場合は、回避策として、ZooKeeper ノードが停止しているリージョンの ZooKeeper ノードを再構成します。たとえば、このリージョンの 3 つの ZooKeeper ノードがすべてボーターになるように DC-2 の ZooKeeper クラスタを再構成し、
zoo.cfg
で DC-1 リージョンに属する ZooKeeper のserver.#
を削除します。- 次の例では、
zoo.cfg
で 2 つのリージョンのノードを構成しています。DC-1 には US-East リージョンを意味するus-ea
ホスト名、DC-2 には US-West リージョンを意味するus-wo
ホスト名が使用されています。(注: ここでは、解決策に関連する構成行のみ示しています)server.1=zk01ea.us-ea.4.apigee.com:2888:3888 server.2=zk02ea.us-ea.4.apigee.com:2888:3888 server.3=zk03ea.us-ea.4.apigee.com:2888:3888 server.4=zk04wo.us-wo.4.apigee.com:2888:3888 server.5=zk05wo.us-wo.4.apigee.com:2888:3888 server.6=zk06wo.us-wo.4.apigee.com:2888:3888:observer
この例では、
zoo.cfg
を次のように再構成します。server.1=zk04wo.us-wo.4.apigee.com:2888:3888 server.2=zk05wo.us-wo.4.apigee.com:2888:3888 server.3=zk06wo.us-wo.4.apigee.com:2888:3888
- code with config テクニックを使用して、次の行を含む
/opt/apigee/customer/application/zookeeper.properties
ファイルを作成します。conf_zoo_quorum=server.1=zk04wo.us-wo.4.apigee.com:2888:3888\ \nserver.2=zk05wo.us-wo.4.apigee.com:2888:3888\ \nserver.3=zk06wo.us-wo.4.apigee.com:2888:3888\
ここでは
:observer
アノテーションが削除されたことで、US-East のノードが削除され、US-West のノードがボーターにプロモートされています。 - 次の例では、
/opt/apigee/apigee-zookeeper/conf/zoo.cfg
と以前の/opt/apigee/customer/application/zookeeper.properties
をバックアップします。ネットワーク接続がデータセンター間でバックアップされたときに、これらのファイルを使用してデフォルトを復元できます。
オブザーバー ノードのオブザーバー アノテーションを無効にします。これを行うには、次の構成を
/opt/apigee/customer/application/zookeeper.properties
の先頭に追加します。conf_zoo_peertype=
-
次のように
/opt/apigee/data/apigee-zookeeper/data/myid
ファイルを編集します。server.1
では、myid
内のエントリを 4 から 1 に変更します。server.2
では、myid
を 5 から 2 に変更します。server.3
では、myid
を 6 から 3 に変更します。
- ZooKeeper クラスタを再構成したリージョンの ZooKeeper ノードを再起動します。
- DC-2 のすべての ZooKeeper ノードについて、上記の構成をステップ #1b からステップ #5 まで繰り返します。
- リーダーが選ばれ、ノードが起動していることを確認します。
$ echo srvr | nc zk04wo.us-wo.4.apigee.com 2181 > echo srvr | nc zk05wo.us-wo.4.apigee.com 2181 > echo srvr | nc zk06wo.us-wo.4.apigee.com 2181
このコマンドの出力には「mode」という行が含まれ、リーダーは leader、フォロワーは follower と示されます。
データセンター間のネットワークが再確立されると、DC-2 の ZooKeeper ノード上でZooKeeper 構成の変更を元に戻すことができます。
解決策 3
- クラスタ内の ZooKeeper ノードが起動していない場合は、再起動します。
- ZooKeeper ログを確認して、ZooKeeper ノードがダウンした理由を調べます。
ZooKeeper のログは、次のディレクトリにあります。
$ cd /opt/apigee/var/log/apigee-zookeeper $ ls -l total 188 -rw-r--r--. 1 apigee apigee 2715 Jul 22 19:51 apigee-zookeeper.log -rw-r--r--. 1 apigee apigee 10434 Jul 17 19:51 config.log -rw-r--r--. 1 apigee apigee 169640 Aug 1 19:51 zookeeper.log
- Apigee サポートに連絡し、ZooKeeper ログを提供して、ZooKeeper ノードが停止している原因をトラブルシューティングします。
ZooKeeper ノードがリクエストを処理しない
アンサンブル内の ZooKeeper ノードが正常でなくなり、クライアントのリクエストに応答できなくなっている可能性があります。これには次の理由が考えられます。
- ノードが再起動せずに停止した。
- ノードが自動起動を有効にせずに再起動した。
- ノードのシステム負荷によりノードがダウンしたり正常でなくなったりした。
診断
- 各 ZooKeeper ノードで次の ZooKeeper ヘルスチェック コマンドを実行し、出力を確認します。
-
$ echo "ruok" | nc localhost 2181
出力例:
$ echo "ruok" | nc localhost 2181 imok
-
echo srvr | nc localhost 2181
Mode を調べて、ZooKeeper ノードがリーダーかフォロワーかを確認します。
オールインワンの単一の ZooKeeper ノードの出力例:
$ echo srvr | nc localhost 2181 ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT Latency min/avg/max: 0/0/88 Received: 4206601 Sent: 4206624 Connections: 8 Outstanding: 0 Zxid: 0x745 Mode: standalone Node count: 282
-
$ echo mntr | nc localhost 2181
このコマンドは、ZooKeeper クラスタのヘルスチェックに使用できる ZooKeeper 変数を一覧表示します。
出力例:
$ echo mntr | nc localhost 2181 zk_version 3.4.5-1392090, built on 09/30/2012 17:52 GMT zk_avg_latency 0 zk_max_latency 88 zk_min_latency 0 zk_packets_received 4206750 zk_packets_sent 4206773 zk_num_alive_connections 8 zk_outstanding_requests 0 zk_server_state standalone zk_znode_count 282 zk_watch_count 194 zk_ephemerals_count 1 zk_approximate_data_size 22960 zk_open_file_descriptor_count 34 zk_max_file_descriptor_count 4096
-
$ echo stat | nc localhost 2181
このコマンドは、パフォーマンスおよび接続されたクライアントに関する統計をリストアップします。
出力例:
$ echo stat | nc localhost 2181 ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT Clients: /10.128.0.8:54152[1](queued=0,recved=753379,sent=753385) /10.128.0.8:53944[1](queued=0,recved=980269,sent=980278) /10.128.0.8:54388[1](queued=0,recved=457094,sent=457094) /10.128.0.8:54622[1](queued=0,recved=972938,sent=972938) /10.128.0.8:54192[1](queued=0,recved=150843,sent=150843) /10.128.0.8:44564[1](queued=0,recved=267332,sent=267333) /127.0.0.1:40820[0](queued=0,recved=1,sent=0) /10.128.0.8:53960[1](queued=0,recved=150844,sent=150844) Latency min/avg/max: 0/0/88 Received: 4206995 Sent: 4207018 Connections: 8 Outstanding: 0 Zxid: 0x745 Mode: standalone Node count: 282
-
$ echo cons | nc localhost 2181
このコマンドは、ZooKeeper 接続の詳細を示します。
出力例:
$ echo cons | nc localhost 2181 /127.0.0.1:40864[0](queued=0,recved=1,sent=0) /10.128.0.8:54152[1](queued=0,recved=753400,sent=753406,sid=0x15d521a96d40007, lop=PING,est=1500321588647,to=40000,lcxid=0x972e9,lzxid=0x745,lresp=1502334173174, llat=0,minlat=0,avglat=0,maxlat=26) /10.128.0.8:53944[1](queued=0,recved=980297,sent=980306,sid=0x15d521a96d40005, lop=PING,est=1500321544896,to=40000,lcxid=0xce92a,lzxid=0x745,lresp=1502334176055, llat=0,minlat=0,avglat=0,maxlat=23) /10.128.0.8:54388[1](queued=0,recved=457110,sent=457110,sid=0x15d521a96d4000a, lop=PING,est=1500321673852,to=40000,lcxid=0x4dbe3,lzxid=0x745,lresp=1502334174245, llat=0,minlat=0,avglat=0,maxlat=22) /10.128.0.8:54622[1](queued=0,recved=972967,sent=972967,sid=0x15d521a96d4000b, lop=PING,est=1500321890175,to=40000,lcxid=0xccc9d,lzxid=0x745,lresp=1502334182417, llat=0,minlat=0,avglat=0,maxlat=88) /10.128.0.8:54192[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40008, lop=PING,est=1500321591985,to=40000,lcxid=0x8,lzxid=0x745,lresp=1502334184475, llat=3,minlat=0,avglat=0,maxlat=19) /10.128.0.8:44564[1](queued=0,recved=267354,sent=267355,sid=0x15d521a96d4000d, lop=PING,est=1501606633426,to=40000,lcxid=0x356e2,lzxid=0x745,lresp=1502334182315, llat=0,minlat=0,avglat=0,maxlat=35) /10.128.0.8:53960[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40006, lop=PING,est=1500321547138,to=40000,lcxid=0x5,lzxid=0x745,lresp=1502334177036, llat=1,minlat=0,avglat=0,maxlat=20)
最後の 3 つのヘルスチェック コマンドのいずれかに次のメッセージが表示された場合:
$ echo stat | nc localhost 2181 This ZooKeeper instance is not currently serving requests
特定の ZooKeeper ノードがリクエストを処理していないことを示します。
-
- 該当のノードの ZooKeeper ログを確認し、ZooKeeper 停止の原因とみられるエラーを特定します。ZooKeeper のログは、次のディレクトリにあります。
$ cd /opt/apigee/var/log/apigee-zookeeper $ ls -l total 188 -rw-r--r--. 1 apigee apigee 2715 Jul 22 19:51 apigee-zookeeper.log -rw-r--r--. 1 apigee apigee 10434 Jul 17 19:51 config.log -rw-r--r--. 1 apigee apigee 169640 Aug 1 19:51 zookeeper.log
解決策
- クラスタ内の他のすべての ZooKeeper ノードを 1 つずつ再起動します。
- 各ノードで ZooKeeper ヘルスチェック コマンドを再実行し、期待される出力が得られるかどうかを確認してください。
それでも問題が解決しない場合、または再起動しても問題が解決しない場合は、Apigee サポートに連絡して、システム負荷の原因をトラブルシューティングしてください。