コネクションプーリング: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 = 50Transactionモードの注意点
セッション状態を必要とする機能は動作しなくなります:
- 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- pg_stat_statements:上位クエリ
- ログ分析のためのpgBadger
- コネクションプーリング:PgBouncer
- キャパシティプランニングと肥大化監査