クラスタープロキシモードの接続プール機能は、プロキシからデータベース (DB) への接続をプールして再利用します。これにより、特定のステートフルコマンドによるバックエンド DB 接続の枯渇を防ぎ、ご利用の Tair (Redis OSS-compatible) インスタンスの安定性を確保します。
シナリオ
クラウドネイティブクラスターインスタンスのプロキシモードでは、標準コマンドは共有接続を介して転送されます。クライアント接続が増加しても、バックエンド DB 接続の数には影響しません。ビジネスロジックに特定のステートフルコマンドが含まれている場合、プロキシとデータノード間の接続は共有モードから排他モードに切り替わります。
排他モードでは、各クライアント接続がデータノード上に対応する排他接続を確立します。高同時実行シナリオでは、これによりデータノード上の接続数がクライアント接続数に比例して線形に増加します。これにより、max number of clients reached エラーがトリガーされ、サービス中断につながる可能性があります。
watch またはブロッキングリクエストを使用する場合、シャード数を増やしてスケールアウトしても、単一シャード上の接続が多すぎるという問題は解決されません。
排他モードをトリガーするコマンドには、次のものがあります:
トランザクションコマンド:
MULTI/EXEC(WATCHの後)ブロッキングコマンド:
BLPOP、BRPOP、BRPOPLPUSH、XREAD ... BLOCK ...
接続プール機能は、プロキシからデータノードへの排他接続をプールして再利用します。これにより、データノード上の接続数が削減され、接続制限の超過によるリクエストの失敗が防止されます。
アーキテクチャ
接続プール機能は、各プロキシサブインスタンス上で独立して実行されます。各プロキシは、各データノードへの接続用に専用の接続プールを維持します。
例:
接続プールがない場合、クライアントとプロキシ間の各接続は、アクセスする各バックエンドデータシャードへの個別の接続を確立します。たとえば、10 個のクライアント接続がすべて 5 つのシャードにアクセスする場合、合計 10 × 5 = 50 の接続が作成されます。
接続プールを有効にすると、プロキシは各データシャードに対して限定された接続プールを維持します。クライアントリクエストは、これらのプール内の接続を再利用します。これにより、実際に確立されるデータベース接続の数が大幅に削減されます。たとえば、同じ 10 個のクライアント接続の場合、各シャードはプール内で 2 つの接続を維持するだけでよく、合計で 2 × 5 = 10 個の接続しか必要ありません。
ワークフロー:
クライアント接続 (Client Conn) が排他モードでリクエストを開始すると、プロキシノードは対応するデータシャードの接続プールからアイドル接続を取得します。
プールヒット: プールにアイドル接続がある場合、プロキシはすぐにその接続をクライアント接続にアタッチしてリクエストを転送します。リクエストが完了すると、接続はデタッチされ、他のクライアントが再利用できるように接続プールに戻されます。
プールミス: プールにアイドル接続がない場合、プロキシは新しい接続を作成します。リクエストが完了した後:
プール内の合計接続数が上限 (
private_conn_pool_max_idle_per_db) に達していない場合、接続はプールに追加されます。プール内の合計接続数が上限に達した場合、接続はすぐに解放されます (短命接続モード)。
この最適化により、データベースの接続管理オーバーヘッドが大幅に削減され、リソースのオーバーヘッドが減少し、データベースの安定性とスループットが向上します。
適用範囲
インスタンスは次の要件を満たす必要があります:
デプロイモード:クラウドネイティブ。デプロイモードをクラシックからクラウドネイティブに変更できます。
インスタンスアーキテクチャ: クラスター。インスタンスアーキテクチャをスタンダードからクラスターに変更できます。
接続モード: プロキシモード。
プロキシバージョン: 7.0.17 以降。バージョンがこれより古い場合は、プロキシバージョンをアップグレードできます。
接続プール機能を有効にする
インスタンスパラメーターを変更することで、接続プール機能を有効にできます。この操作はホットアップデートをサポートしており、インスタンスの再起動は不要です。サービスには影響しません。
インスタンスページに移動します。上部のナビゲーションバーで、リージョンを選択します。次に、ターゲットインスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、[パラメーター設定] をクリックします。
パラメーターリストで
private_conn_pool_enabledを見つけ、[操作] 列の [変更] をクリックします。表示されたダイアログボックスで、パラメーター値を
1に設定し、[OK] をクリックします。
その後、Cloud Monitor コンソールに移動し、インスタンスを見つけて、[インフラストラクチャモニタリング] の下の [プロキシから DB への接続数] メトリックを表示し、機能の有効化前後のデータを比較できます。
構成の詳細とチューニングガイド
設定名 | 説明 | デフォルト値 | 有効値 |
| 接続プール機能を有効または無効にします。 | 0 |
|
| プール内のアイドル接続の存続時間 (TTL) (秒単位)。この時間を超えて使用されないアイドル接続はクローズされます。値 | 60 |
|
| 各プロキシノードが各データノードに対して維持するアイドル接続の最大数。接続が使用されなくなったとき、プール内のアイドル接続数がこの上限に達している場合、接続はプールに戻されずにクローズされます。 | 1000 |
|
| 各プロキシノードが各データノードに対して維持するアイドル接続の最小数。プール内のアイドル接続数がこの値を下回る場合、 | 0 |
|
シナリオベースのチューニング推奨事項
一般的なシナリオ: デフォルトの構成を維持します。ほとんどのサービスに適しています。
高同時実行、短命トランザクションシナリオ (タイムセールなど)
特徴:接続は短時間占有され、借用と返却の操作が頻繁に行われます。
推奨事項:
private_conn_pool_max_idle_per_dbを、ビジネスのピーク時間中の同時リクエスト数をカバーできる値に設定します。これにより、接続の再利用率が最大化され、短命接続へのダウングレードが回避されます。private_conn_idle_time_secにはデフォルト値を使用するか、オフピーク時間中にリソースをより速く解放するために値を小さくします。
長時間ブロッキングサービスシナリオ (キューコンシューマーなど)
特徴:接続は長時間占有され、プールに返却されません。
推奨事項:
private_conn_pool_max_idle_per_dbの値を増やして、同時コンシューマーの数に対応します。private_conn_pool_min_idle_per_dbを、平均同時接続数よりわずかに高い値に設定します。これにより、接続が「プリフェッチ」され、新しいコンシューマーが開始したときの接続確立のレイテンシーが短縮されます。
メモリに敏感なシナリオ、または small インスタンスタイプを使用するシナリオ
特徴:メモリ使用量を厳密に制御する必要があります。
推奨事項:
private_conn_pool_max_idle_per_dbとprivate_conn_pool_min_idle_per_dbの値を小さくします。これにより、短命接続が作成される可能性が高まり、パフォーマンスがわずかに低下する可能性がありますが、データノードのメモリリソースが節約されます。
注意
private_conn_pool_min_idle_per_dbに適切な値を設定する各アイドル接続は、バックエンド DB ノードでいくらかのメモリリソースを消費します。複数のシャードと複数のプロキシノードを持つインスタンスでは、
private_conn_pool_min_idle_per_dbを高い値に設定すると、メモリ使用量が高くなる可能性があります。不要な DB コンテキストの切り替えを避ける
プールからの接続が、異なる DB インデックスにアクセスするクライアントによって再利用される場合、プロキシは
SELECTコマンドを実行してコンテキストを切り替える必要があります。この操作は、DB のペイロードとリクエストのレイテンシーを増加させます。アプリケーションの設計では、すべてのクライアントが同じ DB インデックス (通常は DB 0) を使用するようにしてください。パブリッシュ/サブスクライブコマンドには適用されない
接続プール機能は、
SUBSCRIBEやPSUBSCRIBEなどのパブリッシュ/サブスクライブコマンドには適用されません。これらのコマンドは接続を永続的に占有するため、これらの接続はプールによって管理されません。