
2026/07/08 0:36
なぜ、もう一つの Postgres コンネクションプーラーを作ったのか
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026年7月6日、PgDog は、PostgreSQL クライアントプーリングツール(PgBouncer、RDS Proxy、Pgpool-II、Supavisor など)に内在する「漏洩的抽象化」の課題を解決するための革新的なオープンソースプロキシを導入しました。従来のプーラーは、セッション状態の漏洩(例:
SET コマンドが他のクライアントに影響を与えること)を引き起こしたり、-row レベルセキュリティやトランザクショナルな LISTEN/NOTIFY コマンドといった重要な機能を無効化を強制する必要がある場合があり、これには侵入的なアプリケーションコードの変更を必要とします。
一方、async Tokio ワーカーを採用した Rust アーキテクチャに基づく PgDog は、クライアントの状態を厳密に独立して維持します。これは、組み込みの SQL パーサーを利用し、クエリのパイプライン化を通じてシングルラウンドトリップ内でクライアントとサーバー間のセッション状態の不整合を自動的に検出・修正することにより実現されます。これにより、RLS や LISTEN/NOTIFY セマンティクスなどの高度な機能を損なわずに性能を維持することが可能になります。マルチスレッドワーカーを採用し、各クライアントが専用の非同期タスクで処理されるため、PgDog は接続数に対して線形にスケールし、プーリングのシャーディング化や特定のインスタンスへのクライアント固定を回避します。
現在、2 億回以上のクエリ/秒を処理しており、突発的なトラフィック増加中に完全なデータベース性能を実現を求める組織向けに、堅牢な代替手段を提供しています。Linux カーネルまたは AWS RDS の制約に依存する複雑なインフラ構成とは異なり、PgDog はマルチスレッドプロセスで制御を統合し、必要なメトリックやヘルスチェックの数を削減することで、コード変更なしですべて無料でどこでもデプロイ可能なソリューションを提供します。
本文
PgDog: PostgreSQL スケーリングのための次世代プロキシツール
2026 年 7 月 6 日現在、PostgreSQL(以下、Postgres)のスケーリングを支援する新しいプロキシツール「PgDog」が登場しました。既存の解決策には不備がありましたが、PgDog はそれらを克服し、より効率的な接続プーリングを実現します。
1. なぜ PgDog を開発したのか?:「漏れのある抽象化」との戦い
Postgres エコシステムには、「UNIX の哲学」(一つのことでよく行う)を掲げる信頼性の高いツールが多く存在します。代表的なものとしては以下のものがあります。
- PgBouncer: 最も広く愛用されている接続プーラ
- RDS Proxy: AWS RDS 向けのプロキシ
- Pgpool-II: プール機能を持つデータベース管理システム
- Supavisor: スーパーバイザ機能を含むツール
これらのツールは「機能する(Works)」点で優れた実装ですが、業界用語で**「漏れのある抽象化(Leaky Abstractions)」**の問題を抱えています。
既存ツールがもたらす妥協とリスク
- アプリケーションコードの変更が必要: インフラとして PgBouncer などを追加すると、データベースへの接続方法や運用邏輯を変更させられます。
- 実装コストの増加: アプリケーション開発に長い期間を要するケースでは、数千行に及ぶ本番環境のコードを改修する必要があり、テストカバレッジが極めて低下します。
- SET 命令の不具合: 接続プーラはクライアント間での接続リユースを行うため、片方のクライアントで設定したセッション状態(例:
命令による一時オーバーライド)が他のクライアントへ「漏れ」てしまいます。SET
PgDog のアプローチ
これらの問題はもはや必要ありません。PgDog は以下のメカニズムにより、既存の Postgres 機能を制限せずともスケーリングを実現します。
2. セッション状態(Connection State)の完全制御
Postgres においては、クエリパフォーマンス向上やセキュリティ設定のために**
SET 命令**を頻繁に使用します。
-- スロークエリ用のタイムアウト設定例 SET statement_timeout TO '5m'; SELECT * FROM users WHERE banned IS true;
既存ツールの限界
接続プーラがセッション状態を共有する際、以下の深刻なリスクが生じます。
- スロークエリの連鎖: あるクライアントで長時間実行されるクエリが、他のクライアントのタイムアウト設定に影響を与え、データベース全体への負荷イベントを引き起こす可能性があります。
- RLS(行レベルセキュリティ)の機能不全: セッション変数に依存する RLS ポリシーが誤作動し、必要な行が沈黙して消失してしまう最悪のケースが発生します。
そのため、過去には接続プーリングへ移行する際の一般的なアドバイスとして**「
SET 命令を使用しないこと」**が推奨されていました。これは機能を制限せざるを得ない妥協策でした。
PgDog の解決策
PgDog は組み込み SQL パーサを内蔵し、
SET ステートメントを自動的に処理します。
- 自動検出と保存: クエリの中から
ステートメントを検出し、変数名と値を抽出して各クライアント接続でプロキシ側に保持します。SET - 動的同期: クライアントがクエリを実行する際、サーバーの状態とプロキシの持つ状態が一致するか確認します。
- 自動更新: 不一致の場合、一連の
ステートメントを実行して即時に状態を同期させます。SET
- 高パフォーマンス検出アルゴリズム: 複数の変数が異なる場合でも、ワンラウンドトリップで全更新を実現するためのクエリパイプラインング(Query Pipelining)技術を採用しています。
- 成果: パフォーマンスへの影響を最小限に抑えつつ、Postgres の本機能(RLS など)を継続利用できます。
3. LISTEN / NOTIFY 命令の実装
PostgreSQL が提供する公開・購読(Publish/Subscribe)機能である
LISTEN と NOTIFY は、追加データベースなしで動作する強力な仕組みです。
課題と解決
従来のプーラでは、特にトランザクションモード使用时にこの機能をサポートできなかったため、多くの開発者が SQS や Redis への移行を検討していました(PostgreSQL 10 がリリースされた 2017 年以降の開発で重要視される機能)。
PgDog はこれを内部で完全に実装しました。
- ブローカーとしての振る舞い: クライアントにとって PgDog がブローカーのように見えますが、バックエンドでは元の Postgres を使用しています。
- プロセス間通信: 複数の PgDog プロセス(通常は複数コンテナ)で動作する場合も、専用の接続を通じてすべてのメッセージを Postgres に転送します。
- 同じプロセス内: Tokio のブロードキャストチャネルを使用。
- 異なるプロセス間: 専用接続経由での送信。
これは、Pub/Sub クライアントとして機能しつつ、他のクライアントもプロキシ化し、Postgres をブローカーとして再利用する、クリエイティブなエンジニアリングの事例です。
- トランザクションセマンティクスの保持: 友人たちのデータベースダウンを引き起こした過去の課題に対し、トランザクション的な性質を厳格に守るよう修正を加えています。
4. マルチスレッド(Multithreading)による拡張性
PgDog は Rust の非同時ランタイムであるTokioをベースに構築されており、マルチスレッドワーカーを搭載しています。
アーキテクチャの特徴
- クライアントごとの独立処理: 各クライアントは独自の非同時タスクで処理され、接続数と線形にスケーリングします。
- CPU コアの活用: 複数のコアを同時に使用するため、1 つのプロセスからより多くのクエリを毎秒処理可能になります。
なぜマルチスレッドが重要なのか?
既存ツールとの比較により、その必要性が明確になります。
| 機能 | PgBouncer / RDS Proxy | PgDog (マルチスレッド) |
|---|---|---|
| シャーディング | 必須: プロキシごとに専用接続セットが必要。過負荷時の影響が全体に及ぶリスクあり。 | 不要: 柔軟な分散処理が可能。 |
| トラフィック処理 | リソース制限によりボトルネックになりやすい。 | はるかに多くのトラフィックを処理可能。 |
| スケーリング効率 | サーバー接続数が増えるが、クライアント密度が低い。 | 少ない接続数で多くのクライアントをプーリング可能。 |
| 急増負荷への対応 | 自動スケーリング待ちが発生しやすく、レイテンシ増加リスクあり。 | 瞬時に対処可能。SLA(サービスレベル契約)を守れる。 |
運用面でのメリット
- 複雑性の低下: マルチスレッドプロセスの管理ランブックが簡潔になります。
- 一元管理: 計測指標やヘルスチェックのソースが単一となり、Linux カーネルや AWS RDS コントロールプレーンなどのデバッグ困難な領域への依存を減らせます。
5. 結論
20 年以上にわたり存在してきた PgBouncer を置き換えるのは容易ではありませんが、PgDog は「あるべき姿」において不備を修正したツールです。
- 実績: 現在から 1 年以上前から本番環境で稼働中。毎秒 200 万件のクエリに対する接続プーリングに成功しています。
- オープンソース: 使用・改変の自由を含むライセンスであり、コードは無料で公開されています。
- 柔軟なデプロイ: 任意の環境に導入可能で、既存の Postgres インフラを破壊せず、スケーリングのための機能を「通り越してスムーズに動作」させます。
PgDog は、Postgres の機能制限を強要することなく、マルチスレッド技術と高度な SQL パーシングにより、現代的なスケーリング要件を満たすための最適解となります。