Amazon Keyspaces (Apache Cassandra 向け) のタイムアウトの例外をトラブルシューティングしたいと考えています。
解決方法
複数のノードでクラスターを実行するように設計されている Apache Cassandra とは異なり、Amazon Keyspaces はサーバーレスです。Apache Cassandra には、容量などのサーバーレス機能に関連する例外はありません。ほとんどの Apache Cassandra ドライバーの実装では、Apache Cassandra で発生する可能性があるエラーのみ処理されます。そのため、Amazon Keyspaces では互換性を維持するために、同じエラーコードを使用する必要があります。
接続の問題のトラブルシューティングについては、「Amazon Keyspaces での接続のトラブルシューティング」を参照してください。
Keyspaces のタイムアウトをトラブルシューティングするには、Amazon CloudWatch のモニタリングを使用します。Amazon Keyspaces コンソールのグラフを使用して、テーブルのメトリクスを表示することができます。テーブルを選択し、[モニター] タブを選択します。CloudWatch を使用して利用可能な Apache Cassandra のメトリクスをモニタリングする方法については、「Amazon Keyspaces メトリクスおよびディメンション」を参照してください。
また、AWS CloudFormation テンプレートを (GitHub ウェブサイトから) 使用して、CloudWatch ダッシュボードをデプロイし、キースペースや個々のテーブルをモニタリングすることもできます。以下のメトリクスをモニタリングできます:
- PerConnectionRequestRateExceeded
- StoragePartitionThroughputCapacityExceeded
- ReadThrottleEvents および WriteThrottleEvents
PerConnectionRequestRateExceeded
PerConnectionRequestRateExceeded メトリクスでは、接続ごとのリクエストレートのクォータを超えている Amazon Keyspaces のリクエストを測定します。ピアへの 1 つの接続では、1 秒あたり最大 3,000 の CQL リクエストをサポートできます。詳細については、「 Amazon Keyspaces (Apache Cassandra 向け) の割当」を参照してください。公開エンドポイントに接続する場合は、9 つのピアに接続できます。そのため、デフォルトの制限は 1 秒あたり 27,000 の CQL リクエストで、デフォルトのドライバー設定はピアあたり 1 つの接続です。
Amazon Virtual Private Cloud (Amazon VPC) エンドポイントを使用する場合、ピアの数は、エンドポイントにインターフェイスがあるアベイラビリティーゾーンの数によって異なります。例えば、ap-southeast-2 には 3 つのアベイラビリティーゾーンが含まれます。このリージョンでは、各ピアに接続が 1 つ設定されている場合、アプリケーションは 1 秒あたり 9,000 件の CQL リクエストに制限されます。1 秒あたりに許可される CQL リクエストの数を増やすには、ピアごとの接続数を増やします。たとえば、公開エンドポイントを使用してピアあたりの接続数を 2 に設定すると、CQL リクエスト数の上限は 9 * 3,000 * 2 = 54,000 になります。
Datastax Java ドライバー v3 を使用している場合は、クラスターに次のプールオプションが含まれていることを確認してください:
Cluster cluster =Cluster.builder()
.addContactPoint("cassandra.ap-southeast-2.amazonaws.com")
.withPort(9142)
...
.withPoolingOptions(new PoolingOptions().setConnectionsPerHost(HostDistance.LOCAL,9,9))
.build();
Datastax Java ドライバー v4 を使用している場合は、application.conf に以下が含まれていることを確認してください:
datastax-java-driver {
advanced.connection {
pool {
local {
size = 9
}
}
}
}
Python ドライバーでは、Amazon Keyspaces が ピアあたりの接続数を増やすために必要な v3 または v4 プロトコルを使用することはできません。Datastax Java v4 ドライバーを使用している場合は、hostname-validation を無効にしてください。これを有効にすると、ドライバーは 1 つのピアにのみ接続し、1 秒あたりのリクエストの総数が厳しく制限されます。
application.conf ファイルには以下が含まれている必要があります:
datastax-java-driver {
advanced {
ssl-engine-factory {
class = DefaultSslEngineFactory
hostname-validation = false
}
}
}
Amazon VPC エンドポイントを介して接続する場合、AWS Identity and Access Management (IAM) ポリシーにアクセス許可を追加して、Amazon Keyspaces が VPC とエンドポイントの情報をクエリできるようにします。この情報は system.peers テーブルに入力するために必要になります。IAM ポリシーには次のアクセス許可が必要です:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "ListVPCEndpoints",
"Effect": "Allow",
"Action": ["ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcEndpoints"],
"Resource": "*"
}]
}
IAM ポリシーにこれらのアクセス許可がない場合、ドライバーは、1 秒あたりのリクエストの総数を制限する 1 つのホストにのみ接続できます。
StoragePartitionThroughputCapacityExceeded
StoragePartitionThroughputCapacityExceeded メトリクスでは、パーティションの 3,000 RCU/RRU および 1000 WCU/WRU の制限を超えるリクエストを測定します。つまり、現在のトラフィックパターンが複数のパーティションに均等に分散されるのではなく、1 つまたは少数のパーティションに集中しているということです。この問題を解決するには、トラフィックパターンを変更します。詳細については、「 Amazon Keyspaces (Apache Cassandra 向け) におけるデータモデリング」を参照してください。
ReadThrottleEvents および WriteThrottleEvents
ReadThrottleEvents と ** WriteThrottleEvents** のメトリクスでは、テーブルまたは AWS アカウントで使用可能な容量を超えるリクエストを測定します。PerConnectionRequestRateExceeded が原因で発生したスロットリングもメトリクスに含まれる点に注意してください。
プロビジョニング済みの容量を使用している場合は、設定されている読み取りまたは書き込みのプロビジョニング容量を増やしてください。または、AWS Auto Scaling を使用します。AWS Auto Scaling を使用している場合は、利用可能な最大容量を増やしてください。その際、より大規模なスケーリングを可能にするために、アカウントのテーブルまたは AWS リージョンの制限を増やす必要がある場合があります。Auto Scaling では処理できないトラフィックの急増が発生した場合は、代わりにオンデマンドキャパシティ予約を使用してください。
AllNodesFailedException エラーまたは NoHostAvailable エラー
読み取りまたは書き込みのタイムアウトなどの問題が発生すると、Apache Cassandra ドライバーはデフォルトで別のピアに接続しようとします。Apache Cassandra クラスターの場合、これは問題の原因となっている単一ノードの負荷を軽減するのに役立ちます。ただし、Amazon Keyspaces の場合は新しいノードでも同じ問題が発生する可能性があります。その後、Amazon Keyspaces はすべてのピアがなくなるまで次のピアに移動することがあります。この場合、AllNodesFailedException または NoHostAvailable のエラーメッセージが表示されます。
ドライバーをホストに残し、エクスポネンシャルバックオフと再試行のメカニズムを実装するように設定するのがベストプラクティスです。設定例については、GitHub のウェブサイトの amazon-keyspaces-java-driver-helpers を参照してください。