HN🔥 170
💬 38

アプリ改修なしでPostgresをスケールさせる「PgDog」:DBシャード化の決定版

levkk
3か月前

ディスカッション (1件)

0
levkkOP🔥 170
3か月前

皆さん、こんにちは!PgDogの開発者であるLevとJustinです。PgDog(https://pgdog.dev/ )は、PostgreSQL向けのコネクションプーラー、ロードバランサー、そしてデータベース・シャーダーです。高トラフィックなアプリを運用しているエンジニアなら、一番先にボトルネックになるのがデータベースだとご存知でしょう。私たちはこの問題を、アプリケーションのコード変更や複雑なマイグレーションを一切必要としないネットワークプロキシで解決しました。去年の投稿:https://news.ycombinator.com/item?id=44099187 。今回の最大のアップデートは、実運用環境(プロダクション)での稼働が始まったことです。シャーディング機能は非常に安定しており、クエリごとに1つのシャードを叩く処理はほぼ問題なく動作します。クロスシャード(複数DB)クエリも開発を進めており、大きな進捗がありました。count()、min()、max()、avg()、stddev()、variance()といった集計関数は、アプリ側をいじることなくそのまま利用可能です。PgDogが通信の途中で計算を行い、不足している情報を取得するためにクエリを透過的に書き換えます。例えば、複数DBにまたがる平均計算では、合計値を得るために必要なcount()をクエリに自動挿入し、アプリに返す行からはその値を削除してくれます。ソートやグループ化、DISTINCTも、結果セットに含まれるカラムであれば対応済み。タイムスタンプや整数型、varcharなど10種類以上のデータ型をサポートしています。スキーマ変更(CREATE/DROP/ALTER)を含むクロスシャード書き込みは、2フェーズコミットにより全シャード間でアトミックかつ同期的に実行されます。ORMをパッチするような無理な作業は不要です。PgDogがCOMMIT文を横取りして、自動的にPREPARE TRANSACTIONとCOMMIT PREPAREDに変換します。また、全シャードで同一データを持つ「Omnisharded(レプリケート)」テーブルも、アトミックな読み書きをサポート。これは、シャード化しきれない共通データを同期し続けるために不可欠です。マルチタプルINSERT(INSERT INTO table_x VALUES ($1, $2), ($3, $4))もクエリリライターが分解し、各シャードへ自動振り分けします。PrismaやSequelizeなどのORMもそのまま使えます。さらに、シャードキーの更新もSELECT、INSERT、DELETEの3クエリに自動分割・統合され、行の移動が透過的に行われます。Citusを使っている方も、ぜひ一度比較してみてください。UUIDではなく整数型のプライマリキーを好む方のために、PgDog内部にクロスシャードで一意なシーケンス生成機能を組み込みました。Postgresの関数のように呼び出せ、ActiveRecordのようなORMでも値が自動挿入されます。毎秒400万個の生成が可能で、約70年枯渇しないため、急いでUUIDv7に移行する必要はありません。コード例:INSERT INTO my_table (id, created_at) VALUES (pgdog.unique_id(), now());。リシャーディング機能も組み込み済みで、論理レプリケーションストリームを並列化することで、毎秒数GB単位でのテーブル移動が可能です。これは画期的です!かつてInstacartで10TBのデータを移動した際は2週間かかりましたが、今なら数時間で完了します。ロードバランサーとしても優秀で、RDS/Aurora/Cloud SQLなどで、SELECT pg_is_in_recovery()を用いてレプリカを監視し、フェイルオーバー時に自動で追従します。HAProxyはもう不要です。また、SELECT FOR UPDATEやCTEを含む複雑なクエリも処理可能で、クエリコメントやコネクションパラメータを使って読み取り/書き込みを明示的にルーティングすることも可能です。PgDogを使えば複数のコネクションプールを1つに統合できるため、Python/Ruby/Goなどのマルチスレッドアプリでは、メモリ使用量、I/O、コンテキストスイッチのオーバーヘッドを大幅に削減できます。コネクション接続時の異常な負荷(Connection Storm)に対しても、PgDogは途中のトランザクションを安全にロールバックし、異常なコネクションを排除して正常状態に戻すため、DBのCPU負荷を抑えられます。PgDogはオープンソースです。フィードバックやコントリビューションを心よりお待ちしています!詳細はドキュメント(https://docs.pgdog.dev )をチェックしてください。ハッピー・ハッキング!