2025/07/21 11:26 We made Postgres writes faster, but it broke replication

やっほー、ロボ子!今日のITニュースはParadeDBの`pg_search`の話じゃ。Postgresの拡張機能で検索を高速化するやつじゃな。

博士、こんにちは。`pg_search`ですか。検索エンジンのようなものですね。

そうそう!で、彼らは書き込み速度を上げるためにLSM treeを使ったんじゃと。RocksDBとかCassandraで使われるデータ構造じゃ。

LSM treeは、ランダムな書き込みをシーケンシャルな書き込みに変換するんでしたね。でも、それがPostgresのレプリケーションを壊すって、どういうことですか?

そこが面白いところじゃ!PostgresはWAL (Write-Ahead Log) shippingでレプリケーションしてるんじゃが、LSM treeみたいな複雑なデータ構造だと、それだけじゃ安全性を保証できないんじゃ。

WAL shippingだけでは不十分、ですか。物理的な整合性と論理的な整合性の両方が必要になるんでしょうか?

その通り!物理的な整合性っていうのは、レプリカに構造的に有効なデータが入ってるかってことじゃ。論理的な整合性は、レプリカのデータがデータベースの一貫した状態を反映してるかってことじゃな。

なるほど。LSM treeを使うと、複数のバッファにまたがる操作が発生しやすくなるから、アトミックな操作が必要になるんですね。

そうじゃ!Postgresのロックはレプリカでリプレイされないから、アトミックじゃないとデータが壊れる可能性があるんじゃ。`pg_search`では、Copy-on-Write (CoW) クローンを使って、アトミックにヘッドをスワップしてるらしいぞ。

Copy-on-Writeですか。それと、VACUUMの問題もあるんですね。スタンバイが古いタプルを誤ってVACUUMすると、論理的な不整合が起きる、と。

そうそう!LSM treeはコンパクションが頻繁に発生するから、VACUUMの問題が顕著になるんじゃ。そこで、彼らはHot Standby Feedbackを使ったんじゃ。

Hot Standby Feedbackは、スタンバイがプライマリに安全にクリーンアップできるデータを通知する機能ですね。スタンバイがアクティブなクエリでピン留めしている最小のxminをプライマリに伝えるんでしたか。

その通り!プライマリはその情報を使って、クリーンアップのタイミングを調整するんじゃ。これで、物理的にも論理的にも整合性が保たれるってわけじゃな。

すごいですね。LSM treeを使いつつ、Postgresのレプリケーションの安全性を保つために、色々な工夫がされているんですね。

じゃろ?ParadeDBは、アトミックにログ記録されたLSM treeを実装し、`hot_standby_feedback`を利用して、物理的および論理的な整合性を実現したんじゃ。これぞ、エンジニアリングの力!

勉強になります!ところで博士、LSM treeって、まるで玉ねぎみたいですね。剥いても剥いても層が出てくる…

うむ、ロボ子、上手いこと言うのじゃ!でも、玉ねぎと違って、LSM treeは剥いても涙は出ないぞ!…たぶん。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
