0Pricing
SQL Academy · レッスン

コネクションプーリング:PgBouncer

PgBouncerをトランザクションプーリングモードで実行し、プールサイズを適切に設定して、プリペアドステートメントの落とし穴を避けます。

「コネクションプーリング:PgBouncer」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

接続をプールする理由

Postgresの接続はそれぞれ個別のOSプロセスであり、メモリとCPUを大量に消費します。リクエストごとに接続を開閉するアプリケーションは、すぐにサーバーのリソースを使い果たします。プーリングを使うと、少数の長時間使用する接続を再利用できます。

接続ごとのコスト

Postgresの一般的なバックエンドは5〜10 MBのRAMを使用します。500接続では、バックエンドだけで約5 GBのRAMが必要です。PgBouncerを使うと、数千のクライアントを50個のバックエンド接続に多重化できます。

3つのプーリングモード

  • Session — クライアントがセッション全体で専用の接続を取得します
  • Transaction — トランザクションごとに接続を取得します
  • Statement — ステートメントごとに接続を取得します(ほとんど使用されません)

Transactionモード(推奨)

各トランザクションがサーバー接続を1つ取得します。同じクライアントでも、トランザクションごとに異なる接続を使用する場合があります。

# pgbouncer.ini
[databases]
mydb = host=primary port=5432 dbname=mydb

[pgbouncer]
pool_mode = transaction
listen_port = 6432
max_client_conn = 1000
default_pool_size = 50

Transactionモードの注意点

セッション状態を必要とする機能は動作しなくなります:

  • Prepared statement(呼び出し間で同じバックエンドを必要とします)
  • SET LOCAL ...(トランザクション単位なら問題ありませんが、SET ...でトランザクションをまたいで状態を保持することはできません)
  • LISTEN / NOTIFY(永続的な接続を必要とします)
  • トランザクション終了後も存続するカーソル

Sessionモード

Transactionモードでアプリケーションが動作しない場合に使用します。ただし、同時接続できるクライアント数は少なくなります。

プールのサイズ設定

経験則では、default_pool_size ≈ vCPU count × 2 + spindlesです。大きすぎるとコンテキストスイッチによってスループットが低下し、小さすぎるとプールでの待ち時間が発生します。

HAProxyの前段にPgBouncerを配置する

一般的な本番環境の構成:

App → HAProxy (read/write routing) → PgBouncer (pooling) → Postgres

TransactionモードでのPrepared statement

最近のPgBouncer(1.21以降)は、TransactionモードでプロトコルレベルのPrepared statementをサポートしています。古いバージョンでは、simple queryまたはSessionモードを使用してください。

PgBouncerを監視する

管理用データベース(特殊なデータベース)に接続します:

psql -p 6432 -U pgbouncer pgbouncer

-- Commands:
SHOW STATS;
SHOW POOLS;
SHOW CLIENTS;
SHOW SERVERS;

代替手段

  • pgpool-II — プーリング、ロードバランシング、クエリ書き換え
  • Odyssey — Yandexのプールマネージャー、マルチスレッド対応
  • ドライバー側のプール — 通常はPgBouncerと組み合わせてクラスタ全体のプーリングに使用

アプリケーションプールとPgBouncer

アプリケーションは通常、独自の接続プール(HikariCP、pgxpool)を実行し、さらにPgBouncerを経由します。2層のプーリングです。アプリケーションプールはPgBouncerへの接続を維持し、PgBouncerはそれらをPostgresへの接続に多重化します。

まとめ

ある程度以上の規模では、PgBouncerは不可欠です。

  • Transactionモードが標準です
  • Prepared statement、SET、LISTENに注意してください
  • プールサイズはvCPU × 2程度です
  • SHOW POOLSで監視してください

確認問題

最も少ないサーバー接続に、最も多くのクライアントを多重化できるPgBouncerのモードはどれでしょうか。

よくある質問

「コネクションプーリング:PgBouncer」レッスンは無料ですか?

はい。「コネクションプーリング:PgBouncer」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「コネクションプーリング:PgBouncer」で何を学びますか?

PgBouncerをトランザクションプーリングモードで実行し、プールサイズを適切に設定して、プリペアドステートメントの落とし穴を避けます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「コネクションプーリング:PgBouncer」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. pg_stat_statements:上位クエリ
  2. ログ分析のためのpgBadger
  3. コネクションプーリング:PgBouncer
  4. キャパシティプランニングと肥大化監査
← SQL Academyに戻る