コンテンツにスキップ
use-cases / branch-computers-like-git / hero
スナップショット · 開発環境を構築する

Git のようにコンピューターをブランチする

スナップショットは実行中のコンテナを凍結します — ファイルシステム、プロセス、メモリ、開いているファイルディスクリプタ。5 ~ 15 秒で復元します。1 つの POST で別のコンテナにフォークします。コード用のブランチングです。但し、マシン全体に対してです。

スナップショットドキュメント
use-cases / branch-computers-like-git / capture

実際にキャプチャされるもの

2 つのモード。スナップショット時のコンテナの状態で決定。Stateful はすべてをキャプチャ。Stateless はファイルシステムのみ。

実行中のとき作成 1~5 秒 · 復元 5~15 秒

Stateful — 実行中のコンテナ

  • Filesystem (CoW delta)BTRFS reflinks。後続のスナップショットは変更されたブロックのみを保存。
  • プロセスツリー長時間実行されるデーモンは起動時点から再開。ブート時ではなく。
  • メモリ状態Heap、stack、mmaps。RAM ダンプ用に約 4GB の余分なディスク。
  • 開いているファイルディスクリプタローカルソケットと FD は生き残り。リモートピアはそうではない。
  • ターミナルスクロールバックライブ tmux/screen セッションは行の途中から再開。
停止中のとき作成 1~5 秒 · コールドスタート 5~15 秒

Stateless — 停止中のコンテナ

  • Filesystem (CoW delta)Stateful と同じインクリメンタルストレージモデル。
  • プロセスツリーコンテナはキャプチャされたファイルシステムから新しく開始。
  • メモリ状態RAM はダンプされない — ディスクと時間が節約。
  • 開いているファイルディスクリプタコールドスタート時に新しいプロセスによって再度開かれる。
  • データベースファイルPostgres / SQLite はキャプチャされた WAL から復旧。
use-cases / branch-computers-like-git / branch

ブランチは 1 つの HTTP 呼び出し

スナップショットは名前付きエイリアスポイント。/copy はそのいずれかから別のコンテナをスピンアップ — 同じデータ、分かれたタイムライン。

iterm
# 1) ブランチポイントをマーク。
curl -X POST "https://api.hoody.com/api/v1/containers/$CID/snapshots" \
  -H "Authorization: Bearer $HOODY_TOKEN" \
  -d '["alias": "pre-migration", "expiry": 30]'

# 2) 復元 in place — このコンテナをスナップショットに戻す。
curl -X PATCH "https://api.hoody.com/api/v1/containers/$CID/snapshots/pre-migration" \
  -H "Authorization: Bearer $HOODY_TOKEN"

# 3) フォーク — 同じスナップショットから別のコンテナをスポーン。
curl -X POST "https://api.hoody.com/api/v1/containers/$CID/copy" \
  -H "Authorization: Bearer $HOODY_TOKEN" \
  -d '["target_project_id":"prod","name":"experiment-a","source_snapshot":"pre-migration"]'

復元は in place で復元。Copy は独立したコンテナを作成 — 異なるID、異なるタイムライン、オリジナルは実行を続ける。どちらにしろ境界付き。ストレージはインクリメンタルなので安い。

復元フロー復元ウィンドウ · 5~15 秒
0110:00スナップショット取得
0210:14マイグレーション爆発
0310:14:08復元されました
use-cases / branch-computers-like-git / powers

ブランチモデルがアンロックするもの

VM スナップショットでは非実用的で、docker commit では不可能だった 3 つのワークフロー。

  1. 01

    並行実験

    /copy で同じスナップショットから N 個のコンテナをスポーン — 3 つのマイグレーション戦略を並行実行、ウィナーを保持。

  2. 02

    すべての危険なデプロイの事前チェック

    危険な変更の前に POST スナップショット。7 秒の復元はマシン全体のアンドゥボタン。

  3. 03

    耐久性のあるタイムライン

    エイリアスは名前付きブランチポイント。snapshot_count はコンテナ API に。ストレージはインクリメンタルなので、数十を保持するのに安い。

use-cases / branch-computers-like-git / replaces

これが置き換えるもの

悪い変更から復旧するためにこれらを使用する場合、スナップショットモデルは 5~15 秒で同じジョブを 1 つの HTTP 呼び出しで実行しています。

  • VM スナップショット取得に数分、スナップショットあたり GB のディスク
  • vagrantローカルボックス、共有状態なし、リモート復元なし
  • docker commitファイルシステムのみ、プロセス/メモリなし
  • 手動バックアップrsync + 誰も読まない wiki ページ
  • pg_dump サイクルDB のみ、残りのボックスは悪い状態の途中
  • スクラッチから再構築30+ 分、エディタセッションを破壊
use-cases / branch-computers-like-git / cta

Git はコードのブランチングを提供しました。Hoody はコンピュータ全体のブランチングを提供します。

スナップショット API を読む
use-cases / branch-computers-like-git / related

他のユースケースを読む