readysetは、MySQLとPostgresにワイヤ互換なキャッシュ層で、既存データベースの手前に置くだけでクエリを高速化し、読み取りスループットを水平にスケールさせます。SELECT結果をキャッシュとして保持し、元データの変更をレプリケーションストリーム経由で検知して増分更新する点が特徴です。README記載の通り、アプリ側の書き換えやキャッシュ無効化ロジックの手動実装なしに導入できることを謳っています。
リポジトリはRustのワークスペース構成で、mysql-srv・psql-srv・readyset-adapter・readyset-server・replicatorsなど役割ごとにクレートが分かれています。mysql-srvとpsql-srvがMySQL/Postgresのワイヤプロトコルを実装し、アプリからは通常のDB接続に見えるようになっています。readyset-adapterがクエリを受け取ってキャッシュ済みビューを参照し、未キャッシュのクエリは上流DBへ素通しします。replicatorsクレートが上流のレプリケーションストリームを購読し、元データの変更をキャッシュ結果へ増分反映する仕組みです。Cargo.tomlではpostgres・tokio-postgres・mysql_asyncをreadysetteam独自forkに差し替えており、プロトコル拡張やレプリケーション対応のための改造が入っていると推測できます。benchmarksクレートには実際のクエリパターン(join・topk・point_query等)やnews_app・solidusといった模擬アプリのSQL・YAML定義があり、性能検証の作り込みがうかがえます。
- STEP 01
quickstartのcurlスクリプトを実行すると、readysetのセットアップウィザードが起動し、既存のMySQLまたはPostgres接続情報の入力を求められます。
- STEP 02
build/docker-compose.ymlを使ってDocker Composeで起動すると、readyset本体に加えGrafana・Prometheusなど監視スタックのコンテナ群が立ち上がるのを目にします。
- STEP 03
mysqlクライアントやpsqlクライアントでreadysetのポートに接続すると、通常のDB接続と同じ操作感でSHOW READYSET STATUSのような専用コマンドが使えることに気づきます。
- STEP 04
対象クエリに対してCREATE CACHEを実行すると、以降の同じSELECTがキャッシュ経由で返るようになり、Grafanaダッシュボードでヒット率の変化が確認できます。
- STEP 05
benchmarksクレートのworkload_emulatorを実行すると、news_appやsolidusのSQLパターンを使った負荷試験が走り、レイテンシのヒストグラムが出力されます。
- STEP 06
元テーブルにUPDATEを行うと、レプリケーションストリーム経由でキャッシュが自動更新され、明示的なキャッシュクリア操作なしに新しい結果が返ることが確認できます。
手元には、既存のMySQL/Postgresクライアントからそのまま繋げるキャッシュ層バイナリと、キャッシュ状態やクエリ性能を可視化するGrafanaダッシュボード一式が残ります。加えてbenchmarksクレートにより自分のクエリパターンでの性能測定環境も得られます。
ライセンスはBSL 1.1で、4年後にApache 2.0へ移行する条件付きです。商用利用の制約を事前に確認する必要があります。
postgres・tokio-postgres・mysql_asyncなど主要依存がreadyset独自forkに差し替えられており、標準クレートとの挙動差異が発生する可能性があります。
実際のインストールと起動は確認していません。README記載のquickstartスクリプトやDocker Composeの動作を筆者が実行した結果ではない点に留意してください。
本レビューはファイルツリーと一部ソースからの推測を含みます。レプリケーション対応DBの種類やバージョン要件など詳細はソース全体を見ないと断定できません。
既存のMySQL/PostgresアプリにORMや接続文字列をほぼ変えずにキャッシュを挟みたいチーム、特に読み取り負荷でDBがボトルネックになっている構成に向いています。ワークスペース構成・依存フォークの作り込み・benchmarksクレートの充実度から、単なるプロトタイプではなく実運用を意識した設計であることが読み取れます。ただし実機検証はしていないため、本番投入前には自分のクエリパターンでbenchmarksを回して確認することをお勧めします。