kisenon

ブランチ

Kisenon におけるコピーオンライトの Postgres ブランチ — LSN でのフォーク、ライフサイクル、カスケード。

ブランチ は、プロジェクトのストレージ内のログシーケンス番号(LSN)への ポインタです。作成は O(1) の行挿入であり、データをコピーしません。ブランチは書き込む につれて分岐し、差分のみが保存されます。

モデル

すべてのプロジェクトは作成時から main ブランチを持ちます。main(または既存の 任意のブランチ)から新しいブランチをフォークできます。

  • HEAD で — 新しいブランチは親の現在の LSN から始まります。
  • 特定の LSN で — 新しいブランチは、親の WAL 保持ウィンドウ内の過去の LSN から 始まります。これが「タイムトラベル」のケースです。WAL がまだ保持されている限り、過去 のある時点からブランチを切り出せます。

ブランチでの読み取りは、ブランチが分岐するまで親のページにフォールスルーします。書き込み は差分のみを記録します。その結果は次のとおりです。

  • 10 個の小さなブランチを持つ 100 GB のプロジェクトは、合計で約 100 GB として課金され ます。
  • ブランチの生成はサブ秒です。
  • ブランチは使い捨てです。破壊的なマイグレーションを実行し、ブランチを捨てても、親は 影響を受けません。

命名

ブランチ名はユーザーに見えるラベルで、親プロジェクトにスコープされます。制約はプロジェク ト名と同じです。

  • 1〜63 文字。
  • ^[a-zA-Z][a-zA-Z0-9_-]*$
  • プロジェクト内で一意。

内部のブランチ id(br_<24 hex>)が安定した参照です。API に対してスクリプトを書くときは 名前ではなく id を使ってください。名前はリネームできます。

ステートマシン

ブランチは次の状態を遷移します。

creating → ready → deleting → deleted
  • creating — コントロールプレーンがブランチをストレージ層に登録しています。通常は サブ秒ですが、ストレージに負荷がかかっているとより長くかかります。
  • ready — ブランチをエンドポイントにアタッチでき、書き込みを受け付けます。
  • deleting — カスケード進行中:このブランチ上のすべてのエンドポイントが停止・削除 されています。
  • deleted — 終端状態。行は短期間、監査のために保持され、その後ガベージコレクション されます。

CLI はすべてのブランチの現在の状態を表示します。

keon branches list --project <project-id>

作成

keon branches create --project <project-id> --name my-feature --parent main

過去の LSN でブランチを切るには、--parent-lsn <lsn> を渡します。

keon branches create \
  --project <project-id> \
  --name pre-migration \
  --parent main \
  --parent-lsn 0/1A2B3C4D

LSN はプロジェクトの WAL 保持ウィンドウ内になければなりません。すでにコンパクションで 過去に追いやられている場合、ブランチの作成は失敗します。

削除

ブランチを削除すると、それにアタッチされているすべてのエンドポイントへカスケードします。

  1. ブランチ上のすべてのエンドポイントが停止・削除されます。
  2. ブランチ自体が取り壊されます。
  3. ストレージは pageserver のコンパクションによって非同期に回収されます。
keon branches delete <branch-id>

プロジェクトの main ブランチは削除できません。代わりにプロジェクトを削除してください。 他のブランチは子を持っていても削除できます。その場合、子は削除されたブランチの親に、 削除 LSN の時点で再ペアレントされます。

リセットとリストア

コンソールのブランチ詳細ページから、 アクションメニューは、ルート以外の任意の ブランチに対して 2 つの再フォーク操作を提供します。

  • 親へリセット — ブランチを親の 現在の HEAD で再フォークします。元のフォーク以降 にブランチで行われたすべての書き込みは破棄されます。スワップ中、ブランチ上のエンド ポイントは一時的にサスペンドします。
  • 特定時点へリストア — 選択した LSN または UTC タイムスタンプ(RFC 3339)でブランチ を再フォークします。その時点以降の書き込みは破棄されます。

どちらも非同期に実行されます。コンソールがリクエストを発行し、再フォークが完了すると ブランチは ready に戻ります。ルート(main)ブランチはリセットできません。リセット する先の親がないためです。

スナップショット

スナップショット は特定時点の LSN をピン留めし、WAL 保持の地平線を越えてもリストア 可能な状態を保ちます。スナップショットがなければ、リストア対象はその WAL がまだ保持され ている間しか到達できません。スナップショットはその時点を無期限にアドレス可能なまま保ちま す。

ブランチ詳細ページの スナップショット タブは、ブランチのスナップショットを一覧表示 し、新しいものをキャプチャできます。各行は次を提供します。

  • リストア — スナップショットがピン留めした LSN でブランチを再フォークします。
  • 削除 — スナップショットを破棄します(基となる LSN はもはやピン留めされず、コン パクションによって回収される場合があります)。

関連

  • プロジェクト — ブランチを所有するもの。
  • エンドポイント — クライアントトラフィックを受け付けるためにブランチ にアタッチするもの。
  • コンセプト — ブランチを無料にするストレージ/コンピュートの分離。