| 開発者 | 当初はSun Microsystems、 2010年からはOracle Corporation、2013年からはOpenZFS |
|---|---|
| 変種 | Oracle ZFS、OpenZFS |
| 紹介された | 2005年11月OpenSolaris (2005年11月) |
| 構造 | |
| ディレクトリの内容 | 拡張可能なハッシュ |
| 制限 | |
| 最大ボリュームサイズ | 256兆 ヨビバイト(2の128 乗バイト)[ 1 ] |
| 最大ファイルサイズ | 16 エクスビバイト(2 64 バイト) |
| 最大ファイル数 |
|
| ファイル名の最大長 | 1023 ASCII文字( Unicodeなどのマルチバイト文字規格では文字数が少なくなります) |
| 特徴 | |
| フォーク | はい(「拡張属性」と呼ばれますが、本格的なストリームです) |
| 属性 | POSIX、拡張属性 |
| ファイルシステムの権限 | Unix パーミッション、NFSv4 ACL |
| 透過的な圧縮 | はい |
| 透過的な暗号化 | はい |
| データ重複排除 | はい |
| コピーオンライト | はい |
| 他の | |
| サポートされているオペレーティングシステム |
|
ZFS(旧称Zettabyte File System)は、ボリューム管理機能を備えたファイルシステムです。2001年にSun MicrosystemsのSolarisオペレーティングシステムの一部として始まりました。ZFSを含むSolarisの大部分は、 2005年から約5年間、OpenSolarisとしてオープンソースライセンスで公開されていましたが、2009~2010年にOracle CorporationがSunを買収した際にクローズドソースライセンスに移行しました。2005年から2010年にかけて、ZFSのオープンソース版はLinux、Mac OS X ( MacZFSとして継続)、FreeBSDに移植されました。2010年、illumosプロジェクトは、ZFSを含む当時の最新バージョンのOpenSolarisをフォークし、オープンソースプロジェクトとして開発を継続しました。2013年、オープンソースZFSの開発を調整するためにOpenZFSが設立されました。 [ 3 ] [ 4 ] [ 5 ] OpenZFSはZFSのコアコードを保守・管理し、ZFSを使用する組織は、ZFSを自社システムに統合するために必要な特定のコードと検証プロセスを維持管理します。OpenZFSはUnix系システムで広く使用されています。[ 6 ] [ 7 ] [ 8 ]
保存されたデータの管理には、一般的に2つの側面があります。1つはハードドライブやSDカードなどの1つまたは複数のブロックストレージデバイスの物理ボリューム管理で、オペレーティングシステム(多くの場合、ボリュームマネージャ、RAIDコントローラ、アレイマネージャ、または適切なデバイスドライバを含む)から見えるVDEV(ZFS仮想デバイス)[ 9 ]としての論理ブロックデバイスへの編成が含まれます。もう1つは、これらの論理ブロックデバイス(ファイルシステムまたはその他のデータストレージ)に保存されているデータとファイルの管理です。
ZFS は、他のほとんどのストレージ システムとは異なり、これら 2 つの役割を統合し、ボリューム マネージャとファイル システムの両方の役割を果たすという点で特殊です。したがって、物理ディスクとボリューム (それらのステータス、状態、ボリュームへの論理的配置を含む) と、そこに保存されているすべてのファイルについて完全な知識を持っています。ZFS は、十分なデータ冗長性が確保されていることを条件に、ディスクに保存されたデータが物理的なエラー、ハードウェアまたはオペレーティング システムによる誤った処理、または時間の経過と共に発生するビット腐敗イベントやデータ破損によって失われないことを保証するように設計されています。ストレージ システムを完全に制御することで、ファイル管理に関連するかディスク管理に関連するかに関係なく、すべてのステップが、ストレージ コントローラ カードや個別のボリューム システムおよびファイル システムでは実現できない方法で検証、確認、必要に応じて修正、および最適化されます。
ZFSには、データセットレベルおよびプールレベルのスナップショットとレプリケーションのメカニズムも搭載されており、その中にはスナップショットのクローン作成機能も含まれます。FreeBSDのドキュメントでは、この機能は「スナップショット機能を備えた他のファイルシステムにも欠けている」機能を持つ「最も強力な機能」の1つと説明されています。[ 10 ]パフォーマンスを低下させることなく、非常に多くのスナップショットを作成できるため、リスクの高いシステム操作やソフトウェアの変更を行う前にスナップショットを使用したり、ユーザーエラーや悪意のあるアクティビティによるデータ損失を軽減するために、本番環境(「ライブ」)のファイルシステム全体を1時間に数回完全にスナップショット化したりできます。スナップショットは「ライブ」でロールバックしたり、非常に大規模なファイルシステムであっても以前のファイルシステムの状態を確認したりできるため、正式なバックアップおよび復元プロセスと比較してコストを削減できます。[ 10 ]スナップショットをクローン化して、新しい独立したファイルシステムを形成することもできます。ZFSには、プールレベルのスナップショット(「チェックポイント」と呼ばれる)を作成する機能もあり、プール全体の構造に影響を与える可能性のある操作や、データセット全体を追加または削除する操作をロールバックできます。
1987年、AT&Tコーポレーションとサンは、当時市場で最も人気のあるUnixの派生製品であるBerkeley Software Distribution、UNIX System V、Xenixを統合するプロジェクトで協力していると発表した。これがUnix System V Release 4(SVR4)となった。[ 11 ]このプロジェクトはSolarisという名前でリリースされ、 SunOS 4の後継となった(ただし、SunOS 4.1.xマイクロリリースは遡及的にSolaris 1と命名された)。[ 12 ]
ZFSは、ジェフ・ボンウィック、ビル・ムーア[ 13 ]、マシュー・アーレンズが率いるサンのチームによって設計・実装されました。2004年9月14日に発表されましたが[ 14 ]、開発は2001年に開始されました。[ 15 ] ZFSのソースコードは2005年10月31日にSolaris開発のメイントランクに統合され[ 16 ] 、2005年11月16日にOpenSolarisのビルド27の一部として開発者向けにリリースされました。 2006年6月、サンはZFSがSolaris 10のメインストリーム6/06アップデートに含まれることを発表しました。[ 17 ]
Solarisはもともとプロプライエタリソフトウェアとして開発されましたが、サン・マイクロシステムズはオープンソースソフトウェアの早期商業的提唱者であり、2005年6月にSolarisのコードベースの大部分をCDDLライセンスの下でリリースし、 OpenSolarisオープンソースプロジェクトを設立しました。[ 18 ] Solaris 10 6/06(「U2」)で、サンはZFSファイルシステムを追加し、その後5年間、頻繁にZFSを新機能で更新しました。ZFSはこのオープンソースライセンスの下で、 Linux、Mac OS X ( MacZFSとして継続)、FreeBSDに移植されました。
この名前はかつて「Zettabyte File System」の略称と言われていましたが[ 19 ]、2006年までにこの名前はもはや略語とはみなされなくなりました。[ 20 ] ZFSファイルシステムは最大256京ゼタバイト(ZB)を保存できます。
2007年9月、NetAppはSunを提訴し、ZFSがNetAppのWrite Anywhere File Layoutに関する特許の一部を侵害していると主張しました。Sunは同年10月に反訴を起こし、これとは正反対の主張をしました。この訴訟は2010年に和解金(金額は非公開)で終結しました。[ 21 ]
ZFS の移植版は 2005 年に登場し始めました。2010年にSun が Oracle に買収された後、Oracle 版の ZFS はクローズド ソースとなり、オープンソース バージョンの開発は 2013 年からOpenZFSによって調整され、独立して進められました。
ZFS 固有の機能の例としては次のようなものがあります。
ZFS と他のファイル システムとを区別する主な特徴の 1 つは、データの整合性に重点を置いて設計されていることです。これにより、データの劣化、電力サージ (電圧スパイク)、ディスクファームウェアのバグ、ファントム書き込み (前回の書き込みがディスクに書き込まれなかった)、誤った方向への読み取り/書き込み (ディスクが間違ったブロックにアクセスした)、アレイとサーバー メモリ間またはドライバーからの DMA パリティ エラー (チェックサムがアレイ内のデータを検証するため)、ドライバー エラー (データがカーネル内の間違ったバッファーに格納される)、偶発的な上書き (ライブ ファイル システムへのスワップなど) などによって発生するサイレント データ破損からディスク上のユーザー データを保護し、データの整合性を維持します。
1999年の調査では、当時主流で普及していたファイルシステム(UFS、Ext、[ 22 ] XFS、JFS、NTFSなど)もハードウェアRAID(データの整合性に問題がある)も、データ破損の問題に対して十分な保護を提供しないことが示されました。[ 23 ] [ 24 ] [ 25 ] [ 26 ]初期の調査では、ZFSが以前のものよりも優れたデータ保護を提供することが示されています。[ 27 ] [ 28 ] また、UFSよりも高速であり、 [ 29 ] [ 30 ]後継として見ることができます。
ZFSでは、ファイルシステムツリー全体でフレッチャーベースのチェックサムまたはSHA-256ハッシュを使用することでデータの整合性が確保されます。 [ 31 ]各データブロックのチェックサムが計算され、そのチェックサム値はブロック自体ではなく、そのブロックへのポインタに保存されます。次に、ブロックポインタのチェックサムが計算され、その値がそのポインタに保存されます。このチェックサム計算は、ファイルシステムのデータ階層をルートノードまで遡って行われ、ルートノードでもチェックサムが計算されます。こうして、 Merkleツリーが作成されます。 [ 31 ]転送中のデータ破損やファントム読み取り/書き込み(データの書き込み/読み取りチェックサムは正しいが、実際には間違っている)は、ほとんどのファイルシステムではチェックサムがデータと一緒に保存されるため検出できません。ZFSは各ブロックのチェックサムを親ブロックポインタに保存するため、プール全体が自己検証されます。[ 31 ]
ブロックにアクセスすると、それがデータかメタデータかに関わらず、そのチェックサムが計算され、保存されている「べき」チェックサム値と比較されます。チェックサムが一致した場合、データはプログラミングスタックを介して、そのデータを要求したプロセスに渡されます。値が一致しない場合、ストレージプールがデータ冗長性(内部ミラーリングなど)を提供している場合、ZFSはデータのコピーが破損しておらず、チェックサムが一致していると仮定して、データを修復できます。[ 32 ]オプションとして、 copys=2(またはcopys=3 )を指定することにより、プール内の冗長性をさらに高めることができます。これは、データがディスクに2回(または3回)保存されることを意味し、ディスクのストレージ容量が実質的に半分(またはcopys=3の場合は3分の1)になることを意味します。[ 33 ]さらに、ZFSがプールを管理するために使用する一部のデータは、デフォルトのcopys=1設定であっても、安全のためデフォルトで複数回保存されます。
破損したデータの他のコピーが存在する場合、またはチェックサムとパリティデータから再構築できる場合、ZFSはデータのコピーを使用して(またはRAIDリカバリメカニズムを使用して再作成して)、チェックサムを再計算します。理想的には、元の期待値が再現されます。データがこの整合性チェックに合格した場合、システムはすべての不良コピーを正常なデータで更新し、冗長性を回復します。
破損したデータのコピーがない場合、ZFSはプールを障害状態にし、[ 34 ]将来の使用を妨げ、プールの内容を回復するための文書化された方法を提供しません。
ZFSはエラー訂正RAMを搭載したエンタープライズグレードのハードウェア上で動作することが想定されているため、ARCにキャッシュされたデータなど、メモリ内に保持されたデータの整合性はデフォルトではチェックされません。ただし、メモリ内データの整合性をチェックする機能が存在し、「デバッグフラグ」を使用して有効化できます。[ 35 ]
ZFSがデータの整合性を保証するには、データまたはパリティ情報の複数のコピーが必要であり、通常は複数のディスクに分散されます。これは通常、RAIDコントローラまたはいわゆる「ソフト」RAID(ファイルシステムに組み込まれている)を使用することで実現されます。
ZFS はハードウェアRAIDデバイスと連携して動作しますが、通常、すべてのストレージデバイスに Raw アクセスできる場合、より効率的に動作し、より強力なデータ保護を実現します。ZFS は、データが安全に書き込まれたと確認された時点を判断するためにディスクの正確な情報に依存しており、キャッシュ、キャッシュフラッシュ、ディスク処理の使用を最適化するために設計された多数のアルゴリズムを備えています。
ハードウェア、ファームウェア、その他の「ソフト」RAID、あるいはZFSからディスクへのI/Oパスを変更するその他のコントローラを使用してシステムに接続されたディスクは、ZFSのパフォーマンスとデータの整合性に影響を与えます。サードパーティ製のデバイスがキャッシュを実行したり、 ZFSが依存する低レベルのビューを持たずにドライブをZFSに単一システムとして提示したりする場合、システムのパフォーマンスが最適ではなくなり、 ZFSが障害を回避しにくくなり、障害からの回復が遅くなり、書き込みエラーによるデータ損失が発生する可能性が高くなります。例えば、ハードウェアRAIDカードを使用している場合、ZFSはディスクの状態を判断できない、RAIDアレイが劣化しているか再構築中であるかを判断できない、すべてのデータ破損を検出できない、ディスク全体にデータを最適に配置しられない、選択的に修復を実行できない、修復と使用中のデータのバランスを制御できない、あるいはZFSが通常実行できる修復を実行できないといった問題が発生する可能性があります。ハードウェアRAIDカードはZFSのアルゴリズムに干渉します。また、RAIDコントローラは通常、コントローラ依存のデータをドライブに追加するため、ソフトウェアRAIDによるユーザーデータへのアクセスが妨げられます。ハードウェアRAIDコントローラーに障害が発生した場合、互換性のある別のコントローラーでデータを読み取ることができる場合もありますが、必ずしも可能とは限らず、交換品が入手できない場合もあります。代替ハードウェアRAIDコントローラーは、アレイの管理と復元に必要な、元のメーカーのカスタムデータを認識できない場合があります。
RAID カードや類似のハードウェアを使用してリソースと処理をオフロードし、パフォーマンスと信頼性を向上できる他のほとんどのシステムとは異なり、ZFS ではこれらの方法を使用しないことを強くお勧めします。これらの方法を使用すると、通常、システムのパフォーマンスと信頼性 が低下します。
ディスクをRAIDまたはその他のコントローラを介して接続する必要がある場合は、プレーンなHBA(ホストアダプタ)やシンプルなファンアウトカードを使用するか、カードをJBODモード(つまりRAIDとキャッシュ機能をオフにする)で構成して、ZFSからディスクへのI/Oパスウェイの変更を最小限に抑えてデバイスを接続できるようにすることをお勧めします。JBODモードのRAIDカードは、キャッシュがある場合には干渉する可能性があります。また、設計によっては、時間内に応答しないドライブを切り離す可能性があります(多くの省エネ型コンシューマーグレードのハードドライブで見られるように)。そのため、ドライブのドロップアウトを防ぐために、時間制限付きエラー回復(TLER)/CCTL/ERC対応ドライブが必要になる場合があります。そのため、RAID機能を無効にしてもすべてのカードが適しているわけではありません。[ 36 ]
ZFSはハードウェアRAIDの代わりに「ソフト」RAIDを採用し、RAID-Z(RAID 5と同様のパリティベース)とディスクミラーリング(RAID 1と同様の)を提供します。これらのスキームは非常に柔軟です。
RAID-ZはRAID-5と同様のデータ/パリティ分散方式ですが、動的なストライプ幅を使用します。ブロックサイズに関係なく、すべてのブロックが独自のRAIDストライプであるため、RAID-Zへの書き込みはすべてストライプ全体への書き込みとなります。これは、ZFSのコピーオンライトトランザクションセマンティクスと組み合わせることで、書き込みホールエラーを排除します。また、RAID-Zは通常の読み取り・変更・書き込みシーケンスを実行する必要がないため、従来のRAID 5よりも高速です。[ 37 ]
すべてのストライプのサイズが異なるため、RAID-Zの再構築ではファイルシステムのメタデータを走査して実際のRAID-Zジオメトリを決定する必要があります。ファイルシステムとRAIDアレイが別々の製品であればこれは不可能ですが、データの論理構造と物理構造を統合的に把握することで実現可能になります。メタデータを走査することで、ZFSは256ビットのチェックサムを用いて各ブロックを検証できますが、従来のRAID製品では通常これが不可能です。[ 37 ]
RAID-Zはディスク全体の障害に対処するだけでなく、サイレントデータ破損も検出・修復し、「自己修復データ」を提供します。RAID-Zブロックを読み取る際、ZFSはブロックをチェックサムと比較し、データディスクが正しい値を返さなかった場合、ZFSはパリティを読み取り、どのディスクが不良データを返したかを判断します。そして、破損したデータを修復し、正常なデータを要求元に返します。[ 37 ]
RAID-Zとミラーリングは特別なハードウェアを必要としません。信頼性のためにNVRAMを必要とせず、優れたパフォーマンスやデータ保護のために書き込みバッファリングを必要としません。RAID-Zを使用することで、ZFSは安価な汎用ディスクを用いて高速で信頼性の高いストレージを提供します。[ 37 ]
RAID-Zには5つのモードがあります。ストライピング(RAID 0に類似、冗長性なし)、RAID-Z1(RAID 5に類似、1つのディスクの障害を許容)、RAID-Z2(RAID 6に類似、2つのディスクの障害を許容)、RAID-Z3(RAID 7 [ a ]構成、3つのディスクの障害を許容)、ミラーリング(RAID 1に類似、1つを除くすべてのディスクの障害を許容)です。[ 39 ]
RAID-Z3の必要性は、2000年代初頭に数テラバイト容量のドライブが普及するにつれて高まりました。容量の増加はスループット速度の向上を伴わず、ドライブの故障によるアレイの再構築には「数週間から数ヶ月もかかる」可能性がありました。[ 38 ]この間、アレイ内の古いディスクは追加のワークロードによって負荷がかかり、データ破損やドライブ故障につながる可能性があります。RAID-Z3はパリティを増やすことで冗長性を高め、データ損失の可能性を低減します。[ 40 ]
ZFSには、 fsck(UnixおよびLinuxのファイルシステムの標準的なデータチェックおよび修復ツール)に相当するツールはありません。 [ 41 ]代わりに、ZFSには組み込みのscrub関数があり、定期的にすべてのデータを検査し、サイレント破損などの問題を修復します。いくつかの違いは次のとおりです。
Sun/Oracleの公式推奨では、エンタープライズレベルのディスクは月に1回、安価な汎用ディスクは週に1回スクラブすることを推奨しています。[ 42 ] [ 43 ]
ZFSは128ビットファイルシステムであるため[ 44 ] [ 16 ] 、 Btrfsなどの64ビットシステムと比較して1.84×10の19倍のデータを扱うことができます。ZFSの上限は非常に大きく設計されているため、実際には上限に達することはありません。例えば、1つのzpoolに2128ビットのデータを完全に格納するには、3×10の24TB のハードディスクドライブが必要になります。 [ 45 ]
ZFS の理論上の制限は次のとおりです。
Oracle Solarisでは、ZFSの暗号化機能[ 47 ]がI/Oパイプラインに組み込まれています。書き込み時には、ブロックは圧縮、暗号化、チェックサム計算、重複排除の順序で実行されます。暗号化ポリシーは、データセット(ファイルシステムまたはZVOL)の作成時にデータセットレベルで設定されます。ユーザー/管理者が提供するラッピングキーは、ファイルシステムをオフラインにすることなくいつでも変更できます。デフォルトの動作では、ラッピングキーは子データセットに継承されます。データ暗号化キーはデータセット作成時にランダムに生成されます。子孫データセット(スナップショットとクローン)のみがデータ暗号化キーを共有します。[ 48 ]クローンまたはいつでも新しいデータ暗号化キーに切り替えるコマンドが提供されています。このコマンドでは、既存のデータの再暗号化は行われず、暗号化されたマスターキーメカニズムが使用されます。
2019年現在、暗号化機能はDebianおよびUbuntu Linuxディストリビューションで利用可能なOpenZFS 0.8.0にも完全に統合されています。[ 49 ]
ZFSネイティブ暗号化の使用時に障害が発生したというエンドユーザーからの報告が散見されますが、正確な原因は解明されていません。[ 50 ] [ 51 ]
ZFSは、プール内のすべての仮想デバイス(および各仮想デバイス内のすべてのデバイス)にデータストレージを自動的に割り当て、プールのパフォーマンスを全体的に最大化します。また、プールに新しいディスクが追加されると、ZFSの書き込み戦略も更新されます。
一般的なルールとして、ZFS は各 vdev の空き領域に基づいて書き込みを vdev に割り当てます。これにより、新しいデータが格納されるときに、すでにデータが少ない vdev に多くの書き込みが割り当てられます。これにより、プールが使用されるようになっても、一部の vdev がいっぱいになり、限られた数のデバイスに書き込みを強制する状況が発生しなくなります。また、データの読み取り時 (ほとんどの使用では読み取りは書き込みよりもはるかに頻繁です) に、データのさまざまな部分を同時にできるだけ多くのディスクから読み取ることができるため、読み取りパフォーマンスが大幅に向上します。したがって、一般的なルールとして、プールと vdev を管理し、新しいストレージを追加して、プール内の一部の vdev がほぼいっぱいでその他がほぼ空であるような状況が発生しないようにする必要があります。このような状況が発生すると、プールの効率が低下します。
ZFSの空き領域は、使用頻度に応じて断片化しやすい傾向があります。ZFSには空き領域をデフラグするメカニズムがありません。空き領域の断片化が著しく、ディスク領域の過剰使用と相まってパフォーマンスが低下するというエンドユーザーからの報告が散見されます。[ 52 ] [ 53 ]
プールには、故障したディスクを補うためのホットスペアを配置できます。ミラーリングでは、ブロックデバイスを物理シャーシごとにグループ化できるため、シャーシ全体に障害が発生した場合でもファイルシステムを継続できます。
ストレージプールの構成は、類似のデバイスに限定されず、アドホックな異機種デバイスの集合で構成できます。ZFSはこれらのデバイスをシームレスにプールし、必要に応じてデータセット(ファイルシステムインスタンスまたはZVOL)にスペースを割り当てます。任意の種類のストレージデバイスを既存のプールに追加して、サイズを拡張できます。[ 54 ]
すべての仮想デバイス(vdev)のストレージ容量は、zpool 内のすべてのファイルシステムインスタンスで利用できます。クォータを設定することで、ファイルシステムインスタンスが占有できる容量を制限できます。また、予約を設定することで、ファイルシステムインスタンスが確実に使用できる容量を確保できます。
ZFSは、読み取りと書き込みの操作を高速化するために、異なる層のディスクキャッシュを使用します。理想的には、すべてのデータをRAMに保存する必要がありますが、通常はコストがかかりすぎます。そのため、パフォーマンスとコストを最適化するために、データは自動的に階層的にキャッシュされます。[ 55 ]これらはしばしば「ハイブリッドストレージプール」と呼ばれます。[ 56 ]頻繁にアクセスされるデータはRAMに保存され、アクセス頻度の低いデータはソリッドステートドライブ(SSD)などの低速メディアに保存されます。アクセス頻度の低いデータはキャッシュされず、低速のハードドライブに残されます。古いデータが突然頻繁に読み込まれる場合、ZFSは自動的にそれをSSDまたはRAMに移動します。
ZFS キャッシュ メカニズムには、読み取り用と書き込み用のそれぞれ 1 つが含まれており、それぞれの場合で、コンピューターのメモリ (RAM) に 1 つ、高速ストレージ (通常はソリッド ステート ドライブ(SSD)) に 1 つ、合計 4 つのキャッシュの 2 つのレベルのキャッシュが存在できます。
| 保管場所 | 読み取りキャッシュ | 書き込みキャッシュ | |
|---|---|---|---|
| 第一レベルキャッシュ | RAM内 | ARC( Adaptive Replacement Cache )アルゴリズムの一種を使用しているため、ARCと呼ばれます。RAMは常にキャッシュに使用されるため、このレベルは常に存在します。ARCアルゴリズムの効率性により、ARCサイズが十分に大きい場合、ディスクにアクセスする必要はほとんどありません。RAMが小さすぎる場合、ARCはほとんど機能しません。この場合、ZFSは常に基盤となるディスクにアクセスする必要があり、パフォーマンスに大きな影響を与えます。 | 「トランザクショングループ」によって処理されます。書き込みは短時間(通常5~30秒)で、指定された制限まで照合され、各グループがディスクに書き込まれるのと同時に、理想的には次のグループの照合が行われます。これにより、基盤となるディスクへの書き込みをより効率的に整理できますが、電源喪失やハードウェア障害が発生した場合、最新のトランザクションのデータがわずかに失われるリスクがあります。実際には、電源喪失のリスクはZFS書き込みジャーナリングとSLOG/ZIL第2層書き込みキャッシュプール(後述)によって回避されるため、書き込みが失われるのは、書き込み障害が第2層SLOGプールの完全な損失と同時に発生した場合のみであり、しかも同期書き込みとSLOGの使用に関する設定が、そのような状況が発生するように設定されている場合にのみ発生します。データの受信速度が書き込み速度よりも速い場合、ディスクが追いつくまでデータの受信は一時停止されます。 |
| 2次キャッシュとインテントログ | 高速ストレージデバイス(現在のバージョンの ZFS では中断なく「ライブ」システムに追加したり削除したりできますが、古いバージョンでは必ずしもそうとは限りません) | L2ARC (「Level 2 ARC」)と呼ばれるオプション機能。ZFSは可能な限り多くのデータをL2ARCにキャッシュします。L2ARCは、重複排除テーブル全体をL2ARCにキャッシュできる場合、重複排除処理を大幅に高速化します。L2ARCを空の状態から完全にキャッシュするには(ZFSがどのデータが「ホット」でキャッシュすべきかを判断するまで)、数時間かかる場合があります。L2ARCデバイスが失われた場合、すべての読み取りはディスクに送信されるためパフォーマンスが低下しますが、それ以外は何も起こりません(データが失われることはありません)。 | SLOGまたはZIL (ZFSインテントログ)と呼ばれるこれらの用語は、しばしば誤って使用されています。SLOG(セカンダリログデバイス)は、システム問題発生時に書き込みを記録するための、別デバイス上のオプションの専用キャッシュです。SLOGデバイスが存在する場合、それはZFSインテントログのセカンドレベルログとして使用され、別個のキャッシュデバイスが提供されていない場合は、代わりにメインストレージデバイス上にZILが作成されます。したがって、SLOGは技術的には、プールの高速化のためにZILがオフロードされる専用ディスクを指します。厳密に言えば、ZFSはディスク書き込みをキャッシュするためにSLOGデバイスを使用するわけではありません。むしろ、SLOGは書き込みが可能な限り迅速に永続的なストレージメディアにキャプチャされるようにするために使用します。そのため、電源喪失や書き込み障害が発生した場合でも、書き込みとして認識されたデータは失われません。SLOGデバイスにより、ZFSはHDDなどのはるかに低速なストレージデバイスであっても、書き込みを迅速に保存し、書き込み済みとして迅速に報告することができます。通常の動作では、SLOG は参照も読み取りも行われず、キャッシュとしても機能しません。SLOG の目的は、最終的な書き込みが失敗した場合に備えて、照合と「書き出し」にかかる数秒間、転送中のデータを保護することです。すべてが順調に進んだ場合、ストレージプールは次の 5 ~ 60 秒以内に更新され、現在のトランザクショングループがディスクに書き出されます (上記参照)。この時点で、SLOG に保存されている書き込みは無視され、上書きされます。書き込みが最終的に失敗した場合、またはシステムがクラッシュや障害に見舞われて書き込みが妨げられた場合、ZFS は SLOG を読み戻すことで (SLOG が読み出されるのはこれが唯一のタイミングです)、書き込みが確認されたすべての書き込みを特定し、これを用いてデータ損失を完全に修復できます。 これは、大量の同期書き込みが行われる場合(ESXi、NFS、一部のデータベースなど)[ 57 ]に非常に重要になります。このような場合、クライアントはアクティビティを続行する前に書き込みが成功したことを確認する必要があります。SLOGを使用すると、ZFSは、データストレージの状態に関してクライアントを誤解させるリスクなしに、毎回メインストアに書き込むよりもはるかに速く書き込みが成功したことを確認できます。SLOGデバイスがない場合、メインデータプールの一部が同じ目的で使用されますが、速度は遅くなります。 ログデバイス自体が失われた場合、最新の書き込みが失われる可能性があるため、ログデバイスはミラーリングする必要があります。以前のバージョンのZFSでは、ログデバイスの損失はzpool全体の損失につながる可能性がありましたが、現在はそうではありません。したがって、独立したログデバイスを使用する予定がある場合は、ZFSをアップグレードする必要があります。 |
ZFSには、他にも多くのキャッシュ、キャッシュ分割、キューが存在します。例えば、各VDEVには独自のデータキャッシュがあり、ARCキャッシュはユーザーが保存するデータとZFSが使用するメタデータに分割され、それらのバランスが制御されます。
OpenZFS 0.8以降では、ファイルシステムのメタデータ、オプションでデータ重複排除テーブル(DDT)、および小さなファイルシステムブロックを優先的に保存するSpecial VDEVクラスを設定できます。[ 58 ]これにより、例えば、通常のファイルデータは回転ディスクに保存し、メタデータを保存するためのSpecial VDEVを高速ソリッドステートストレージ上に作成することが可能になります。これにより、ファイルシステム全体をソリッドステートストレージに保存するコストをかけずに、ファイルシステムのトラバーサル、スクラブ、リシルバーといったメタデータを大量に使用する操作を高速化できます。
ZFSはコピーオンライトトランザクションオブジェクトモデルを採用している。ファイルシステム内のすべてのブロックポインタには対象ブロックの256ビットチェックサムまたは256ビットハッシュ(現在Fletcher-2、Fletcher-4、SHA-256から選択)[ 59 ]が含まれており、ブロックの読み取り時に検証されます。アクティブデータを含むブロックは上書きされることはありません。代わりに新しいブロックが割り当てられ、変更されたデータがそこに書き込まれ、次にそれを参照するメタデータブロックが同様に読み取り、再割り当てされ、書き込まれます。このプロセスのオーバーヘッドを削減するために、複数の更新はトランザクショングループにグループ化され、同期書き込みセマンティクスが必要な場合はZIL(インテントログ)書き込みキャッシュが使用されます。ブロックはツリー状に配置され、チェックサムも同様にツリー状に配置されています(Merkle署名スキームを参照)。
コピーオンライトの利点は、ZFS が新しいデータを書き込む際に、古いデータを含むブロックを保持できるため、ファイルシステムのスナップショットバージョンを維持できることです。ZFS スナップショットは一貫性があり (ある特定の時点で存在していたデータ全体を反映します)、スナップショットを構成するすべてのデータが既に保存されているため、非常に迅速に作成できます。また、ストレージプール全体のスナップショットが 1 時間に数回作成されることもあります。また、変更されていないデータはファイルシステムとそのスナップショット間で共有されるため、スペース効率も優れています。スナップショットは本質的に読み取り専用であるため、作成後は変更されませんが、バックアップの唯一の手段として依存すべきではありません。スナップショット全体を復元できるほか、スナップショット内のファイルやディレクトリも復元できます。
書き込み可能なスナップショット(「クローン」)を作成することもできます。これにより、ブロックセットを共有する2つの独立したファイルシステムが作成されます。クローンファイルシステムのいずれかに変更が加えられると、その変更を反映した新しいデータブロックが作成されますが、変更されていないブロックは、クローンの数に関係なく引き続き共有されます。これは、コピーオンライトの原理を実装したものです。
ZFSファイルシステムは、sendコマンドによってファイルシステムの状態を表すストリーム表現が作成されるため、ネットワーク経由で他のプール(リモートホスト上を含む)に移動できます。このストリームは、特定のスナップショットにおけるファイルシステムの完全な内容を表すことも、スナップショット間の差分を表すこともできます。差分ストリームの計算は非常に効率的で、そのサイズはスナップショット間で変更されたブロック数に依存します。これは、例えばオフサイトバックアップやプールの高可用性ミラーの同期など、効率的な戦略を提供します。
スループットを最大化するためにすべてのデバイスに動的ストライピングを行うということは、zpoolにデバイスが追加されると、ストライプ幅が自動的に拡張されてそれらのデバイスが含まれるようになることを意味します。したがって、プール内のすべてのディスクが使用され、書き込み負荷がディスク間で分散されます。[ 60 ]
ZFSは可変サイズのブロックを使用し、デフォルトサイズは128KBです。特定のワークロードでは大きなブロックではパフォーマンスが低下しますが、管理者は利用可能な機能を利用して最大ブロックサイズを調整できます。データ圧縮が有効になっている場合は、可変ブロックサイズが使用されます。ブロックを圧縮してより小さなブロックサイズに収まる場合は、ディスク上でより小さなブロックサイズを使用することで、ストレージ使用量を削減し、IOスループットを向上させます(ただし、圧縮および解凍処理のためにCPU使用率が増加するというデメリットがあります)。[ 61 ]
ZFS では、ストレージ プール内のファイルシステムの操作は、従来のファイルシステム内のボリュームの操作よりも簡単です。ZFS ファイルシステムの作成または拡張に必要な時間と労力は、他のシステムでのボリューム操作よりも、新しいディレクトリを作成するのに必要な時間と労力に近くなります。
プールとそれに関連付けられたZFSファイルシステムは、異なるプラットフォームアーキテクチャ間で移動できます。これには、異なるバイトオーダーを実装しているシステムも含まれます。ZFSブロックポインタ形式は、ファイルシステムのメタデータをエンディアン対応の方法で保存します。個々のメタデータブロックは、ブロックを書き込むシステムのネイティブバイトオーダーで書き込まれます。読み取り時に、保存されたエンディアンがシステムのエンディアンと一致しない場合、メタデータはメモリ内でバイトスワップされます。
これは保存されたデータには影響しません。POSIXシステムでは通常、ファイルはアプリケーションに対して単純なバイト配列として表示されるため、データの作成と読み取りを行うアプリケーションは、基盤となるシステムのエンディアンとは独立した方法でデータの作成と読み取りを行う責任を負います。
データ重複排除機能は2009年10月末にZFSソースリポジトリに追加され、[ 62 ]関連するOpenSolaris ZFS開発パッケージは2009年12月3日(ビルド128)から利用可能になりました。
重複排除を効果的に使用するには、大容量の RAM が必要になる場合があります。推奨される RAM 量は、ストレージ 1 TB あたり 1~5 GB です。[ 63 ] [ 64 ] [ 65 ]重複排除に必要なメモリを正確に評価するには、プール内の一意のブロック数と、各レコードを格納するために必要なディスク上および RAM (「コア」) のバイト数を参照します。これらの数値は、zpoolやなどの組み込みコマンドによって報告されますzdb。物理メモリが不足していたり、ZFS キャッシュが不足していると、重複排除の使用時に仮想メモリのスラッシングが発生し、パフォーマンスが急激に低下したり、完全にメモリが不足したりする可能性があります。重複排除は書き込み時に行われるため、CPU を大量に消費し、これによってもシステムの速度が大幅に低下する可能性があります。
他のストレージベンダーは、ZFSの改良版を使用して非常に高いデータ圧縮率を実現しています。2012年の例としては、GreenBytes [ 66 ]とTegile [ 67 ]が挙げられます。 2014年5月、OracleはZFSの重複排除およびレプリケーション技術のためにGreenBytesを買収しました。[ 68 ]
前述のように、重複排除は、システムとデータがこのスペース節約技術に適している特定の状況を除き、リソース要件(特に RAM)が大きく、パフォーマンス(特に書き込み時)に影響を与えるため、通常は推奨されません。
ZFS にはfsckのようなツールは付属していません。これは、ファイルシステム自体が自己修復するように設計されているためです。ストレージプールがストレージ設計とデータの冗長性に十分な配慮を払って構築されている限り、fsckのような基本的なツールは必要ありませんでした。しかし、ハードウェアの性能不足、設計や冗長性の不足、あるいは不運な事故などによってプールが侵害され、ZFS がプールをマウントできなくなった場合、エンドユーザーがひどく破損したプールから保存されたデータの一部を復旧できる、より高度なツールは従来存在しませんでした。
最新の ZFS では、時間の経過とともにこの状況が大幅に改善され、現在も改善され続けています。
Oracle Corporationは、2010年のSun買収後、ZFSとOpenSolarisの公開開発を中止しました。一部の開発者は、OpenSolarisの最後の公開リリースをIllumosプロジェクトとしてフォークしました。ZFSには大きな利点があるため、機能やコマンドが異なる複数のプラットフォームに移植されています。開発の連携と分断を避けるため、 2013年にOpenZFSが設立されました。
ZFSの主要設計者の一人であるマット・アーレンズ氏によると、2019年時点でオリジナルのOpenSolaris ZFSコードの50%以上がコミュニティの貢献によってOpenZFSに置き換えられており、「Oracle ZFS」と「OpenZFS」は政治的にも技術的にも互換性がないとのことです。[ 87 ]
2010年1月、オラクル社はサン・マイクロシステムズ社を買収し、すぐにOpenSolarisディストリビューションとオープンソース開発モデルを廃止した。[ 95 ] [ 96 ] 2010年8月、オラクル社はSolaris OS/Networkingリポジトリのソースコードへの公開アップデートの提供を中止し、事実上Solaris 11をクローズドソースの独自OSに戻した。[ 97 ]
Solaris および OpenSolaris を取り巻く状況の変化に対応して、Solaris の中核エンジニアによるコミュニティの取り組みとして、2010 年 8 月 3 日木曜日にウェビナー[ 98 ]でillumosプロジェクトが開始されました。これは、Solaris のオープンソース版の開発を継続し、Sun によってまだオープンソース化されていない部分のオープンソース化を完了するためのものです。 [ 99 ] illumos は、カリフォルニア州で501(c)6業界団体として法人化された Illumos Foundation という財団として設立されました。当初の計画では、illumos はディストリビューションでもフォークでもないと明確に述べられていました。しかし、Oracle が OpenSolaris の廃止を発表した後、Solaris ON の最終バージョンをフォークして、illumos を独自のオペレーティング システムに進化させる計画が立てられました。[ 100 ] OpenSolaris の一部として、ZFS のオープンソース版は illumos にとって不可欠なものとなりました。
ZFSはSolarisをはじめ、数多くのプラットフォームで広く利用されていました。そのため、2013年には、オープンソース版ZFSの開発作業の調整が、アンブレラプロジェクトであるOpenZFSに引き継がれました。OpenZFSフレームワークにより、関係するあらゆる関係者がZFSのコアコードベースを共同で開発できるようになり、同時に、ZFSが各自のシステムで動作し統合するために必要な特定の追加コードを個別に保守することが可能になります。
| 古いリリース |
| 最新のFOSS安定リリース |
| ZFS ファイルシステムのバージョン番号 | 発売日 | 重要な変更 |
|---|---|---|
| 1 | OpenSolaris ネバダ[ 101 ]ビルド 36 | 最初のリリース |
| 2 | OpenSolaris ネバダ b69 | ディレクトリエントリの強化。特に、ディレクトリエントリにはオブジェクト番号に加えて、ファイル、ディレクトリ、名前付きパイプなどのオブジェクトタイプが保存されるようになりました。 |
| 3 | OpenSolaris ネバダ b77 | SMB経由のZFSファイルシステムの共有をサポートします。大文字と小文字を区別しません。システム属性をサポートします。統合されたウイルス対策をサポートします。 |
| 4 | OpenSolaris ネバダ b114 | プロパティ: userquota、groupquota、userused、groupused |
| 5 | OpenSolaris ネバダ b137 | システム属性; シンボリックリンクが独自のオブジェクトタイプになりました |
| ZFS プールのバージョン番号 | 発売日 | 重要な変更 |
|---|---|---|
| 1 | OpenSolarisネバダ[ 101 ] b36 | 最初のリリース |
| 2 | OpenSolaris ネバダ b38 | ディットブロック |
| 3 | OpenSolaris ネバダ b42 | ホットスペア、ダブルパリティRAID-Z (raidz2)、改良された RAID-Z アカウンティング |
| 4 | OpenSolaris ネバダ b62 | zpoolの履歴 |
| 5 | OpenSolaris ネバダ b62 | ZFSデータセットのgzip圧縮 |
| 6 | OpenSolaris ネバダ b62 | 「bootfs」プールプロパティ |
| 7 | OpenSolaris ネバダ b68 | ZIL: 個別のインテントログデバイスを指定する機能を追加 |
| 8 | OpenSolaris ネバダ b69 | zfs(1M) 管理タスクを一般ユーザーに委任する機能 |
| 9 | OpenSolaris ネバダ b77 | CIFSサーバーのサポート、データセットのクォータ |
| 10 | OpenSolaris ネバダ b77 | デバイスは「キャッシュデバイス」としてストレージプールに追加できます |
| 11 | OpenSolaris ネバダ b94 | zpool スクラブ / リシルバー パフォーマンスの向上 |
| 12 | OpenSolaris ネバダ b96 | スナップショットのプロパティ |
| 13 | OpenSolaris ネバダ b98 | プロパティ: usedbysnapshots、usedbychildren、usedbyrefreservation、usedbydataset |
| 14 | OpenSolaris ネバダ b103 | passthrough-x aclinherit プロパティのサポート |
| 15 | OpenSolaris ネバダ b114 | プロパティ: userquota、groupquota、usuerused、groupused。FS v4 でも必須 |
| 16 | OpenSolaris ネバダ b116 | STMFプロパティのサポート |
| 17 | OpenSolaris ネバダ b120 | トリプルパリティ RAID-Z |
| 18 | OpenSolaris ネバダ b121 | ZFSスナップショットは |
| 19 | OpenSolaris ネバダ b125 | ZFSログデバイスの削除 |
| 20 | OpenSolaris ネバダ b128 | 同時にリリースされたZFSプールバージョン21のZFS重複排除プロパティをサポートするために必要なzle圧縮アルゴリズム |
| 21 | OpenSolaris ネバダ b128 | 重複排除 |
| 22 | OpenSolaris ネバダ b128 | zfs 受信プロパティ |
| 23 | OpenSolaris ネバダ b135 | スリムZIL |
| 24 | OpenSolaris ネバダ b137 | システム属性。シンボリックリンクが独自のオブジェクトタイプになりました。FS v5 も必要です。 |
| 25 | OpenSolaris ネバダ b140 | プール洗浄と再シルバー化の統計の改善 |
| 26 | OpenSolaris ネバダ b141 | スナップショット削除のパフォーマンスが向上 |
| 27 | OpenSolaris ネバダ b145 | スナップショット作成のパフォーマンスが向上しました(特に再帰スナップショット) |
| 28 | OpenSolaris ネバダ b147 | 複数の仮想デバイスの置き換え |
注: 2005年のSolaris 10のリリース以降、Sunが開発していたSolarisバージョンのコードネームは「Nevada」で、OpenSolarisのコードベースから派生したものです。「Solaris Nevada」は、最終的にSolaris 10の後継となる次世代Solaris OSのコードネームで、この新しいコードは、新しいOpenSolaris「Nevada」スナップショットビルドに次々と取り入れられました。[ 101 ] OpenSolarisは現在は廃止され、OpenIndianaが そこからフォークしました。 [ 102 ] [ 103 ] OpenSolarisの最終ビルド(b134)は、 Solaris 11 Express へのアップグレードパスとしてOracle(2010年11月12日)によって公開されました。
ZFS をサポートするオペレーティング システム、ディストリビューション、アドオン、サポートされる zpool バージョン、およびそれらがベースとする Solaris ビルド (存在する場合) のリスト:
| OS | Zpoolバージョン | Sun/Oracle ビルド番号 | コメント |
|---|---|---|---|
| Oracle Solaris 11.4 | 49 | 11.4.51 (11.4 SRU 51) [ 104 ] | |
| Oracle Solaris 11.3 | 37 | 0.5.11-0.175.3.1.0.5.0 | |
| Oracle Solaris 10 1/13 (U11) | 32 | ||
| Oracle Solaris 11.2 | 35 | 0.5.11-0.175.2.0.0.42.0 | |
| Oracle Solaris 11 2011.11 | 34 | b175 | |
| Oracle Solaris Express 11 2010.11 | 31 | b151a | テストのみのライセンス |
| オープンソラリス2009.06 | 14 | b111b | |
| OpenSolaris (最終開発) | 22 | b134 | |
| オープンインディアナ | 5000 | b147 | illumosに基づくディストリビューション。ビルドコード 'b151a' という名前が衝突する |
| ネクセンタコア 3.0.1 | 26 | b134+ | GNUユーザーランド |
| NexentaStorコミュニティ 3.0.1 | 26 | b134+ | 最大18 TB、Web管理 |
| NexentaStorコミュニティ 3.1.0 | 28 | b134+ | GNUユーザーランド |
| NexentaStorコミュニティ 4.0 | 5000 | b134+ | 最大18 TB、Web管理 |
| ネクセンタストアエンタープライズ | 28 | b134 + | 無料ではありません、ウェブ管理者 |
| GNU/kFreeBSD "Squeeze" (サポート対象外) | 14 | パッケージ「zfsutils」が必要です | |
| GNU/kFreeBSD "Wheezy-9" (サポート対象外) | 28 | パッケージ「zfsutils」が必要です | |
| フリーBSD | 5000 | ||
| zfs-fuse 0.7.2 | 23 | パフォーマンスの問題に悩まされ、廃止された | |
| Linux 上の ZFS 0.6.5.8 | 5000 | 0.6.0リリース候補にはPOSIXレイヤーがあります | |
| KQ Infotech の Linux 上の ZFS | 28 | 廃止。Linux上のLLNL対応ZFSに統合されたコード | |
| ベレニクス0.8b1 | 14 | b111 | 小型のライブCDディストリビューション。かつてはOpenSolarisをベースにしていた。 |
| シリックス0.7.2 | 28 | b147 | 小型ライブCDディストリビューション。OpenSolarisベースの SchillX-ON 0.8.0として |
| StormOSの「雹」 | かつてはNexenta Core 2.0+、Debian Linuxをベースにしていたが、Dyson OSに置き換えられた。 | ||
| ジャリス | 日本語版Sola risディストリビューション。かつてはOpenSolarisをベースにしていた。 | ||
| ミラックス 0.5 | 20 | b128a | 小型のライブCDディストリビューション。かつてはOpenSolarisをベースにしていた。 |
| フリーNAS 8.0.2 / 8.2 | 15 | ||
| フリーNAS 8.3.0 | 28 | FreeBSD 8.3 ベース | |
| FreeNAS 9.1.0以降 | 5000 | FreeBSD 9.1以降に基づく | |
| シグマNAS 11.4.0.4/12.2.0.4 | 5000 | FreeBSD 11.4/12.2 ベース | |
| コロナ 4.5.0 | 22 | b134 | KDE |
| EON NAS (v0.6) | 22 | b130 | 組み込みNAS |
| EON NAS (v1.0ベータ) | 28 | b151a | 組み込みNAS |
| ナップイット | 28/5000 | イルモス/ソラリス | ストレージアプライアンス; OpenIndiana (Hipster)、OmniOS、Solaris 11、Linux (ZFS 管理) |
| オムニOS CE | 28/5000 | illumos-OmniOS ブランチ | Illumos をベースにした、コミュニティ主導の最小限の安定/LTS ストレージサーバーディストリビューション |
| スマートOS | 28/5000 | イルモス b151+ | Illumosに基づく最小限のライブ配信(USB/CD ブート)、クラウドおよびハイパーバイザーの使用 (KVM) |
| macOS 10.5、10.6、10.7、10.8、10.9 | 5000 | MacZFS経由。OS XではOpenZFSに置き換えられた。 | |
| macOS 10.6、10.7、10.8 | 28 | ZEVO経由。OS XではOpenZFSに置き換えられた。 | |
| ネットBSD | 22 | ||
| ミッドナイトBSD | 6 | ||
| プロクスモックスVE | 5000 | 2014年からネイティブサポート、pve.proxmox.com/wiki /ZFS_on_Linux | |
| Ubuntu Linux 16.04 LTS+ | 5000 | インストール可能なバイナリモジュールによるネイティブサポート、wiki.ubuntu.com/ZFS | |
| ZFSGuru 10.1.100 | 5000 |
接頭辞の中で私たちが気に入ったのは「ゼッタ」でした(「ヨッタ」は論外でした)。
そこで最終的に、名前をZFSに戻すことにしました。ZFSは特に意味を持つものではありません。
仮想デバイスはネストできないため、ミラーまたはraidz仮想デバイスにはファイルまたはディスクのみを含めることができます。ミラーのミラー(またはその他の組み合わせ)は許可されません。