次の方法で共有


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 では接続にプロセスベースのモデルを使用するため、多数のアイドル状態の接続を維持するとコストがかかります。 サーバーで数千を超える接続が実行されている場合、Postgre はリソースの制約を受けます。 PgBouncer の主なベネフィットは、データベース サーバーでアイドル状態の接続と短期間の接続を向上させることです。

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

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

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

PgBouncer を有効にして構成する

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

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

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

パラメーターの名前 説明 既定値
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 で、許容範囲は 1 から 50,000 です。 5,000
pgbouncer.max_prepared_statements (最大準備済みステートメント数) これがゼロ以外の値に設定されている場合、PgBouncer では、クライアントによってトランザクションおよびステートメント プーリング モードで送信された、プロトコル レベルの名前付きで準備済みのステートメント関連コマンドを追跡します。 0
pgbouncer.min_pool_size この数を下回る場合は、プールするサーバー接続をさらに追加します。 0
pgbouncer.pool_mode トランザクション プールのために、このパラメーター値を TRANSACTION に設定します (ほとんどのワークロードで推奨される設定です)。 トランザクション
pgbouncer.query_wait_timeout クエリの実行の待機に費やすことができる最大時間 (秒)。 その時間内にクエリがサーバーに割り当てられない場合、クライアントは切断されます。 120
pgbouncer.server_idle_timeoutパラメータは、サーバーがアイドル状態で待機する最大時間を設定します。 サーバー接続のアイドル状態がこの秒数を超えている場合、その接続は切断されます。 0 の場合、タイムアウトは無効になります。 600
pgbouncer.stats_users pgBouncer コンソールでの接続と読み取り専用クエリの実行が許可されている、データベース ユーザーのコンマ区切りのリスト。

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

PgBouncer のバージョン

現在、Azure Database for PostgreSQL フレキシブル サーバーで、サポートされているすべてのメジャー バージョンのエンジン (17 (プレビュー)、16、15、14、13、12、11) にデプロイされている PgBouncer のバージョンは、1.22.1 です。

メリット

Azure Database for PostgreSQL フレキシブル サーバーで組み込みの PgBouncer 機能を使用すると、次のような利点があります。

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

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

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

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

PgBouncer の監視

メトリック

PgBouncer メトリックを使用すると、アクティブな接続の詳細、アイドル接続、プールされた接続の合計数、接続プールの数など、PgBouncer プロセスのパフォーマンスを監視できます。 各メトリックは "1 分" 間隔で出力され、最大 "93 日分" の履歴が保持されます。 ユーザーは、メトリックに関するアラートを構成でき、新しいメトリック ディメンションにアクセスして、データベース名ごとにメトリック データを分割およびフィルター処理することもできます。

PgBouncer メトリックを有効にする方法

  • PgBouncer メトリックを監視するには、サーバー パラメーター pgbouncer.enabledを使用して pgbouncer 機能が有効になっており、メトリック パラメーター metrics.pgbouncer_diagnosticsが有効になっていることを確認します。
  • これらのパラメーターは動的であり、インスタンスの再起動は必要ありません。
  • PgBouncer メトリックは既定で無効になっています。

PgBouncer メトリックの一覧

表示名 メトリック ID 単位 説明 ディメンション 既定で有効
アクティブなクライアント接続 client_connections_active Azure Database for PostgreSQL フレキシブル サーバー接続に関連付けられているクライアントからの接続。 データベース名 いいえ
クライアント接続の待機中 client_connections_waiting サービスを行うために Azure Database for PostgreSQL フレキシブル サーバー接続を待機しているクライアントからの接続。 データベース名 いいえ
アクティブなサーバー接続 server_connections_active クライアント接続によって使用されている Azure Database for PostgreSQL フレキシブル サーバーへの接続。 データベース名 いいえ
アイドル状態のサーバー接続数 server_connections_idle アイドル状態であり、新しいクライアント接続にサービスを行う準備ができている Azure Database for PostgreSQL フレキシブル サーバーへの接続。 データベース名 いいえ
プールされた合計接続数 total_pooled_connections プールされた接続の現在の数。 データベース名 いいえ
接続プールの数 num_pools 接続プールの合計数。 データベース名 いいえ

PgBouncer メトリックの使用に関する考慮事項

  • DatabaseName ディメンションを使用する PgBouncer メトリックには、"30 データベース" の制限があります。
  • "バースト可能" SKU での制限は、DatabaseName ディメンションを使用する 10 個のデータベースです。
  • DatabaseName ディメンションの制限が、データベースの作成順序を反映する OID 列に対し適用されます。

詳細については、「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=<password> 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=<password> 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 の現在のバージョンでは、トランザクション モード内の準備されたステートメントのサポートが追加されています。 このサポートは、 max_prepared_statements パラメーターを使用して有効にして構成できます。 このパラメーターを既定値である 0 より上に設定すると、準備されたステートメントのサポートが有効になります。 このサポートは、プロトコル レベルの準備済みステートメントにのみ適用されます。 ほとんどのプログラミング言語において、これは、クライアントで libpq 関数である PQprepare を使用し、PgBouncer が正しく解釈できないテキストを送信する PREPARE proc AS のような動的 SQL コマンドを発行するのではなく、PgBouncer がインターセプトできるプロトコル レベルのコマンドを送信することを意味します。 選択したプール モードの他の制限事項を確認するには、PgBouncer のドキュメントを参照してください。

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

  • Azure AD 認証でのトークン サイズ制限 - グループ メンバーシップの数が多いユーザーは、トークン サイズの制限のため、PgBouncer 経由で接続できません。 少数のグループを持つアプリケーション、サービス、ユーザーの場合に機能します。

  • 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 フレキシブル サーバーでの TLS と SSL を使用したセキュリティで保護された接続」を参照してください。

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