Azure Database for PostgreSQL の PgBouncer - フレキシブル サーバー

適用対象: Azure Database for PostgreSQL - フレキシブル サーバー

Azure Database for PostgreSQL フレキシブル サーバーでは、組み込みの接続プール ソリューションとして PgBouncer が提供されます。 PgBouncer は、データベース サーバーごとに有効にできるオプション機能です。 PgBouncer は、パブリック アクセスとプライベート アクセスの両方のネットワークで、General Purpose とメモリ最適化のコンピューティング レベルでサポートされています。

PgBouncer は、Azure Database for PostgreSQL フレキシブル サーバーのデータベース サーバーとして同じ仮想マシン (VM) で実行されます。 Postgres では接続にプロセスベースのモデルを使用するため、多数のアイドル状態の接続を維持するとコストがかかります。 Postgres では、サーバーで数千を超える接続が実行されると、リソースの制約を受けます。 PgBouncer の主なベネフィットは、データベース サーバーでアイドル状態の接続と短期間の接続を向上させることです。

PgBouncer は、非同期 I/O を利用する軽量モデルを使用しています。 Postgres 接続は必要な時だけ、つまり、未処理のトランザクション内やクエリがアクティブな時だけ使用します。 このモデルでは、低オーバーヘッドで最大 10,000 接続までスケーリングできます。

PgBouncer はデータベース サーバーのポート 6432 で実行されます。 同じホスト名を使用するようにアプリケーションのデータベース接続構成を変更できますが、ポートを 6432 に変更して PgBouncer の使用を開始し、アイドル状態の接続のスケーリングを向上させるというベネフィットを得ることができます。

現在、Azure Database for PostgreSQL フレキシブル サーバーの PgBouncer では、Microsoft Entra 認証をサポートしています。

PgBouncer の有効化と構成

PgBouncer を有効にするには、Azure portal の サーバー パラメーター ウィンドウに移動し、PgBouncer を検索して、pgbouncer.enabled 設定を true に変更します。 サーバーを再起動する必要はありません。

これらのパラメーターを使用して、PgBouncer の設定を構成できます。

Note

次の PgBouncer サーバー パラメーターの一覧は、pgbouncer.enabled サーバー パラメーターが true に設定されている場合にのみ、サーバー パラメーター ウィンドウに表示されます。 それ以外の場合は、意図的に非表示になります。

パラメーター名 説明 Default
pgbouncer.default_pool_size このパラメーター値を、ユーザーとデータベースのペアごとの接続数に設定します。 50
pgbouncer.ignore_startup_parameters PgBouncer が無視できるパラメーターのコンマ区切りのリストを入力します。 たとえば、PgBouncer で extra_float_digits パラメーターを無視させることができます。 一部のパラメーターは許可され、それ以外はすべてエラーになります。 この機能は、スタートアップ パケットで無条件に extra_float_digits=2 を設定する過剰な Java Database Connectivity (JDBC) を許容するために必要です。 使用しているライブラリが pq: unsupported startup parameter: extra_float_digits などのエラーを報告する場合は、このオプションを使用します。
pgbouncer.max_client_conn このパラメーター値を、サポートする必要がある PgBouncer へのクライアント接続の最大数に設定します。 5000
pgbouncer.max_prepared_statements これがゼロ以外の値に設定されている場合、PgBouncer では、クライアントによってトランザクションおよびステートメント プーリング モードで送信された、プロトコル レベルの名前付きで準備済みのステートメント関連コマンドを追跡します。 0
pgbouncer.min_pool_size この数を下回る場合は、プールするサーバー接続をさらに追加します。 0
pgbouncer.pool_mode トランザクション プールについて、このパラメーター値を TRANSACTION に設定します (ほとんどのワークロードで推奨される設定です)。 transaction (トランザクション)
pgbouncer.query_wait_timeout クエリの実行の待機に費やすことができる最大時間 (秒)。 その時間内にクエリがサーバーに割り当てられない場合、クライアントは切断されます。 120
pgbouncer.server_idle_timeout サーバー接続が、この秒数を超えてアイドル状態になっている場合、その接続は切断されます。 0 の場合、タイムアウトは無効になります。 600
pgbouncer.stats_users pgBouncer コンソールで接続して読み取り専用クエリを実行できるデータベース ユーザーのコンマ区切りの一覧。

PgBouncer 構成の詳細については、pgbouncer.ini のドキュメントを参照してください。

次の表は、PostgreSQL の各メジャー バージョンと共に現在デプロイされている PgBouncer のバージョンを示しています:

PostgreSQL 16 PostgreSQL 15 PostgreSQL 14 PostgreSQL 13 PostgreSQL 12 PostgreSQL 11
1.22.1 1.22.1 1.22.1 1.22.1 1.22.1 1.22.1

メリット

Azure Database for PostgreSQL フレキシブル サーバーで組み込みの PgBouncer 機能を使用すると、次のベネフィットを得ることができます。

  • 簡略構成の利便性: PgBouncer は Azure Database for PostgreSQL フレキシブル サーバーと統合されているため、別のインストールや複雑なセットアップは必要ありません。 サーバー パラメーターから直接構成できます。

  • マネージド サービスの信頼性: PgBouncer は、Azure マネージド サービスの利点を提供します。 たとえば、Azure は PgBouncer の更新を管理します。 自動更新により、手動メンテナンスが不要になり、最新の機能とセキュリティ パッチによって PgBouncer を最新の状態に維持できます。

  • さまざまな接続の種類のサポート: Azure Database for PostgreSQL フレキシブル サーバーの PgBouncer では、パブリック接続とプライベート接続の両方がサポートされています。 ご自身の要件に応じてプライベート ネットワーク経由で安全な接続の確立や外部との接続に使用できます。

  • フェールオーバー シナリオでの高可用性: フェールオーバー中にスタンバイ サーバーがプライマリ ロールに昇格された場合、PgBouncer は新しく昇格されたスタンバイ サーバー上でシームレスに再起動します。 アプリケーションの接続文字列を変更する必要はありません。 この機能により、継続的な可用性が確保され、アプリケーションの接続プールの中断が最小限に抑えられます。

PgBouncer の監視

メトリック

Azure Database for PostgreSQL フレキシブル サーバーには、PgBouncer 接続プールを監視するための 6 つのメトリックが追加されました。

[表示名] メトリック ID ユニット description Dimension 既定で有効
アクティブなクライアント接続 (プレビュー) client_connections_active カウント Azure Database for PostgreSQL フレキシブル サーバー接続に関連付けられているクライアントからの接続 DatabaseName いいえ
待機中のクライアント接続 (プレビュー) client_connections_waiting カウント サービスを行うために Azure Database for PostgreSQL フレキシブル サーバー接続を待機しているクライアントからの接続 DatabaseName いいえ
アクティブなサーバー接続 (プレビュー) server_connections_active カウント クライアント接続で使用されている Azure Database for PostgreSQL フレキシブル サーバーへの接続 DatabaseName いいえ
アイドル状態のサーバー接続 (プレビュー) server_connections_idle カウント アイドル状態であり、新しいクライアント接続にサービスを行う準備ができている Azure Database for PostgreSQL フレキシブル サーバーへの接続 DatabaseName いいえ
プールされた接続の合計 (プレビュー) total_pooled_connections カウント プールされた接続の現在の数 DatabaseName いいえ
接続プールの数 (プレビュー) num_pools カウント 接続プールの合計数 DatabaseName いいえ

詳細については、「PgBouncer メトリック」を参照してください。

管理コンソール

PgBouncer には、pgbouncer と呼ばれる内部データベースも用意されています。 その内部データベースに接続すると、PgBouncer の現在の状態に関する情報を提供する SHOW コマンドを実行できます。

pgbouncer データベースに接続する手順は以下の通りです。

  1. pgBouncer.stats_users パラメーターを既存のユーザーの名前 (たとえば myUser) に設定し、変更を適用します。

  2. このユーザーとして pgbouncer データベースに接続し、ポートを 6432 として設定します。

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=myPassword sslmode=require"
    

データベースに接続したら、SHOW コマンドを使用して PgBouncer の統計情報を表示します。

  • SHOW HELP: 使用可能なすべての SHOW コマンドを一覧表示します。
  • SHOW POOLS: プールごとに各状態の接続数を表示します。
  • SHOW DATABASES: 各データベースに適用されている現在の接続制限を表示します。
  • SHOW STATS: すべてのデータベースの要求とトラフィックに関する統計を表示します。

PgBouncer の SHOW コマンドの詳細については、「管理コンソール」を参照してください。

PgBouncer を使用するようにアプリケーションを切り替える

PgBouncer の使用を開始するには、次の手順に従います。

  1. データベース サーバーに接続する際に、通常のポート 5432 の代わりにポート 6432 を使用します。 この接続が機能することを確認します。

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=myPassword sslmode=require"
    
  2. PgBouncer に対して QA 環境でアプリケーションをテストし、互換性の問題がないことを確認します。 PgBouncer プロジェクトでは互換性マトリックスが提供されます。ほとんどのユーザーに、トランザクション プールをお勧めしています。

  3. ポート 5432 ではなくポート 6432 に接続するように運用アプリケーションを変更します。 互換性の問題を示す可能性があるアプリケーション側のエラーを監視します。

ゾーン冗長による高可用性における PgBouncer

ゾーン冗長による高可用性 (HA) サーバーでは、プライマリ サーバーによって PgBouncer が実行されます。 ポート 6432 経由でプライマリ サーバーの PgBouncer に接続できます。 フェールオーバー後、PgBouncer は、新しく昇格されたスタンバイ (新しいプライマリ サーバー) で再起動されます。 そのため、アプリケーションの接続文字列は、フェールオーバー後も同じままです。

PgBouncer を他の接続プールと共に使用する

場合によっては、アプリケーション側の接続プールが既に存在するか、アプリケーション側 (例: Azure Kubernetes Service サイドカーなど) に PgBouncer が設定されている場合があります。 このような場合でも、アイドル状態の接続スケーリングのベネフィットを提供するため、組み込みの PgBouncer 機能は便利です。

アプリケーション側のプールをデータベース サーバー上の PgBouncer と共に使用すると役立つ場合があります。 ここでは、アプリケーション側プールによって、(接続を初期化するためのラウンドトリップが非常に速くなるため) 初期接続の待機時間が短縮されるというベネフィットが得られます。また、データベース側の PgBouncer では、アイドル状態の接続がスケーリングされます。

制限事項

  • PgBouncer の機能は現在、バースト可能なサーバー コンピューティング レベルではサポートされていません。 コンピューティング レベルを General Purpose またはメモリ最適化からバースト可能に変更した場合、組み込みの PgBouncer の機能は失われます。

  • スケール操作中、HA フェールオーバー中、または再起動時にサーバーが再起動されるたびに、PgBouncer とサーバー仮想マシンも再起動されます。 その後、既存の接続を再確立する必要があります。

  • ポータルには PgBouncer パラメーターがすべて表示されません。 PgBouncer を有効にしてパラメーターを保存したら、[サーバー パラメーター] ウィンドウを閉じて (例: [概要] を選択するなど)、[サーバー パラメーター] ウィンドウに戻る必要があります。

  • トランザクションおよびステートメント プール モードは、準備済みステートメントと共に使用することはできません。 選択したプール モードの他の制限事項を確認するには、「PgBouncer のドキュメント」を参照してください。

  • PgBouncer が機能としてデプロイされている場合、単一障害点になる可能性があります。 PgBouncer 機能がダウンすると、データベース接続プール全体が中断され、アプリケーションのダウンタイムが生じる可能性があります。 単一障害点を軽減するには、ロード バランサーの背後に複数の PgBouncer インスタンスを設定して Azure VM で高可用性を実現します。

  • PgBouncer は、シングル スレッド アーキテクチャを使用する軽量なアプリケーションです。 この設計は、ほとんどのアプリケーション ワークロードに適しています。 ただし、有効期間の短い接続が多数作成されるアプリケーションでは、この設計が pgBouncer のパフォーマンスに影響を与え、アプリケーションをスケーリングする機能が制限される可能性があります。 次のいずれかの方法を試す必要がある場合があります。

    • Azure VM 上の複数の PgBouncer インスタンスに接続負荷を分散します。
    • Azure VM 上で、PgCat などのマルチスレッド ソリューションを含む代替ソリューションを検討します。

重要

Azure Database for PostgreSQL フレキシブルサーバーで、組み込みの PgBouncer 機能のパラメータ pgbouncer.client_tls_sslmode が非推奨になりました。

require_secure_transport サーバー パラメータを ON に設定して、Azure Database for PostgreSQL フレキシブル サーバーへの接続に TLS/SSL を適用すると、組み込みの PgBouncer 機能への接続に TLS/SSL が自動的に適用されます。 この設定は、新しい Azure Database for PostgreSQL フレキシブル サーバー インスタンスを作成し、組み込みの PgBouncer 機能を有効にすると既定でオンになります。 詳細については、「プライベート アクセスを使用した Azure Database for PostgreSQL - フレキシブル サーバーのネットワークの概要」を参照してください。

簡素化された管理、組み込みの高可用性、コンテナ化されたアプリケーションとの簡単な接続、および最も一般的な構成パラメーターの使用を必要とするお客様には、組み込みの PgBouncer 機能が最適な選択肢です。 マルチスレッドのスケーラビリティ、すべてのパラメーターの完全な制御、およびデバッグ エクスペリエンスを必要とするお客様は、Azure VM 上で PgBouncer を設定する方法が選択肢になる場合があります。

次のステップ