PlanetScaleのNekiが本物のPostgresにシャーディングをもたらす
Nekiは、ただの素のPostgresであるシャードの前にPostgresワイヤプロトコルのルーターを置く。だからドライバーもORMもそのまま動く。プラットフォームプレビューであり、PlanetScaleはまだ本番で動かすなと言っている。

PlanetScaleはNekiをプラットフォームプレビューとしてローンチした。シャード化されたPostgresであり、すべてのシャードは未改変のPostgresクラスタだ。売り文句は狭く具体的だ — 本物のPostgresのセマンティクス、拡張機能、SQLの挙動をそのまま維持し、より大きなマシンを買うのではなくシャードを追加することで水平スケールする。
同社はこれを、PlanetScale Postgresの顧客で繰り返しぶつかってきた問題への答えとして位置づける。チームは単一マシンの余力を食いつぶし、既存の逃げ道はどれも何かを犠牲にする。アプリケーションレベルのシャーディングはルーティングロジックをコードに押し込む。Postgres互換の分散データベースはシャードキーを隠し、拡張機能のサポートを落とし、デバッグしにくいレイテンシを加える。Nekiの賭けは、Postgresワイヤプロトコルを話すルーターならその両方を避けられるというものだ。
アーキテクチャ: 4つの可動部
アプリケーションは標準のPostgresワイヤプロトコルで、単一の接続文字列を使ってNekiルーターに接続する。ルーターは完全なPostgresクエリパーサーと分散クエリプランナーを備える。クエリをパースし、どのシャードが実行すべきかを決め、作業をディスパッチし、結果を1つのストリームにマージする。ルーターは垂直にも水平にもスケールするので、ルーター層自体が固定のボトルネックになるようにはなっていない。
ルーターの背後にあるシャードは完全なPostgresクラスタだ — 1つのプライマリと、3つのアベイラビリティゾーンに分散した少なくとも2つのレプリカ。カスタムストレージエンジンは存在しない。シャードはシャードグループにまとめられ、これにより異なるテーブルやワークロードを別々のシャードセットに置ける。各グループはインスタンスサイズ、レプリカ数、ストレージ、Postgresパラメータ、拡張機能をカバーする独自の設定プロファイルを持つ。
コネクションプーリングはすべてのPostgresインスタンスの隣でサイドカーとして動く。PlanetScaleがデータベースの前にPgBouncerを置くより意味のある改善だと主張するのはこの部分だ。Nekiが接続の両端を握っているため、プロセスの外から推定するのではなく、インスタンスが実際にさばける量に合わせてプールをサイジングできる。
コントロールプレーンはノードの健全性を追跡し、計画的なスイッチオーバーと計画外のフェイルオーバーを実行し、リシャーディング、スキーマ変更、バージョンアップグレードのワークフローを調整する。これらを束ねるのがデータトポロジーだ。論理テーブルを物理シャードにマッピングするJSON設定である。シャードインデックス — Nekiがルーティングに使うカラムとその値のハッシュ方法 — を定義し、さらにテーブルセットがいくつのシャードにまたがるかを制御するシャードグループを定義する。ルーターはトポロジーをキャッシュし、プランのたびに参照する。
オンライン操作と、シャード化しない入口
通常ならメンテナンスウィンドウを意味する作業が、組み込みワークフローとして動く。ターゲットノードのプロビジョニング、レプリケーションによる追いつき、__nekiメタファンクションを通じたトラフィックの切り替え、古いノードの退役 — すべてアプリが使うのと同じpsql接続越しに行われる。このモデルはスキーマ変更、バージョンアップグレード、フェイルオーバー、インポート、リシャーディングをカバーする。
初日からシャード化する必要はない。Nekiは単一プライマリとレプリカとして動き、改善されたプーリング、オンラインDDL、ゼロダウンタイムアップグレード、ヘルスモニタリングを最初から提供する。後からのリシャーディングは、すでに持っているクラスタに対するワークフローだ。Insights、スキーマ推奨、ブランチング、MCPといったPlanetScaleの機能も付いてくる。
プレビューの但し書き
これはプラットフォームプレビューであり、PlanetScaleは明言している。本番ワークロードで動かすな。製品はまだ変化しており、一部の変更は破壊的になる。フィードバックはサポートチケットかDiscordを通じて行う。
Nekiの賭けのすべては、水平スケールと本物のPostgresのどちらかを選ばなくていいはずだという点にある。真剣に受け止めるべきはプレビューというラベルの方だ。
| コンポーネント | 役割 | スケーリングモデル |
|---|---|---|
| Nekiルーター | クエリをパースし、シャードをまたいでプランし、結果をマージする。Postgresワイヤプロトコルを話す | 垂直および水平 |
| シャード | 完全なPostgresクラスタ: 3つのAZにまたがる1プライマリ、少なくとも2レプリカ | シャードを追加 |
| シャードグループ | テーブル/ワークロードを独自のシャードセットにまとめ、グループごとの設定プロファイルを持たせる | グループごとのサイジング |
| コネクションプーリングサイドカー | 外部から推定するのではなく、各Postgresインスタンスの内側からプールをサイジングする | インスタンスごと |
| コントロールプレーン | ヘルス追跡、スイッチオーバー、フェイルオーバー、リシャーディングとアップグレードのワークフロー | マネージド |
| データトポロジー | 論理テーブルを物理シャードとシャードインデックスにマッピングするJSON | ルーターがキャッシュ |
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。