概要
PgDog はPostgreSQL向けの プロキシ であり、 接続プーリング・ロードバランシング・シャーディング を一括提供 Rust製 のため、高速・安全・大量接続処理が可能 Kubernetes・AWS・Docker など多様な環境に対応 クロスシャードクエリ・2フェーズコミット・再シャーディング など高度な機能を搭載 アプリ側の修正やDB移行不要、 既存システムに容易導入 できる点が特徴
PgDogとは何か
- PostgreSQL用のネットワークプロキシ であり、 接続プーリング・ロードバランサ・データベースシャーディング を一体化
- Rust で開発されており、 高速性・堅牢性・セキュリティ を両立
- 数千接続 を一般的なサーバで安定処理
- アプリケーション側のコード変更やDBマイグレーション不要
- OSSとして公開、 ドキュメント・Discordコミュニティ も充実
導入とクイックスタート
- Kubernetes:
- Helm Chart で簡単デプロイ
- コマンド例:
- helm repo add pgdogdev https://helm.pgdog.dev
- helm install pgdog pgdogdev/pgdog
- AWS:
- EKSや自己管理Kubernetes でHelm利用
- Terraformモジュール でECSデプロイ対応
- Docker:
- Docker Compose でローカル試用可能
- docker-compose up で起動
- psql等のPostgreSQLクライアントで接続
- デモ環境:
- 3シャード・2シャードテーブルを標準搭載
- INSERT/SELECT例付き
設定と構成ファイル
- 設定ファイル2種:
- pgdog.toml(ホスト・シャーディング等の設定)
- users.toml(ユーザー名・パスワード管理)
- 最小構成例:
- pgdog.tomlでDB・ホスト・ポート指定
- users.tomlでユーザー・DB・パスワード指定
- DBとユーザーの紐付け必須
- ローカル試用時:
- CREATE DATABASE/USERコマンド例あり
接続プーリング
- トランザクション・セッションプーリング に対応
- PgBouncer互換 でありつつ、 SET文や起動オプションも正しく管理
- 自動トランザクションロールバック・接続再同期 など高度な回復機能
- アプリクラッシュ時の接続ストーム対策 として有効
ロードバランサ
- アプリ層(OSI L7)ロードバランサ
- Postgresプロトコルを理解 し、プライマリ・レプリカ間でトランザクションを均等分散
- 戦略3種:
- ラウンドロビン
- ランダム
- 最小アクティブ接続
- 複数ホスト設定時に自動有効化
ヘルスチェック
- リアルタイムでDBホストの健全性監視
- 障害発生時は自動でルーティング変更
- ネットワーク障害・一時的なHW障害・設定ミスにも対応
- DBの可用性最大化
シングルエンドポイント
- pg_query(PostgreSQLネイティブパーサ)搭載 でクエリを解析
- 書き込みはプライマリ、読み込みはレプリカ へ自動振り分け
- アプリは同じPgDogエンドポイントに接続するだけでOK
トランザクションとロードバランス
- 複数文を含むトランザクションはプライマリにルーティング
- クライアントが明示的にREAD ONLY指定可能
- BEGIN READ ONLY; でレプリカに送信
フェイルオーバー
- Postgresレプリケーション状態を監視し、自動で書き込み先切替
- Patroni等のフェイルオーバーオーケストレーションツールと併用可能
- lsn_check_delay等の設定で有効化
シャーディング
- 複数シャードDBの管理が可能
- PostgreSQLパーサを用いシャーディングキー抽出・最適ルーティング
- クロスシャードクエリ時は結果をメモリ上で統合・変換
- シャーディング設定例:
- shard属性でホストごとにシャード番号指定
- 最低1つのシャードテーブルが必要
シャーディングアルゴリズム
- PostgreSQLパーティション関数(HASH, LIST, RANGE)またはスキーマ利用
- パーティションベースシャーディング:
- Postgresソースコード準拠
- postgres_fdw等とも連携可能
- スキーマベースシャーディング:
- スキーマ単位でシャード割当
- search_pathでルーティング制御可能
直接シャードクエリ・クロスシャードクエリ
- シャードキー指定時は単一DBにルーティング
- クロスシャード時は全DBに送信し、結果を統合
- サポート状況:
- 集約関数(count, min, max, avg, stddev, variance)部分対応
- ORDER BY, GROUP BY, マルチタプルINSERT, シャードキーUPDATE対応
- サブクエリ・CTEは全シャードで同一実行
- COPYコマンドもシャード分割対応
一意ID生成・シャードキー更新
- UUID(v4/v7)や独自の一意BIGINT生成関数(pgdog.unique_id())を提供
- シーケンス不要で数百万ID/秒生成可能
- シャードキー更新時は自動でSELECT→INSERT→DELETEを実行
- マルチタプルINSERTも自動シャード分割
再シャーディング・データ同期
- PostgreSQL論理レプリケーションプロトコルを利用
- バックグラウンドでデータ分割・再配置を無停止で実施可能
- 既存DBのシャーディングやシャード追加も容易
運用・特徴
- クロスシャード書き込みも2フェーズコミットで原子性確保
- 全シャード共通の複製テーブル(オムニシャーディング)もサポート
- マルチタプルINSERT・シャードキー変更・一意ID生成もORM互換
- フェイルオーバー時の自動書き込み先切替や、接続プール自動復旧
- 全機能は設定でON/OFF可能・段階的導入支援
- OSSとして開発が進行中・フィードバック歓迎
他製品との比較・差別化
- Citus等のPostgres拡張と比較し、アプリ・DBへの侵襲性が極小
- HAProxy等のロードバランサ不要、PgDog単体で一元管理可能
- ActiveRecordやPrisma等主要ORMとシームレス連携
- マルチスレッドアプリでの接続プール統合によるリソース削減
- パフォーマンス・導入容易性・柔軟性を両立
まとめ・導入検討ポイント
- 高トラフィックアプリケーションのDBボトルネック解消
- 既存システムへの非侵襲的導入
- スケーラビリティ・可用性・運用効率化を実現
- 公式ドキュメント・OSSコミュニティも充実
- 柔軟な設定で段階的な導入・検証が可能