概要
PgDog はPostgresのスケーリング用プロキシで、 従来のコネクションプーラーの課題 を解決 SET文やLISTEN/NOTIFY など重要なPostgres機能の互換性を確保 Tokioベースのマルチスレッド化 で高効率・高スループットを実現 アプリ変更不要 で既存コードを活かしたままスケール可能 オープンソース かつ自由に利用・改変・デプロイが可能
PgDog: なぜ新しいPostgresコネクションプーラーが必要か
- PgDog はPostgresのための新しい コネクションプーラー兼プロキシ
- 既存の代表的なコネクションプーラー: PgBouncer, RDS Proxy, Pgpool-II, Supavisor
- 従来のプーラーは "leaky abstraction"(抽象化の漏れ) 問題が発生
- インフラ追加により アプリケーションコードの大幅な変更 が必要になる場合
- 特に SET文やセッション変数 に依存したアプリで顕著
セッション状態とSET文の課題
- 従来のプーラーでは セッション制御(SET文) が機能しなくなる
- コネクション再利用時に 状態が他クライアントへ漏れる リスク
- 例: statement_timeout や Row Level Security (RLS) の誤動作
- 結果として SET文の利用禁止 が推奨される現状
- コネクション再利用時に 状態が他クライアントへ漏れる リスク
- PgDog は独自の SQLパーサー でSET文を検出・管理
- 各クライアントごとに 変数名・値を保存 し、必要時に自動同期
- クエリパイプライン で複数変数も効率的に更新
- Postgres本来の機能を犠牲にせず、そのままスケールが可能
LISTEN/NOTIFYの完全対応
- LISTEN/NOTIFY はPostgres内蔵の pub/subキュー
- 従来プーラーでは トランザクションモード利用時に非対応
- PgDog は内部で両コマンドを処理し、 複数プロセス間でメッセージ転送
- Tokioのbroadcast channel で同一プロセス内のクライアント間通信
- 専用コネクション 経由でPostgresと全プロセスを接続
- Postgresをブローカー としつつ、PgDogがpub/subクライアントとして機能
- NOTIFYのトランザクションセマンティクスも完全維持
マルチスレッド設計とスケーラビリティ
- PgDogはTokio上で動作 し、 マルチスレッド対応
- 各クライアントごとに 非同期タスク を割り当て
- CPUコア数分だけ直線的にスケール
- PgBouncerのSO_REUSEPORTやRDS Proxyのオートスケール との違い
- 従来は 各プロセスごとに独立したコネクションプール が必要
- クライアントは一度接続すると インスタンス移動不可
- オーバーロード時に 他クライアントも巻き込まれる
- PgDogは1プロセスで多くのクライアントを効率的に捌く
- バーストトラフィックにも柔軟対応 し、 低レイテンシ維持
- 運用もシンプル で、 メトリクスやヘルスチェックも一元管理
- 従来は 各プロセスごとに独立したコネクションプール が必要
PgDogの特徴とメリット
- 20年の歴史あるPgBouncerに代わる新世代コネクションプーラー
- 2M QPS超の本番運用実績
- オープンソース で、 自由な利用・改変・デプロイ が可能
- 既存アプリの大規模改修不要 で導入可能
- Postgresの主要機能を犠牲にしない 設計
まとめ
- PgDog は従来のコネクションプーラーの課題を解決し、 本来のPostgresの機能を活かしつつスケール
- 大規模・高負荷環境での運用 や、 既存コードベースの維持 に最適
- エンジニアの負担軽減 と 運用の簡素化 を実現