ZooKeeper 接続切断エラー

症状

ZooKeeper の接続問題は、以下のようなさまざまな症状として現れることがあります。

  1. API プロキシのデプロイエラー
  2. 管理 API 呼び出しが 5XX エラーで失敗する
  3. Router または Message Processor 起動しない
  4. 分析コンポーネントから ZooKeeper への接続が失われたと system.logs に書き込まれる

エラー メッセージ

以下は、ZooKeeper ノードへの接続が失われたときに表示される可能性があるエラー メッセージの例です。

  1. 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
        
  2. 起動中に 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]
        
  3. 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

  1. ネットワーク管理者と協力して、データセンター間のネットワーク接続の問題を修復します。
  2. データセンター間で ZooKeeper アンサンブルが通信を回復し、ZooKeeper リーダーを選ぶことができると、ノードは正常になり、リクエストを処理できるようになります。

解決策 2

  1. ネットワークの接続に修復に時間がかかる場合は、回避策として、ZooKeeper ノードが停止しているリージョンの ZooKeeper ノードを再構成します。たとえば、このリージョンの 3 つの ZooKeeper ノードがすべてボーターになるように DC-2 の ZooKeeper クラスタを再構成し、zoo.cfg で DC-1 リージョンに属する ZooKeeper の server.# を削除します。
    1. 次の例では、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
          
    2. 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 のノードがボーターにプロモートされています。

  2. /opt/apigee/apigee-zookeeper/conf/zoo.cfg と以前の /opt/apigee/customer/application/zookeeper.properties をバックアップします。

    ネットワーク接続がデータセンター間でバックアップされたときに、これらのファイルを使用してデフォルトを復元できます。

  3. オブザーバー ノードのオブザーバー アノテーションを無効にします。これを行うには、次の構成を /opt/apigee/customer/application/zookeeper.properties の先頭に追加します。

    conf_zoo_peertype=
  4. 次のように /opt/apigee/data/apigee-zookeeper/data/myid ファイルを編集します。

    • server.1 では、myid 内のエントリを 4 から 1 に変更します。
    • server.2 では、myid5 から 2 に変更します。
    • server.3 では、myid6 から 3 に変更します。
  5. ZooKeeper クラスタを再構成したリージョンの ZooKeeper ノードを再起動します。
  6. DC-2 のすべての ZooKeeper ノードについて、上記の構成をステップ #1b からステップ #5 まで繰り返します。
  7. リーダーが選ばれ、ノードが起動していることを確認します。
        $ 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

  1. クラスタ内の ZooKeeper ノードが起動していない場合は、再起動します。
  2. 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
        
  3. Apigee サポートに連絡し、ZooKeeper ログを提供して、ZooKeeper ノードが停止している原因をトラブルシューティングします。

ZooKeeper ノードがリクエストを処理しない

アンサンブル内の ZooKeeper ノードが正常でなくなり、クライアントのリクエストに応答できなくなっている可能性があります。これには次の理由が考えられます。

  1. ノードが再起動せずに停止した。
  2. ノードが自動起動を有効にせずに再起動した。
  3. ノードのシステム負荷によりノードがダウンしたり正常でなくなったりした。

診断

  1. 各 ZooKeeper ノードで次の ZooKeeper ヘルスチェック コマンドを実行し、出力を確認します。
    1.     $ echo "ruok" | nc localhost 2181
          

      出力例:

          $ echo "ruok" | nc localhost 2181
          imok
          
    2.     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
          
    3.     $ 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
          
    4.     $ 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
          
    5.     $ 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 ノードがリクエストを処理していないことを示します。

  2. 該当のノードの 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
        

解決策

  1. クラスタ内の他のすべての ZooKeeper ノードを 1 つずつ再起動します。
  2. 各ノードで ZooKeeper ヘルスチェック コマンドを再実行し、期待される出力が得られるかどうかを確認してください。

それでも問題が解決しない場合、または再起動しても問題が解決しない場合は、Apigee サポートに連絡して、システム負荷の原因をトラブルシューティングしてください。