###### tags: `memo` `systems` # Zettabyte File System (ZFS) Paper URL: http://web.mit.edu/6.033/www/papers/zfs.pdf ## ZFS? - ZFS = ボリュームマネージャ(zpool) + ファイルシステム(zfs) - データ整合性、可用性、管理のしやすさ、スケーラビリティに注力 ## デザイン - 管理がしやすい - 実用的な観点では非常に大事 - ストレージをプールする - ストレージとファイルシステムの1対1の関連付けをやめる - ZFS では - 抽象化レイヤーを噛ませて、ストレージとファイルシステムを分離 - ストレージを動的に追加する可能 - ファイルシステムサイズを動的に変えられる - 既存のファイルシステムは、ファイルシステムのサイズを変えるために手動操作が必要 - ZFS は自動 - 自動でファイルシステムのサイズが変わるので、メタデータも動的に割り当てられる - 膨大なキャパシティを持つ - エラー検知の訂正が可能 ## 構成要素 ZFS は主に 3 つの構成要素からなる ![](https://i.imgur.com/PY7jBMy.png) <small>※論文より引用</small> 1. ZPL (ZFS Posix Layer) 2. DMU (Data Management Unit) 3. SPA (Storage Pool Allocator) ### ZPL ZFS を POSIX 互換にするためのレイヤー ### DMU - SPA からブロックを貰い、オブジェクトを生成し、上位層に提供する - copy on write と transaction によって不整合に対処 - copy on write - ブロックを更新するとき 1. 更新対象ブロックをコピー 2. コピーしたブロックに対して更新 3. 更新対象ブロックにつながる全ブロックをコピーし、2.で作ったブロックにつなげる 4. 良きタイミングで uberblock を更新し、3.のブロック群につなげる - transaction - 一連の書き込み処理をトランザクションとして扱う - 「全て成功」 or 「全て失敗」になるため、不整合が起きない - 不整合が起きないので fsck などのファイルシステムチェックも必要ない ### SPA - ストレージプールからブロックを割り当てるためのインターフェース - ブロックが実際にどのデバイスに存在するかを隠蔽 - ブロックに割り振られる DVA (Data Virtual Address) によって実現 - これにより、ZFS ではデバイスをストレージプールから動的に追加/削除できる - DVA は 128 bit 幅 - E2E チェックサムによるデータ整合性の保証 - Fletcher checksum - チェックサムは親ブロックに保存される - ルートブロック (uberblock) のチェックサムは自身で保持する - ボリュームマネージャとしての機能も備えている - 各機能は vdev という小さなビルディングブロックとして用意 - 以下のようにして、組み合わせて使う ![](https://i.imgur.com/pvxeV5Q.png) <small>※論文より引用</small> ## その他の参考文献 - https://www.slideshare.net/sameerd/zettabyte-file-storage-system - https://chibiegg.gitbooks.io/how-to-zfs/content/zfs.html - https://www.fujitsu.com/jp/documents/products/computing/servers/unix/sparc-enterprise/technical/documents/03_zfs.pdf