AI

オープンソースデータベースプロキシ比較:PgBouncer vs ProxySQL vs Pgpool-II で接続を最適化する

オープンソースラボ編集部2026年6月13日

オープンソースデータベースプロキシ比較:PgBouncer vs ProxySQL vs Pgpool-II で接続を最適化する

大量の同時接続がデータベースのパフォーマンスをボトルネックにすることがあります。データベースプロキシを使うと、コネクションプーリング・クエリキャッシュ・ロードバランシング・フェイルオーバーを実現でき、アプリサイドのコード変更なしにスケールアウトできます。

データベースプロキシが必要な理由

PostgreSQL/MySQLはコネクションごとにプロセス/スレッドを生成するため、数千の同時接続でメモリとCPUが枯渇します。プロキシは以下を解決します:

  • コネクションプーリング: 100クライアント→10DBコネクションに圧縮
  • ロードバランシング: 読み取りをレプリカに分散
  • クエリキャッシュ: 同じSELECTを繰り返しDBに投げない
  • 自動フェイルオーバー: プライマリ障害時にレプリカへ切り替え

主要ツールの概要

PgBouncer

PostgreSQL専用の超軽量コネクションプーラーです。シングルバイナリで数MBのメモリしか使わず、GitHubやHerokuなど大規模プロダクションで実績があります。

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

[pgbouncer]
listen_port = 6432
listen_addr = 0.0.0.0
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt

# pool_mode の選択
# session   - 1接続を1セッション中保持(最も安全)
# transaction - トランザクション単位で接続を返却(高スループット・推奨)
# statement  - 文単位(トランザクション不可・特殊用途)
pool_mode = transaction
max_client_conn = 10000
default_pool_size = 25
server_idle_timeout = 600
# Dockerで起動
docker run -d   -p 6432:6432   -v ./pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini   -v ./userlist.txt:/etc/pgbouncer/userlist.txt   edoburu/pgbouncer

# 統計情報の確認
psql -p 6432 -U pgbouncer pgbouncer -c "SHOW STATS;"
psql -p 6432 -U pgbouncer pgbouncer -c "SHOW POOLS;"

ProxySQL

MySQL/MariaDB向けの高機能プロキシです。クエリルーティング・クエリキャッシュ・マルチプレクシング・リードレプリカへの自動振り分けを提供します。

# Dockerで起動
docker run -d   --name proxysql   -p 6033:6033   -p 6032:6032   proxysql/proxysql

# 管理インターフェースに接続
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt "ProxySQL Admin> "
-- MySQLサーバーを登録
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES
  (0, 'mysql-primary', 3306, 100),    -- 書き込みグループ
  (1, 'mysql-replica1', 3306, 100),   -- 読み取りグループ
  (1, 'mysql-replica2', 3306, 100);

-- クエリルールの設定(SELECTをレプリカへ)
INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, apply)
  VALUES (1, '^SELECT', 1, 1);

-- 変更を反映
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

Pgpool-II

PostgreSQLのコネクションプーリング・ロードバランシング・レプリケーション・フェイルオーバーを統合したプロキシです。PgBouncerより機能が多い分、設定が複雑です。

# 自動フェイルオーバーを含む設定
backend_hostname0 = 'pg-primary'
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'pg-replica1'
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'

load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

# WATCHDOGで高可用性プロキシクラスター
use_watchdog = on
wd_hostname = 'pgpool-1'
wd_port = 9000

機能比較表

比較項目PgBouncerProxySQLPgpool-II
対応DBPostgreSQL専用MySQL/MariaDBPostgreSQL専用
コネクションプーリング✅ 高性能
クエリルーティング✅ 高機能
クエリキャッシュ
読み書き分離
自動フェイルオーバー
並列クエリ
設定の容易さ★★★★★★★★☆☆★★☆☆☆
メモリ使用量極小(数MB)中程度中程度
実績・普及★★★★★★★★★☆★★★☆☆
ライセンスISCGPL 3.0BSD
GitHub Stars6k+6k+2k+

Kubernetes環境でのデプロイ

# PgBouncerをKubernetesでデプロイ
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgbouncer
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: pgbouncer
        image: edoburu/pgbouncer
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url
        - name: POOL_MODE
          value: "transaction"
        - name: MAX_CLIENT_CONN
          value: "5000"
        ports:
        - containerPort: 5432
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "500m"

データベース管理ツールはDevOpsカテゴリ(/categories/devops)で一覧でき、セキュリティ関連ツールはセキュリティカテゴリ(/categories/security)でも探せます。

FAQ

Q. PgBouncerのpool_modeはどれを選べばいいですか?

A. 通常はtransactionモードを推奨します。sessionモードはDBコネクションをセッション全体で保持するため、プーリングの効果が低いです。transactionモードはトランザクション終了後にコネクションをプールに返却します。ただしSET文・LISTEN/NOTIFY・プリペアドステートメント(サーバー側)が一部制限されます。statementモードはトランザクションを使わないクエリのみが対象で、非常に特殊な用途です。

Q. ProxySQLのクエリキャッシュはRedisとどう違いますか?

A. ProxySQLのクエリキャッシュはDBレイヤーで自動的に機能し、アプリコードの変更が不要です。Redisはアプリがキャッシュロジックを実装する必要があります。ただしProxySQLのキャッシュはクエリの完全一致が前提で、Redisのようにキャッシュを明示的に無効化(PURGE)するAPIはありません。本番ではProxySQLのキャッシュをウォームアップ用途に、メインキャッシュはRedisで管理するのが一般的です。

Q. PgBouncerとPgpool-IIを同時に使うことはできますか?

A. 可能ですが、通常は必要ありません。PgBouncerをコネクションプーラーとして配置し、その背後にPgpool-IIでレプリカへのロードバランシングを設定するアーキテクチャは存在します。ただし設定の複雑さが増すため、最初はPgBouncerだけで始め、読み書き分離が必要になった時点でHAProxy等を追加する方が管理しやすいです。

Q. RDS・Cloud SQLなどマネージドDBでもプロキシは必要ですか?

A. RDS Proxyなどクラウドネイティブのプロキシが提供されており、コネクションプーリングの問題の多くはそちらで解決できます。ただし料金が追加でかかること・設定の自由度が低いこと・マルチクラウド構成では使えないことが理由で、オープンソースプロキシを選ぶケースも多いです。

Q. MaxScaleはProxySQLと比べてどうですか?

A. MariaDB MaxScaleもMySQLプロキシの有力な選択肢です。ProxySQLと同等以上の機能を持ちますが、ライセンスがBSL(Business Source License)でいくつかの商用利用に制限があります。オープンソースのみを使いたい場合はProxySQLを選ぶことが多いです。

まとめ

ユースケース推奨ツール
PostgreSQLコネクションプーリングPgBouncer
MySQL読み書き分離・クエリルーティングProxySQL
PostgreSQLHA・フェイルオーバーPgpool-II
Kubernetes環境での導入容易性PgBouncer

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。