sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL接続プール:パート2 – PgBouncer

    PostgreSQLの世界での接続プールに関しては、PgBouncerがおそらく最も人気のあるオプションです。これは、データベースとクライアントの間に位置し、PostgreSQLサーバーをエミュレートするPostgreSQLプロトコルを話すという非常にシンプルなユーティリティです。クライアントは、PostgreSQLに直接接続するときに使用するのとまったく同じ構文でPgBouncerに接続します。PgBouncerは基本的に見えません。

    PgBouncerは、ほぼすべてのPostgreSQL DBaaSベンダーによってサポートされており、コミュニティ全体で広く使用されています。このブログ投稿では、PgBouncerがどのように機能するか、PgBouncerを使用することの長所と短所、および接続プールを設定する方法について説明します。一般的な接続プールについて詳しく知りたい場合、またはそれがデプロイメントに適しているかどうか疑問に思っている場合は、PostgreSQL接続プール:パート1 –長所と短所の投稿を確認してください。

    PostgreSQL接続プールシリーズ

    • パート1-長所と短所
    • パート2 – PgBouncer
    • パート3 – Pgpool-II
    • パート4 –PgBouncerとPgpool-II

    PgBouncerはどのように機能しますか?

    PgBouncerはクライアント接続を受信すると、最初にPostgreSQLサーバーに代わって認証を実行します。 PgBouncerは、ホストベースのアクセス構成を含む、PostgreSQLサーバーがサポートするすべての認証メカニズムをサポートします(注:PgBouncerを介してレプリケーション接続をルーティングすることはできません)。パスワードが提供されている場合、認証は2つの方法で実行できます。

    1. PgBouncerは最初にuserslist.txtファイルをチェックします–このファイルは、(ユーザー名、md5暗号化パスワード)タプルのセットを指定します。このファイルにユーザー名が存在する場合、パスワードは指定された値と照合されます。 PostgreSQLサーバーへの接続は確立されていません。
    2. パススルー認証が設定されていて、userslist.txtファイルにユーザーが見つからない場合、PgBouncerはauth_queryを検索します。事前定義されたユーザー(パスワードはuserslist.txtファイルに存在する必要があります)としてPostgreSQLに接続し、auth-queryを実行してユーザーのパスワードを検索し、指定された値と照合します。

    認証が成功したら:

    1. PgBouncerは、同じユーザー名とデータベースの組み合わせで、キャッシュされた接続をチェックします。
    2. キャッシュされた接続が見つかった場合、クライアントに接続を返します。
    3. キャッシュされた接続が見つからない場合、新しい接続を作成しない限り、新しい接続が作成されます。
      • 接続数を増やして>pool_size
      • クライアントからの接続数を>max_client_connectionsに増やします
      • データベースへの接続数を>max_db_connectionsに増やします
      • ユーザーからの接続数を>max_user_connectionsに増やします
    4. これらの値はすべて、PgBouncer設定で定義できます。
    5. 新しい接続を作成すると設定に違反する場合、max_client_connectionsの制限に違反している場合を除き、PgBouncerは新しい接続が作成されるまで接続をキューに入れます。
      注–認証後の手順のタイミングは、PgBouncerモードによって若干異なります。トランザクションまたはステートメントプーリングモードでは、認証後の手順は、クライアントがトランザクション/ステートメントの実行を開始したときにのみ実行されます。プーリングモードについては、以下で詳しく説明します。
    6. max_client_connectionsの制限に違反している場合、接続を中止します。

    プーリングに基づくモードの場合、PgBouncerは接続をデータベースに戻す機会を待ちます:

    • セッションプーリングモードでは、クライアントがセッションを閉じたときにのみ接続がプールに返されます。
    • トランザクションプーリングモードでは、クライアントがトランザクションを完了したとき(通常はロールバックまたはコミットが実行されたとき)にのみ接続がプールに返されます。その結果、このモードではセッションベースの機能はサポートされません。同じクライアントで実行された2つのトランザクションPgBouncer接続が同じPgBouncerサーバー接続で実行されるという保証はありません。
    • ステートメントプーリングモードでは、ステートメントが実行されるとすぐに接続がプールに返されます。ここでは、自動コミットは常にオンになっています。

    接続をデータベースに戻す前に、PgBouncerはリセットクエリを実行してすべてのセッション情報を削除します。これにより、クライアント間で接続を安全に共有できます。アプリケーションのニーズに基づいてこのクエリを構成することができます。

    トランザクションプーリングモードが最も頻繁に使用されますが、セッションプーリングモードは特定のワークロードに役立つ場合があります。 PgBouncerの詳細については、Wikiページを参照してください。

    PostgreSQL接続プール:パート2 – PgBouncerClick To Tweet

    PgBouncerを選択する理由

    PostgreSQLでの接続プールに関して、PgBouncerが最も一般的な選択肢である理由はたくさんあります。 PgBouncerが提供する最高の機能と長所のいくつかを次に示します。

    • プーリングモード –接続がプールに返されるタイミングをユーザーが決定できるようにすることで、PgBouncerは幅広いユースケースをサポートできます。また、この設定はプールレベルで行われるため、通常のデータベース接続にはトランザクションモード(パフォーマンスの向上)を使用でき、プリペアドステートメントなどの機能が必要な場合にのみセッションモードを使用できます。
    • 簡単なセットアップと使用 – PgBouncerは、すぐにセットアップできるPostgreSQL接続プーラーの1つであり、クライアント側のコードを変更する必要もありません。
    • パススルー認証 – PgBouncerは、パスワード(プレーンテキストまたは暗号化された形式)にアクセスせずにユーザーを安全に認証できる数少ない「ミドルウェア」接続プーラーの1つです。これにより、PgBouncerの安全性が高まり、保守がはるかに簡単になります。ユーザーがパスワードを更新するたびにPgBouncerを更新する必要はありません。
    • 軽量 –これは単一のプロセスであり、クライアントからのすべてのコマンドとサーバーからの応答は、処理なしでPgBouncerを通過します。そのため、コンテンツ全体を一度に「見る」必要がないため、メモリフットプリントが非常に小さくなります。
    • スケーラビリティとパフォーマンス –シリーズの最後の部分で詳しく説明するように、PgBouncerは、PostgreSQLサーバーがサポートできる1秒あたりのトランザクション数を大幅に改善でき、非常に多くのクライアントに対応できます。

    PgBouncerは何をしませんか?

    PgBouncerは優れた接続プーラーですが、自動負荷分散や高可用性をサポートしていません。 HAProxyなどの他の一般的なLinuxツールを使用して、これらの機能をサポートするアーキテクチャを作成することをお勧めします。

    以下の負荷分散読み取りのサンプルPostgreSQLアーキテクチャをご覧ください:

    注–マスターノード(これらすべてのスレーブから複製されます)は図に示されていません。

    PgBouncerの設定方法

    ScaleGrid PostgreSQLを導入している場合は、数回クリックするだけでPgBouncerを設定できます。 PostgreSQLクラスターの詳細ビューに移動し、PgBouncerアイコンをクリックします。 [PgBouncerを有効にする]を選択すると、プールモードとプールサイズをカスタマイズするための構成オプションが表示されます。デフォルトを受け入れることができ(心配しないでください。ダウンタイムなしでいつでも変更できます)、[有効にする]をクリックします。

    これで完了です。行ってもいいです。

    ScaleGrid以外のデプロイメントがある場合、PgBouncerはPostgreSQLリポジトリの一部として配布され、それぞれのパッケージマネージャーを使用してインストールできます。より詳細な手順について、またはソースからビルドするには、ブログの手順に従うことができます。

    インストール後、PgBouncerを起動して実行するには、いくつかの構成パラメータを設定するだけで済みます。

    1. クライアントを認証するための(ユーザー名、md5暗号化パスワード)のリスト、またはより安全な展開のためのパススルー認証設定。
    2. 着信接続をリッスンするインターフェイス/IP:ポート。
    3. プールの定義。 「プール」は、クライアントがPgBouncerに接続するときにデータベース名として使用する名前であり、完全な接続文字列(ホスト、ポート、dbname、およびユーザー)にマップできます。最も単純な定義は次の形式です。
      * = host=
      これにより、dbnameとuserの組み合わせごとに動的プールが作成され、ユーザーが指定したポート、dbname、およびユーザー名を使用して、定義されたホストに接続します。

    これで完了です。 PgBouncerを使用すると、非常に迅速に稼働させることができます。ただし、本番環境の配布に合わせて調整する必要のある設定は他にもたくさんあります。これらはこのブログ投稿の範囲を超えていますが、このPgBouncer構成の概要で詳細を確認できます。

    ただし、PostgreSQL接続プールのオプションはPgBouncerだけではありません。次の投稿では、おそらくメインであるPgpool-IIについて説明します。 PgBouncerの競合相手。 PgBouncerとPgpool-IIを比較するこの4部構成のシリーズの4番目の投稿にご期待ください。


    1. PostgreSQLで継承されたテーブルを使用するのはいつですか?

    2. Windows上のPython3でMySQLに接続するにはどうすればよいですか?

    3. SQLServerのTempDBファイルの場所の変更

    4. Oracleは最新の日付レコードを選択します