PolarDB はトランザクションレベルのコネクションプーリングをサポートしています。この機能を使用すると、多数の接続によって引き起こされるデータベースの負荷を軽減できます。
前提条件
トランザクションレベルのコネクションプーリング機能では、データベースプロキシがバージョン 2.3.46 以降である必要があります。
背景情報
PolarDB for PostgreSQL は、各接続に専用のプロセスを必要とする接続モデルを使用します。このモデルでは、クライアントが多数の持続的接続を維持したり、頻繁に新しい接続を作成したりすると、データベースの負荷が増加し、パフォーマンスが大幅に低下する可能性があります。
これらのシナリオでパフォーマンスを向上させるために、PolarDB for PostgreSQL はトランザクションレベルのコネクションプーリング機能を提供します。この機能により、複数のフロントエンド接続で単一のバックエンド接続を共有できます。これにより、作成および維持されるバックエンド接続の数が減り、これらのシナリオにおけるデータベースの処理能力が向上します。
仕組み
トランザクションレベルのコネクションプーリングは、データベースへの直接接続の数を減らします。また、短命な接続のシナリオで頻繁な接続作成による負荷も軽減します。
トランザクションレベルのコネクションプーリングを有効にすると、クライアントリクエストはまず PolarDB プロキシに接続します。プロキシはすぐにバックエンドデータベースに接続しません。代わりに、接続プールで利用可能な接続を確認します。その `user`、`dbname`、およびシステム変数の値がリクエストと一致する場合、接続は利用可能です。一致する接続が存在しない場合、プロキシはデータベースへの新しい接続を作成します。一致する接続が存在する場合、プロキシはそれを再利用します。トランザクションが終了すると、接続は次のリクエストのためにプールに戻されます。このプロセスにより、データベースプロキシとデータベース間の接続数が減少します。
トランザクションレベルのコネクションプーリングを有効にすると、クライアントと PolarDB プロキシの間には数千の接続が存在する可能性がありますが、プロキシとバックエンドデータベースの間には数十から数百の接続しか存在しません。
PolarDB プロキシ自体には最大接続制限はありません。接続制限は、バックエンドデータベースの計算ノードの仕様によって決まります。トランザクションレベルのコネクションプーリングが無効になっている場合、クライアントからの各接続は、バックエンドのプライマリノードとすべての読み取り専用ノードに対応する接続を作成します。
使用方法
トランザクションレベルのコネクションプーリングを有効にする
PolarDB コンソールにログインします。
コンソールの左上隅で、クラスターが配置されているリージョンを選択します。
対象のクラスターを見つけて、クラスター ID をクリックします。
[エンドポイント] エリアで、[設定] をクリックします。
[接続プール] で、[トランザクションレベル] をクリックします。
[OK] をクリックします。
トランザクションレベルのコネクションプーリングを無効にする
PolarDB コンソールにログインします。
コンソールの左上隅で、クラスターが配置されているリージョンを選択します。
対象のクラスターを見つけて、クラスター ID をクリックします。
[エンドポイント] エリアで、[設定] をクリックします。
[接続プール] 行で、[シャットダウン] をクリックします。
[OK] をクリックします。
制限事項
トランザクションレベルのコネクションプーリングが有効になっている場合、
CANCELリクエストによってセッションがhang(ハング) する可能性があります。CANCEL機能を使用するには、トランザクションレベルのコネクションプーリングを無効にする必要があります。次の操作を実行すると、接続は閉じられるまでロックされます。ロックされた接続は、他のクライアントが使用するために接続プールに戻されません。
PREPARE文の実行16 MB を超えるような大きなメッセージの送受信
Copy Modeの使用Flush Modeの使用一時テーブル (
Temporary Table)、シーケンス (Sequence)、およびビュー (View)トランザクション中
Cursorの宣言
次の PostgreSQL の機能には、トランザクションレベルのコネクションプーリングとの互換性の問題があります。これらを使用すると、予期しない動作が発生する可能性があります。正しいセマンティクスを確保するには、これらの機能を使用する際にトランザクションレベルのコネクションプーリングを無効にする必要があります。
シーケンス (
Sequence)アプリケーションレベルのロック (
advisory lock)リスナーと通知 (
LISTEN/NOTIFY)Holdable Cursors (
Holdable Cursor)
接続が再利用される可能性があるため、現在の接続に対して
select pg_backend_pid()クエリによって返されるpidが変更されることがあります。接続が再利用される可能性があるため、
pg_stat_activityまたは SQL エクスプローラーに表示される IP アドレスとポートが、クライアントの実際の IP アドレスとポートと一致しない場合があります。
接続プールの選択
トランザクションレベルのコネクションプーリングを有効にするかどうかを判断するには、次の提案を参考にしてください。
アプリケーションが少数の持続的接続を使用している場合、またはすでに効果的な接続プールがある場合は、PolarDB の接続プール機能を有効にする必要はありません。
アプリケーションが多数の接続 (数万など) を使用している場合、またはサーバーのスケールアウトに伴って接続数が線形に増加するサーバーレスサービスの場合は、トランザクションレベルのコネクションプーリングを有効にできます。この機能を有効にする前に、このトピックで説明されている制限事項によってアプリケーションが影響を受けないことを確認してください。