クラスタープロキシモードのコネクションプールは、プロキシから 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 個の接続で済みます。
ワークフロー:
-
クライアントが専用モードのリクエストを開始すると、プロキシはターゲットシャードのコネクションプールからアイドル接続を取得します。
-
プールヒット: アイドル接続がリクエストのためにクライアント接続にアタッチされます。完了後、接続はデタッチされ、再利用のためにプールに戻されます。
-
プールミス: プロキシは新しい接続を作成します。リクエスト完了後:
-
プールが上限 (
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を設定し、接続をプリフェッチして新しいコンシューマーのレイテンシを削減します。
-
-
メモリに制約がある、または小規模なインスタンスのシナリオ
-
特徴: 厳格なメモリ予算。
-
推奨:
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コマンドには適用されません。これらのコマンドは接続を永続的に占有し、プールによって管理されません。