HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

Show HN: ZeroFS – S3向けのログ構造ファイルシステム

Show HN: ZeroFS – A log-structured filesystem for S3 (zerofs.net)

107 pointsby Eikon50 コメント

要約

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 コピー クイックスタート ドキュメント ソース