インフラ・DevOps
Show HN: ZeroFS – S3向けのログ構造ファイルシステム
Show HN: ZeroFS – A log-structured filesystem for S3 (zerofs.net)
要約
ZeroFSは、S3互換バケットをNFSや9P経由でPOSIXファイルシステムとして、またはNBD経由で生のブロックデバイスとして提供するログ構造ファイルシステムです。データはアップロード前に圧縮・暗号化され、ホットリードはローカルキャッシュからマイクロ秒単位で返されます。堅牢なテストスイートと高可用性機能を備え、クラウドストレージをローカルファイルシステムのように扱えるようにします。
全文翻訳
S3向けのログ構造ファイルシステム。
ZeroFSは、S3互換バケットをNFSおよび9P経由でPOSIXファイルシステムとして、またはNBD経由で生のブロックデバイスとして提供します。
エンジンはログ構造です。書き込みは不変のオブジェクトとして行われ、コンパクションによって削除された領域が回収されます。
データはアップロード前に圧縮および暗号化され、ホットリードはローカルキャッシュからマイクロ秒単位で返されます。
apt dnf curl コピ クイックスタート → またはDocker経由 · GitHub Action · その他のプラットフォーム
8,662 POSIXスイートテストをCIで実行
1.6 µs ホットキャッシュからのランダムリード
0.83 ms 小規模書き込みの平均レイテンシ
16 EiB 最大ファイルシステムサイズ
1 pjdftstest は変更ごとに実行されます。NFS/9Pでは表現できないセマンティクスを必要とするいくつかのケースは除外されています。リストはリポジトリで公開されています。
2 SQLiteベンチマーク、ローカルキャッシュから提供されるZeroFSでのランダムリード。生のS3ラウンドトリップは50〜300ミリ秒です。
3 NFS経由でのファイル追記、ZeroFSベンチマークスイート。データはS3に保存されます。
4 設計によりアドレス指定可能: 64ビットinodeおよびサイズフィールド、32 KiBエクステント。
01検証
テストスイートは公開CIで実行されます。
CIは変更ごとにpjdfstest、xfstests、カーネルビルド、stress-ng、ZFSスクラブ、Jepsenのlocal-fsスイート、およびJepsenのフェイルオーバースイートを実行します。
最初の3つは、NFS、9P、およびFUSEクライアントで個別に実行されます。
各カードはCIパイプラインへのリンクです。
POSIXセマンティクス
pjdfstestスイートは、変更ごとにプロトコルごとに実行されます。パーミッション、所有権、リンク、リネームの動作。
除外リスト(プロトコルごとに数ケース)はリポジトリで公開されています。
pjdfstestワークフロー →
xfstests
カーネルファイルシステムテストスイートは、NFS、9P、およびFUSEで別々のワークフローで実行されます。
これらは、ext4およびXFS自体が検証されるテストです。
xfstestsワークフロー →
ZFSをエンドツーエンドテストとして
CIはZeroFSブロックデバイス上にZFSプールを構築し、Linuxカーネルソースツリーをそれに展開して、完全なスクラブを実行します。
スクラブはチェックサムエラーを報告しません。
zfs-testワークフロー →
カーネルビルド
CIはNFS、9P、およびFUSEマウントでLinuxカーネルをmake -j$(nproc)でコンパイルします。
並列コンパイルはストレステストです。多数のプロセスが同時に同じツリーに書き込みます。
kernel-compileワークフロー →
stress-ng
ファイルシステムストレッサは、CIでライブマウントに対して実行されます。アクセス、chdir、chmod、chown、およびその他のファイル処理セットすべてを同時に実行します。
stress-ngワークフロー →
モデルベースのチェック
Jepsenのlocal-fsスイートは、ランダムな操作履歴を持つ9Pマウントを駆動し、各操作をリファレンスファイルシステムモデルに対してチェックします。
クラッシュモードは、実行中にサーバーを停止し、復旧された状態が最後のfsyncと一致することを確認します。
jepsenワークフロー →
フォールトインジェクション下でのフェイルオーバー
2番目のJepsenスイートは、MinIO上でリーダーとスタンバイを実行し、次にリーダーをワークロードの途中で停止、再起動、一時停止します。
これにより、確認されたすべての書き込みがフェイルオーバーを生き残り、復旧されたファイルシステムが一貫性を保つことを確認します。
jepsen-haワークフロー →
セルフホスティング
Rustツールチェーンは、ZeroFS自体が提供するファイルシステム上でZeroFSをビルドします。
これはCIジョブではなく、記録されたセッションです。
録画を見る →
02プロトコル
NFSおよび9P経由のファイル、NBD経由のブロックデバイス。
3つのサーバーすべてが、同じバケットに対して1つのユーザースペースプロセスで実行されます。
クライアントは、Linuxにすでに組み込まれているNFSおよび9Pサポート、またはブロックデバイス用のnbd-clientを使用してマウントします。
NFS
9P
NBD
S3
ENCRYPTED OBJECTS
NFS
9P
NBD
S3
ENCRYPTED OBJECTS
ファイル · どこでも
NFS macOS、Linux、Windows、およびBSDは、クライアントに何も追加でインストールせずに、独自のNFSサポートを介してマウントします。
サーバーはユーザースペースに留まります。
# 主要なOSからマウント
mount -t nfs 127.0.0.1:/ /mnt/zerofs
ファイル · 正確
9PはNFSよりもPOSIXに厳密に従っており、fsyncはデータが安定ストレージに到達するまで待ってから返されます。
バンドルされたFUSEクライアントは、root権限なしでマウントし、自動的に再接続します。
# バンドルされたFUSEクライアント、root不要
zerofs mount 127.0.0.1:5564 /mnt/zerofs
ブロック · 生
NBD
バケットに保存された生のブロックデバイスは、ext4ファイルシステム、ZFSプール、またはVMブートディスクを保持します。
新しいデバイスは実行時に検出され、サーバーの再起動は不要です。
# ブロックデバイスをアタッチ
nbd-client 127.0.0.1 10809 /dev/nbd0 -N vol1
Amazon S3
Google Cloud Storage
Azure Blob
任意のS3互換ストア
ローカルディスク
で実行されます。
03ジオディストリビューション
3つのS3リージョンにまたがるZFSミラー。
各ZeroFSインスタンスは、1つのS3リージョンをブロックデバイスとして公開します。
ZFSにとって、これらは通常のディスクであるため、大陸をまたぐミラーは他のプールと同様にセットアップされます。
global-pool — zsh
$ nbd-client 10.0.1.5 10809 /dev/nbd0 -N storage -persist # us-east
$ nbd-client 10.0.2.5 10809 /dev/nbd1 -N storage -persist # eu-west
$ nbd-client 10.0.3.5 10809 /dev/nbd2 -N storage -persist # ap-southeast
$ zpool create global-pool mirror /dev/nbd0 /dev/nbd1 /dev/nbd2
$ zpool status global-pool | grep state
state: ONLINE
リージョンが到達不能になった場合、プールは劣化しますが、データは他の2つから利用可能なままです。
04機能
ストレージエンジンの9つのプロパティ。
04.1常に暗号化
すべてのブロックは、アップロード前にXChaCha20-Poly1305で暗号化されます。
データキーは、Argon2idを使用してパスワードから派生したキーでラップされます。
暗号化されていないモードはありません。
04.2圧縮
データは、暗号化前にzstdまたはlz4で圧縮されます。
コーデックは、既存データのコーデックが読み取り時に検出されるため、移行なしでいつでも変更できます。
04.3キャッシング
設定可能なメモリおよびディスクキャッシュは、最近使用されたブロックを保持します。
ホットリードはマイクロ秒単位で返されます。
生のS3ラウンドトリップは50〜300ミリ秒かかります。
04.4チェックポイント
名前付きチェックポイントは、ファイルシステムを特定の時点でキャプチャします。
それらのいずれも、起動時に単一のフラグで読み取り専用で開くことができます。
04.5リードレプリカ
1つのインスタンスが書き込みを行い、読み取り専用インスタンスが同じバケットを提供します。
レプリカはライターの変更を自動的に取り込み、書き込みに対してEROFSを返します。
04.6TRIMサポート
任意のファイルシステムまたはzpoolからの破棄は、対応するエクステントを解放します。
コンパクションはライブデータを再パックし、S3から空になったセグメントを削除するため、解放されたブロックは請求から除外されます。
04.7不変セグメント
ファイルデータは、別のメタデータインデックスによってアドレス指定される、不変のセグメントオブジェクト内の32 KiBエクステントにパックされます。
インプレースで書き直されるものはないため、チェックポイントとリードレプリカはバケットの一貫したビューを参照します。
04.8正直なfsync
成功したfsyncは、確認されたすべての書き込みがS3で耐久性があることを意味します。
フェイルオーバーでフラッシュされていない書き込みが失われた可能性がある場合、次のfsyncは誤った成功ではなくエラーを返します。
04.9高可用性
オプションのスタンバイは、同じバケット上でリーダーを追跡し、リーダーが失敗すると自動的に引き継ぎます。
2つが接続されている間、スタンバイはリーダーが確認したがまだフラッシュしていない書き込みも保持するため、フェイルオーバーはそれらを保持します。
05Web UI
1つの設定セクションでWebコンソールが追加されます。
[servers.webui]を有効にすると、同じプロセスがコンソールを提供します。これは、WebSocket over 9Pで実行されるファイルマネージャー、gRPC-web over gRPC-webで統計をストリーミングするダッシュボード、およびマウントされたファイルシステムをルートとするLinux VMを起動するターミナルです。
ファイルマネージャー
ダッシュボード
ターミナル
127.0.0.1:8080
ドラッグアンドドロップアップロードは、ファイルおよびフォルダ全体で機能し、9P経由でバケットに書き込まれます。
06録画
4つの録画されたターミナルセッション。
これらは実際のターミナルセッションのアスキーキャスト録画であり、ビデオではなくテキストでレンダリングされます。
再生はアイドルポーズを2秒に制限し、それ以外は何も変更しません。
カーネルビルド
ZFS on S3
Ubuntuブート
セルフホスティング
カーネルビルド — asciinema
Linuxカーネルは、ZeroFS NBDボリューム上のZFSで16秒でコンパイルされます。
それはファイルシステムです。
S3に格納されているだけです。
$ curl -sSfL https://sh.zerofs.net | sh
コピー クイックスタート ドキュメント ソース