症状
Edge UI または Edge 管理 API 呼び出しを使用した API プロキシ リビジョンのデプロイが失敗し、"Error while accessing datastore"
のエラーが表示されます。
エラー メッセージ
Error in deployment for environment qa. The revision is deployed, but traffic cannot flow. Error while accessing datastore;Please retry later
考えられる原因
通常、この問題は、次の原因によるものです。
-
原因 詳細 対象 Message Processor と Cassandra の間のネットワーク接続の問題 ネットワーク接続の問題またはファイアウォール ルールが原因で、Message Processor と Cassandra との間で通信障害が発生しています。 Edge Private Cloud ユーザー Cassandra の再起動によるデプロイエラー Cassandra ノードが定期的なメンテナンスの一部として再起動されたため、使用できませんでした。 Edge Private Cloud ユーザー Cassandra の読み取りリクエストのレイテンシの急激な増加 Cassandra ノードが多数の同時読み取りを実行している場合、読み取りリクエストのレイテンシが急激に増加するため、応答が遅くなる可能性があります。 Edge Private Cloud ユーザー 15 MB を超える API プロキシ バンドル Cassandra は、サイズが 15 MB を超える API プロキシ バンドルを許可しないように構成されています。 Edge Private Cloud ユーザー Message Processor と Cassandra の間のネットワーク接続の問題
診断
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
- API プロキシのデプロイを解除し、再デプロイします。Message Processor と Cassandra の間の接続の問題が一時的であった場合は、エラーがなくなる可能性があります。
警告: 本番環境でエラーが表示された場合は、デプロイを解除しないでください。
- 問題が解決しない場合は、以下の管理 API 呼び出しを実行してデプロイのステータスを確認し、コンポーネントにエラーがないかどうかを確認します。
curl -u sysadmin@email.com https://management:8080/v1/o/<org>/apis/<api>/deployments
Message Processor の 1 つでデータストアにアクセスしているときのエラーを示すデプロイのステータスの出力例
{ "environment" : [ { "aPIProxy" : [ { "name" : "simple-python", "revision" : [ { "configuration" : { "basePath" : "/", "steps" : [ ] }, "name" : "1", "server" : [ { "status" : "deployed", "type" : [ "message-processor" ], "uUID" : "2acdd9b2-17de-4fbb-8827-8a2d4f3d7ada" }, { "error" : "Error while accessing datastore;Please retry later", "errorCode" : "datastore.ErrorWhileAccessingDataStore", "status" : "error", "type" : [ "message-processor" ], "uUID" : "42772085-ca67-49bf-a9f1-c04f2dc1fce3" } "state" : "error" }
- デプロイエラーを表示している Message Processor を再起動します。ネットワークの問題が一時的であった場合、エラーがなくなります。
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- 手順 2 を繰り返して、再起動された Message Processor のデプロイが成功したかどうかを確認します。エラーが見つからない場合は、問題が解決されたことを示します。
- Message Processor がポート 9042 と 9160 の各 Cassandra ノードに接続できるかどうかを確認します。
- telnet が利用可能な場合は、telnet を使用します。
telnet <Cassandra_IP> 9042 telnet <Cassandra_IP> 9160
- telnet を使用できない場合は、次のように netcat で接続を確認します。
nc -vz <Cassandra_IP> 9042 nc -vz <Cassandra_IP> 9160
- 「Connection Refused」または「Connection timed out」というレスポンスが表示された場合は、ネットワーク オペレーション チームにお問い合わせください。
- telnet が利用可能な場合は、telnet を使用します。
- 問題が解決しない場合は、各 Cassandra ノードがポート 9042 とポート 9160 でリッスンしているかどうかを確認します。
netstat -an | grep LISTEN | grep 9042 netstat -an | grep LISTEN | grep 9160
- Cassandra ノードがポート 9042 またはポート 9160 でリッスンしていない場合は、特定の Cassandra ノードを再起動します。
/opt/apigee/apigee-service/bin/apigee-service apigee-cassandra restart
- 問題が解決しない場合は、ネットワーク オペレーション チームにお問い合わせください。
- API プロキシのデプロイを解除し、再デプロイします。Message Processor と Cassandra の間の接続の問題が一時的であった場合は、エラーがなくなる可能性があります。
解決策
ネットワーク オペレーション チームと協力して、Message Processor と Cassandra の間のネットワーク接続の問題を解決します。
Cassandra の再起動によるデプロイエラー
Cassandra ノードは通常、定期的なメンテナンスの一部として、定期的に再起動されます。Cassandra のメンテナンス作業中に API プロキシがデプロイされる場合、Cassandra データストアにアクセスできないため、デプロイが失敗します。
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
診断
- デプロイ時に Cassandra ノードが再起動されたかどうかを確認します。このためには、Cassandra のログまたは Cassandra ノードの最新の起動時ログを確認します。
grep
"shutdown
"/opt/apigee/var/log/apigee-cassandra/system.log
解決策
- Cassandra が起動していることを確認します。
- Message Processor がポート 9042 と 9160 の Cassandra データストアに接続できるかどうかを確認します。
Cassandra の読み取りリクエストのレイテンシの急激な増加
Cassandra での読み取り回数が多いかどうかは、Cassandra からの読み取りアクセスが必要なポリシーを含むプロキシ上の個々のユースケースとトラフィック パターンに依存します。
たとえば、refresh_token 権限付与タイプへの GET 呼び出しが OAuth ポリシーに対して呼び出され、リフレッシュ トークンが多くのアクセス トークンに関連付けられている場合、Cassandra からの読み取り量が多くなる可能性があります。これにより、Cassandra で読み取りリクエストのレイテンシが増加する可能性があります。
診断
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
- ベータ版のモニタリング ダッシュボードをインストールしている場合は、Cassandra ダッシュボードを見て、問題の期間の [Read Requests] チャートを確認します。[Read Request Latencies] のチャートも確認します。
- 読み取りリクエストと読み取りレイテンシを確認する別のツールは、
nodetool cfstats
コマンドです。このコマンドの使用方法の詳細については、Cassandra のドキュメントをご覧ください。
解決策
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
- Cassandra のパフォーマンスが正常に戻ったら、もう一度デプロイを試行します。Cassandra のリング全体が正常であることを確認してください。
- (オプション)接続が確立されていることを確認するために、Message Processor でローリング再起動を実施します。
- 長期的な解決策として、Cassandra データストアでの読み取り数の増加に寄与する可能性のある API トラフィック パターンを確認します。この問題をトラブルシューティングする場合は、Apigee サポートにお問い合わせください。
- 既存の Cassandra ノードが受信トラフィックを処理するのに十分でない場合は、ハードウェア容量または Cassandra データストア ノードの数を適切に増やします。
15 MB を超える API プロキシ バンドル
API プロキシ バンドルのサイズは、Cassandra では 15 MB に制限されています。API プロキシ バンドルのサイズが 15 MB を超える場合は、API プロキシをデプロイしようとすると「Error while accessing datastore」と表示されます。
診断
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
- Message Processor のログ(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)を確認し、特定の API プロキシのデプロイ中にエラーが発生していないかどうかを確認します。 - 下の図に示すようなエラーが表示された場合は、API プロキシ バンドルのサイズが 15 MB を超えるため、デプロイエラーが発生します。
2016-03-23 18:42:18,517 main ERROR DATASTORE.CASSANDRA - AstyanaxCassandraClient.fetchDynamicCompositeColumns() : Error while querying columnfamily : [api_proxy_revisions_r21, adevegowdat@v1-node-js] for rowkey:{} com.netflix.astyanax.connectionpool.exceptions.TransportException: TransportException: [host=None(0.0.0.0):0, latency=159(486), attempts=3]org.apache.thrift.transport.TTransportException: Frame size (20211500) larger than max length (16384000)! at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:197) ~[astyanax-thrift-1.56.43.jar:na] at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65) ~[astyanax-thrift-1.56.43.jar:na] ...<snipped> Caused by: org.apache.thrift.transport.TTransportException: Frame size (20211500) larger than max length (16384000)! at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:137) ~[libthrift-0.9.1.jar:0.9.1] at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101) ~[libthrift-0.9.1.jar:0.9.1] at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) ~[libthrift-0.9.1.jar:0.9.1] ...<snipped>
解決策
リソース ファイルが多すぎる場合は、API プロキシ バンドルが大きくなります。次の解決策を使用して、この問題を解決します。
解決策 1: リソース ファイルを環境レベルまたは組織レベルに移動する
- NodeJS スクリプト ファイルとモジュール、JavaScript ファイル、JAR ファイルなどのすべてのリソース ファイルを環境レベルまたは組織レベルに移動します。リソース ファイルの詳細については、Edge のドキュメントをご覧ください。
- API プロキシをデプロイし、エラーがなくなるかどうかを確認します。
問題が解決しない場合、またはなんらかの理由でリソース ファイルを環境レベルまたは組織レベルに移動できない場合は、解決策 2 を適用します。
解決策 2: Cassandra での API プロキシ バンドルのサイズを増やす
注: 次の手順を実施できるのは Edge Private Cloud ユーザーのみです。Edge Public Cloud を使用している場合は、Apigee サポートにお問い合わせください。
次の手順に従い、Edge で許可されている API プロキシ バンドルの最大サイズを制御する Cassandra プロパティ thrift frame transport size のサイズを増やします。
- 次のファイルが存在しない場合は作成します。
/opt/apigee/customer/application/cassandra.properties
- ファイルに次の行を追加します。このとき、<size> を、大きいバンドルに必要なサイズ設定に置き換えます。
conf_cassandra_thrift_framed_transport_size_in_mb=<size>
- Cassandra を再起動します。
/opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
- クラスタ内のすべての Cassandra ノードで手順 1~3 を繰り返します。
問題が解決しない場合は、Apigee サポートにお問い合わせください。