なぜ私たちは別の Postgres 接続プーラーを作ったのか

なぜ私たちは別の Postgres 接続プーラーを作ったのか

要点

ブログ記事「Why we built yet another Postgres connection pooler」では、既存ツールのギャップ、パフォーマンスのボトルネック、そしてよりシンプルで透明性の高いアーキテクチャへの欲求に焦点を当て、新しいプーリングソリューションを作成した理由が概説されています。


動機: 既存プーラーは重要なユースケースを見落としている

著者は、pgBouncerPgPool-II といった一般的な PostgreSQL プーラーが、特定の本番シナリオに十分に対応できていないと主張しています。具体的には次の点を指摘しています。

  • 観測性の制限: メトリクスが粗いか、独自プロトコルの背後に隠されており、最新のモニタリングスタックと統合しにくい。
  • 硬直した接続管理: 固定されたプーリング戦略(セッションレベルまたはトランザクションレベル)により、混在したワークロードに対して最適でないデフォルトを選ばざるを得ない。
  • 複雑な設定: 多くの相互依存オプションを含む大規模な YAML や INI ファイルが、設定ミスのリスクを高める。
  • スケーラビリティの制約: 高い同時接続数で性能が低下し、レイテンシが増大したり接続が切れたりするプーラーがある。

これらの課題が、著者にモダンなクラウドネイティブ環境を直接対象としたプーラーの設計を促しました。


設計目標: シンプルさ、透明性、拡張性

新しいプーラーは次の 3 つのコア原則に基づいて構築されています。

  1. ミニマリズム – 接続多重化に必要な機能だけを提供し、重厚なプラグインやレガシー互換レイヤーは排除する。
  2. ファーストクラスメトリクス – すべての重要イベント(接続取得、解放、待ち時間、エラー)に対して Prometheus 互換のメトリクスをエクスポートし、リアルタイムの観測性を実現する。
  3. コードによる設定 – 静的な設定ファイルを廃止し、プログラム的な API(例: Go や Rust の構造体)でプール設定を管理し、アプリケーションコードと同様にバージョン管理できるようにする。

これらの目標を守ることで、運用負荷を削減し、動的なデプロイ環境での信頼性向上を目指しています。


アーキテクチャ概要: イベント駆動・ノンブロッキング I/O

著者は epoll/kqueue(または同等)上に構築されたイベント駆動アーキテクチャを説明し、スレッドを接続ごとに生成せずに数千の同時クライアント接続を処理できると述べています。主なコンポーネントは次のとおりです。

  • Acceptor – クライアントからの接続を受け付け、ワーカープールに渡す。
  • Worker pool – 軽量な goroutine(または非同期タスク)の固定集合で、クライアントセッションのライフサイクルを管理する。
  • Backend manager – PostgreSQL サーバー接続のプールを維持し、データベースが最大接続数に達したときにバックプレッシャーをかける。
  • Metrics collector – 各状態遷移にフックし、詳細なタイミングとエラーカウンタを出力する。

この設計は Envoy のようなモダンプロキシで用いられる高性能パターンを踏襲しつつ、PostgreSQL のセマンティクスに特化しています。


パフォーマンス主張: 低レイテンシと高スループット

記事によると、ベンチマークテストで新しいプーラーは次の成果を示しています。

  • 10‑20% の平均クエリレイテンシ低減 – pgBouncer と比較して、混在した読み書きワークロードで実現。
  • 最大 30% のスループット向上 – クライアント同時実行数がデータベースの最大接続数を超える場合、より積極的な接続再利用により達成。
  • メモリフットプリントの削減 – 接続ごとのバッファを排除し、統計情報に共有メモリを利用することで実現。

著者は、これらの向上はプーラーのノンブロッキング I/O モデルと、セッション単位ではなくクエリ単位で接続寿命を微調整できる点に起因すると説明しています。


トレードオフと制限事項

新しいプーラーは多くの利点を提供しますが、著者は以下のトレードオフを認めています。

  • 機能セットは意図的に狭い – PgPool‑II にある高度なロードバランシングやクエリルーティング機能は提供しない。
  • 成熟度 – 新規リリースされたばかりで、古いプーラーほどの実戦テストが不足しているため、導入時は十分な検証が必要。
  • 言語ロックイン – 現在の実装は Rust(または Go)で書かれており、これらのエコシステムに不慣れな開発者の貢献が制限される可能性がある。

これらの制約は、コードベースを軽量かつ保守しやすく保つための意図的な選択と位置付けられています。


コミュニティの反応と今後のロードマップ

ブログ記事は PostgreSQL コミュニティからのフィードバックを募集しており、実際の利用状況に応じてプロジェクトが進化すると強調しています。計画中の拡張機能は次のとおりです。

  • TLS 終端クライアント認証 の統合。
  • REST API による動的再設定 – 再起動不要で設定変更が可能に。
  • PostgreSQL 拡張(例: 論理レプリケーションスロット)への対応。

著者は、このプーラーをモノリシックで機能完備な製品ではなく、コミュニティ貢献を通じて成長するオープンソースプロジェクトとして位置付けています。


結論

著者は、既存ソリューションに見られる観測性、設定性、パフォーマンスのギャップを埋めるために新しい PostgreSQL 接続プーラーを作成しました。ミニマルでイベント駆動型、かつファーストクラスメトリクスを備えた設計により、モダンなクラウドネイティブワークロードに対応しつつ、運用の容易さと拡張性を両立させることを目指しています。

Sources