
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
フランクフルトの 200GB の Postgres バックアップ。シンガポールの新しいボックス。S3 のラウンドトリップをスキップ。1 つの curl が pg_dump を Hoody パイプ URL にパイプ; 反対側の 1 つの curl が直接 psql にストリーム。バイトは飛行中で、決して停止しない。
200GB · ホップゼロ · 保持ゼロ
Hoody Pipe は HTTP サーバー上の名前付きパス。送信側がそこにストリームを PUT し、受信側が同じパスを GET し、サーバーは 2 つを継ぎ合わせる。ディスクには何も書かれない; パイプは設計上 0 バイトを保持する。
ソースボックスから、pg_dump | gzip | curl -T - をパイプ URL に。PUT ボディは TCP のバックプレッシャーが許す限り高速にストリーミング。サーバーは同じパスに受信側が現れるまでコネクションを保持する。
PUT /api/v1/pipe/migration受信側の GET が同じパスに到着すると、Hoody はアップロードのバイトをダウンロードのレスポンスに直接スプライスする。バッファなし、オンディスクのステージングなし、非同期コミットなし — 2 つの HTTP ソケット間の直接ストリームのみ。
ディスク 0 バイト宛先ボックスから、curl がパスを GET し、レスポンスを gunzip | psql 経由でパイプ。受信側のストリームは送信側の最後のバイトが届いた瞬間に終わる。再試行なし、マニフェストなし、クリーンアップなし。
GET /api/v1/pipe/migrationコネクションの順序は問題ではない — 受信側は最初に curl して送信側が接続するまでブロックできる (またはその逆)、5 分のパイプ TTL まで。バックプレッシャーはエンドツーエンドで流れる: 遅い psql はソースの curl をスロットリングする。あふれるキューはない、なぜならキューがないから。
これらは擬似コードではない。2 つのサーバーで 2 つのターミナルを開き、それぞれ 1 つを実行し、200GB のバックアップが 1 つのクラウドを離れて別のクラウドに着地するのを見る。
PUT (curl -T) は curl がストリームをアップロードしたい方法なので推奨される。POST も同じように動作 — 同じパス、同じステータスメッセージ。同じダンプを多くの受信側にファンアウトする必要がある場合は両側で ?n=N を使用。
3 台目のラップトップが ?progress 付きで同じパイプ URL を開き、毎秒バイト数、ETA、接続済み受信側のリアルタイム SSE フィードを取得する。観戦は受信側スロットを消費しない — 50 人のチームメイトが n の値を変更したり転送に干渉したりすることなくマイグレーションを観察できる。
S3 のラウンドトリップはホワイトボード上ではシンプルに見える。本番では、すべて秒単位で課金される可動部品のスタック。パイプはスタック全体をトランスポート自体に折りたたむ。
S3、GCS、Azure Blob — ラウンドトリップは、バイトを置く場所が他になかったから存在しただけ。パイプはパスだ。プロビジョニングしたり、ライフサイクルルールを設定したり、後でスクラブしたりするバケットはない。
アップロードのエグレス、ダウンロードのエグレス — 2 倍。パイプではバイトはフランクフルトを離れ、1 ホップでシンガポールに到着する。明日削除するストレージにではなく、コネクションが開いていた秒に支払っている。
あなたの監視はすでに HTTP を理解している。VPN、ファイアウォール、監査ログも。新しい IAM アイデンティティなし、新しい SDK なし、新しい失敗モードなし — curl コマンドだ。
速度はエンドツーエンドで遅い方のリンクで制限される (フランクフルトのエグレス、シンガポールのイングレス、TCP ウィンドウ)。Hoody のパイプは 0 バイトを保持する — サーバーサイドストレージはなく、バックプレッシャーは 2 つのエンドポイント間で直接流れる。
2 つのターミナル、1 つの URL、3 番目のストレージレイヤーなし。
マイグレーション全体は cat file | wc -l と同じ形をしている。2 つのパイプがたまたま異なるデータセンターに住んでいるという事実は、URL の実装の詳細だ。
ストリーミングする HTTP パスを誰も持っていなかったから存在するだけのもの。パイプはデータマイグレーションスタック全体を両側で 1 つの curl に折りたたむ。
バケットをスキップしよう。トランスポートは URL だ。