DBAtlas · データベース運用アトラス

PgBouncerのpool_modeの選択と基本的なサイジング

PostgreSQLPgBouncer

コマンド

; /etc/pgbouncer/pgbouncer.ini
[databases]
appdb = host=<primary_host> port=5432 dbname=appdb pool_mode=transaction
reportdb = host=<primary_host> port=5432 dbname=appdb pool_mode=session

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 5000
default_pool_size = 20
reserve_pool_size = 5
max_prepared_statements = 200
query_wait_timeout = 120

概要

sessionモードはクライアントを接続の存続期間中1つのサーバー接続に結び付ける。transactionモードはトランザクションの間だけサーバー接続を割り当て、数十のPostgreSQL接続で数千のクライアントに対応する。statementモードはクエリごとに接続を返却し、複数文のトランザクションを許可しない。pool_modeはデータベースごとに上書きすることもできる。

使用する場面

多数の短命な接続を開くOLTP/マイクロサービスアプリケーションにはtransactionモード。セッション状態に依存する処理(レポート、マイグレーション、LISTENを使用するサービス)にはsessionモード。

注意

transactionモードでは、トランザクション間でセッション状態が保持されない: SET(SET LOCALを除く)、セッションレベルのアドバイザリロック、LISTEN、WITH HOLDカーソル、トランザクションをまたぐ一時表、SQLレベルのPREPAREは信頼できない。プロトコルレベルのプリペアドステートメントは、PgBouncer 1.21以降かつmax_prepared_statements > 0(1.24以降デフォルト200、それ以前は0)の場合のみサポートされる。default_pool_sizeに(データベース、ユーザー)ペア数を掛けた値が、PostgreSQLのmax_connections(superuser_reserved_connectionsのマージンを除く)を超えてはならない。

DBAtlas で開く →

関連項目