

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon DocumentDB との接続の問題
<a name="performance-connection-issues"></a>

## 識別 - 問題を特定する
<a name="connection-identification"></a>

**一般的な原因**

接続の問題は通常、次の 3 つの主要な領域から発生します。

接続プールの枯渇は、クライアント側の接続プール制限またはサーバー側のインスタンス制限を通じて、アプリケーションが Amazon DocumentDB への最大許容接続数に達したときに発生します。この条件により、新しい接続リクエストがキューに入れられたり拒否されたりすると、アプリケーションのパフォーマンスが低下し、タイムアウトが発生し、障害が発生する可能性があります。

認証オーバーロードは、Amazon DocumentDB で過剰な同時認証リクエストが発生した場合、特に短期間に 1,000 を超える新しい接続を処理する場合に発生します。認証メンテナンス中、Amazon DocumentDB はセッションマップに排他的ロックを保持し、メンテナンスが完了するまで後続の認証試行をキューに入れます。

Amazon DocumentDB の設定問題は、多くの場合、ネットワーク、セキュリティ、クライアント設定の設定ミスが原因です。これには、誤ったセキュリティグループ設定、不適切な VPC 設定、SSL/TLS 証明書の問題などの項目が含まれます。安全で信頼性の高いデータベースアクセスを維持するには、適切な設定を理解することが不可欠です。

## 診断 - 根本原因を見つける
<a name="connection-diagnose"></a>

**接続プール**

MongoClient インスタンスを作成すると、接続プールが初期化されます。各プールは、2 つの主要なパラメータに基づいて接続を維持します。

minPoolSize - 維持される接続の最小数

maxPoolSize - 最大許容接続数

リクエストで接続が必要な場合:

1. プールは使用可能なアイドル接続をチェックします

1. 存在せず、プールサイズ < maxPoolSize の場合、新しい接続が作成されます。

1. maxPoolSize の場合、リクエストは待機キューに入ります

1. キューがフルまたはタイムアウトに達すると、MongoWaitQueueFullException がスローされます。

待機キューの動作は、次のパラメータを介して処理されます。

waitQueueTimeoutMS - 接続の最大待機時間

waitQueueSize - キューに入れられたリクエストの最大数

新しいプールが毎回作成される Amazon DocumentDB に接続するための問題のあるアプローチの例を次に示します。

```
for(Request request : requests) {
    MongoClient client = MongoClients.create(settings);
    // Process request
    client.close();
}
```

モニタリングすべき重要な CloudWatch メトリクスは次のとおりです。
+ `DatabaseConnections` - 1 分間隔で実行されたインスタンスで開いている接続 (アクティブおよびアイドル) の数。
+ `DatabaseConnectionsMax` - 1 分間にインスタンスで開いているデータベース接続 (アクティブおよびアイドル) の最大数。
+ `DatabaseConnectionsLimit` - 任意の時点でインスタンスで許可される同時データベース接続 (アクティブおよびアイドル) の最大数。
+ `LowMemNumOperationsThrottled` - 1 分間に使用可能なメモリが少ないためにスロットリングされたリクエストの数。

[「インスタンスクラスあたりの制限のクォータと](limits.md#limits.instance)制限」を参照してください。

アプリケーションレベルでの接続プールの問題の一般的な警告サインは次のとおりです。
+ 接続の取得時間の増加
+ 待機キューサイズの増加
+ タイムアウト例外の数の増加

**認証オーバーロード**

Amazon DocumentDB への接続は、次のようなフローに従います。

接続リクエスト → SSL ハンドシェイク → 認証 → セッション作成 → 接続準備完了

>1,000 個の新しい接続を処理すると、SSL ハンドシェイクの完了後に追加の接続リクエストが認証キューに入ります。これらのオーバーロードイベント中は、アプリケーションからの平均接続時間が長くなります。

モニタリングすべき重要な CloudWatch メトリクスは次のとおりです。
+ `DatabaseConnections` - 1 分間隔で実行されたインスタンスで開いている接続 (アクティブおよびアイドル) の数。
+ `DatabaseConnectionsMax` - 1 分間にインスタンスで開いているデータベース接続 (アクティブおよびアイドル) の最大数。
+ `DatabaseConnectionsLimit` - 任意の時点でインスタンスで許可される同時データベース接続 (アクティブおよびアイドル) の最大数。

**設定の問題**

最も一般的な設定の問題は、プライベートネットワーク環境にアクセスせずに環境からプライベート Amazon DocumentDB クラスターエンドポイントに接続しようとすると発生します。Amazon DocumentDB は仮想プライベートクラウド (VPC) 専用で、現在パブリックエンドポイントをサポートしていません。ラップトップまたは VPC 外のローカル開発環境から Amazon DocumentDB クラスターに直接接続することはできません。

これは、次のようなエラーで発生します。

```
Error: couldn't connect to server...
Failed to connect to...
exception: connect failed
connection attempt failed
```

セキュリティグループの設定が正しくないと、接続が失敗する可能性があります。Amazon DocumentDB クラスターは、デフォルトで TCP ポート 27017 で接続をリッスンします。クラスターがデプロイされたポートとは異なるポートに接続しようとした場合、またはアプリケーションがクラスターのイングレスセキュリティグループ設定でカバーされていない場合、アプリケーションは失敗します。

証明書管理が正しくないと、接続の問題が発生する可能性もあります。デフォルトでは、転送時の暗号化は、新しく作成された Amazon DocumentDB クラスターに対して有効になっています。転送中の暗号化が有効になっている場合、global-bundle.pem 証明書を使用してクラスターに接続するには、TLS を使用した安全な接続が必要です。誤った証明書を使用しようとすると、次のようなエラーが表示されます。

```
unable to get local issuer certificate
```

TLS パラメータを指定せずに TLS が有効になっているクラスターに接続しようとすると、次のようなエラーが表示されます。

```
Server selection timed out after 30000 ms
```

## 解決 - 問題を修正する
<a name="connection-resolve"></a>

**接続プール**: ワークロードの要件に合わせてプールサイズを実装または調整して、接続プールを確認します。最適なプール設定は、ワークロードと要件によって異なります。minPoolSize は、コア接続の準備ができて使用可能になるように維持し、maxWaitTime はプールが枯渇した場合にすばやく失敗するのに十分な長さにする必要があります。

新しいプールを毎回作成せずに 1 つのプールを再利用する方法の例を次に示します。

```
MongoClient client = MongoClients.create(settings); 
    for(Request request : requests) { 
    // Process request
}
```

**認証オーバーロード**: 段階的な接続のランプアップを実装し、新しい接続を一度に 1,000 に制限することで、認証を管理します。接続プーリングを使用して、認証された接続を効果的に再利用します。接続で Amazon DocumentDB クラスターが過負荷にならないようにするには、接続のランプアップ戦略を実装します。

```
public class ConnectionManager {
    private static final int BATCH_SIZE = 100;
    private static final int DELAY_MS = 1000;
    
    public void establishConnections(int totalRequired) {
        int established = 0;
        while (established < totalRequired) {
            int batch = Math.min(BATCH_SIZE, totalRequired - established);
            createConnections(batch);
            Thread.sleep(DELAY_MS);
            established += batch;
        }
    }
}
```

接続プールの設定を設定して、許可される接続の合計数を制限することもできます。

```
MongoClientSettings settings = MongoClientSettings.builder()
    .applyToConnectionPoolSettings(builder -> {
        builder.maxSize(500)                     // Limit total connections
               .minSize(10)                      // Maintain base connections
               .maxConnectionLifeTime(3600000)   // Rotate connections hourly
    })
    .applyToServerSettings(builder -> {
        builder.heartbeatFrequency(10000)        // Regular server checks
    })
    .build();
```

**設定の問題**: アプリケーションが Amazon DocumentDB リソースがあるプライベート VPC とサブネットにアクセスできることを確認します。VPC ピアリングを使用している場合は、開発者ガイド「VPC ピアリング接続のトラブルシューティング」で詳細を確認してください。ナレッジセンターの記事[「インターネットから VPC 内の Amazon EC2 インスタンスへの接続に関する問題のトラブルシューティング方法を教えてください](https://repost.aws/knowledge-center/instance-vpc-troubleshoot)」も参照できます。

セキュリティグループ設定では、アプリケーションからの接続を許可するには、Amazon DocumentDB セキュリティグループに進入ルールを含める必要があります。

```
{
  "SecurityGroupIngress": [
    {
      "IpProtocol": "tcp",
      "FromPort": 27017,
      "ToPort": 27017,
      "SourceSecurityGroupId": "<application-security-group>",
      "Description": "DocumentDB access from application tier"
    }
  ],
  "SecurityGroupEgress": [
    {
      "IpProtocol": "-1",
      "FromPort": -1,
      "ToPort": -1,
      "CidrIp": "0.0.0.0/0"
    }
  ]
}
```

クラスターが TLS 暗号化で設定されている場合は、global-bundle.pem という名前の Amazon DocumentDB の TLS 証明書をダウンロードし、クラスターに接続するときに使用します。

```
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
```

**長期ソリューション**

より大きなインスタンスクラスにアップグレードするか、リードレプリカを追加して接続負荷を分散することで、インスタンスのスケーリングが必要になる場合があります。適切な負荷分散の実装により、クラスター全体で最適なリソース使用率が確保されます。

アプリケーションの変更では、堅牢な接続処理、包括的なモニタリング、接続プーリングのベストプラクティスの遵守に焦点を当てる必要があります。これには、適切なエラー処理と接続ライフサイクル管理が含まれます。

アーキテクチャの改善には、可変ワークロードに Amazon DocumentDB Serverless を採用すること、高度な再試行ロジックを実装すること、耐障害性を考慮した設計が含まれる場合があります。接続管理をより適切に処理するために、アプリケーションアーキテクチャの再構築を検討してください。

## ベストプラクティス
<a name="connection-best-practices"></a>

**接続プール**

適切な接続プールの管理とモニタリングにより、アプリケーションは安定したデータベース接続を維持しながら、システムの信頼性とパフォーマンスに影響を与える可能性のある枯渇シナリオを防ぐことができます。ワークロードの特性に基づいて、適切なタイムアウトを設定し、プールのサイズを設定します。

接続プールの設定例

```
MongoClientSettings settings = MongoClientSettings.builder()
    .applyToConnectionPoolSettings(builder ->
        builder.maxSize(10))
    .applyToConnectionPoolSettings(builder ->
        builder.maxWaitQueueSize(2))
    .applyToConnectionPoolSettings(builder ->
        builder.maxConnectionIdleTime(10, TimeUnit.MINUTES))
    .build();
```

詳細については、[https://aws.amazon.com/blogs/database/building-resilient-applications-with-amazon-documentdb-with-mongodb-compatibility-part-1-client-configuration/](https://aws.amazon.com/blogs/database/building-resilient-applications-with-amazon-documentdb-with-mongodb-compatibility-part-1-client-configuration/) を参照してください。

**認証オーバーロード**

常に、ワークロードに基づいてパラメータの適切な値を使用して接続プーリングを実装します。段階的な接続確立手法を使用し、可能な場合は永続的な接続を維持します。適切な接続クリーンアップを実装して、アイドル状態のリソースが浪費されないようにします。

**設定の問題**

アプリケーションから Amazon DocumentDB リソースへの適切なルーティングが設定されていることを確認します。転送中の暗号化に TLS を使用し、最小特権アクセスを実装します。Amazon DocumentDB 認証情報を検証し、接続文字列値を検証します。