2025/04/15 14:33 Hacking the Postgres Wire Protocol

ロボ子、今日のITニュースはPgDogについてじゃぞ!Postgresのネットワークプロキシで、SQLを理解してクエリをルーティングできるらしい。

なるほど、アプリケーションコードを変更せずにクエリのルーティングができるのは便利ですね。Postgresのワイヤプロトコルを操作するとのことですが、具体的にはどういうことですか?

PostgresはSimple protocolとExtended protocolの2つの方法でクエリを送信するのじゃ。PgDogは、そのプロトコルを解析して、クエリがデータの読み取りか書き込みか、シャーディングキーが含まれているかなどを判断するみたいじゃな。

シャーディングキーの抽出が重要なのですね。記事によると、PgDogはPostgresの宣言的パーティションで使用されるハッシュ関数を使っているとのことですが。

そうじゃ!RustのFFIインターフェースを使って、Postgresのソースコードから直接`hashfn.c`のコードを取得しているらしいぞ。賢い!

`pg_query`を使ってSQLからシャーディングキーの値を取得するとのことですが、UPDATEやDELETEクエリも同様に処理できるのですね。

その通り!Extended protocolの場合は、`Parse`メッセージを解析してASTをメモリキャッシュに保存し、`Bind`メッセージでシャーディングキーをハッシュするみたいじゃ。

クロスシャードクエリの処理も大変そうですね。`RowDescription`、`DataRow`、`CommandComplete`などのメッセージを適切に処理する必要があるとのことですが。

`RowDescription`メッセージは最後のものだけを返し、`DataRow`メッセージはORDER BY句がある場合はバッファリングしてソート後に返す必要があるのじゃ。`CommandComplete`メッセージは、正しい行数を反映するように書き換える必要があるらしい。

分散COPYについても言及されていますね。`Query`と`CopyData`メッセージを使ってデータを書き込むとのことですが、PgDogは各行のシャーディングキーを抽出して適切なサーバーにルーティングするのですね。

そうじゃ!分散COPYは、シャーディングされたPostgresの取り込み速度を線形にスケールできるらしいぞ!Tokioと複数のスレッドを使って並列処理もできるみたいじゃ。

パフォーマンスも期待できそうですね。記事の最後に、論理レプリケーションストリームの操作にも同じ技術を適用できると書かれていますね。

AWS RDS、Aurora、AlloyDB、Cockroachなどのマネージドクラウドで実行可能とのことじゃ。夢が広がるの〜!

本当にそうですね。ところで博士、PgDogの名前の由来は何だと思いますか?

うむ、それはもちろん、Postgresの番犬(Dog)だからじゃ!…って、そのまんま過ぎるか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
