FreeBSD で ZFS を利用する – ZFS 概要

ZFS

ZFS はボリュームの管理とファイルシステムの管理・提供を統合したストレージシステムです.
2001年に Sun Microsystems によって開発・提供されてきました.当時より CDDL というライセンスでオープンソースとして提供されていたため,様々な OS に組み込まれました.
FreeBSD では 7.0 より ZFS が利用可能となっています.
その後,Sun Microsystems は Oracle に買収され,ZFS はクローズドソースとなりました.この際オープンソースプロジェクトとして OpenZFS が引き継いでいます.

ですので,Solaris の ZFS とその他の ZFS では違いが生じているものと思われます.ここでは FreeBSD が利用している ZFS (OpenZFS) をベースに解説していきます.

特徴

ZFS の特徴について解説します.

拡張性・柔軟性が高い

ZFS は 128bit のアドレスを持ちます.現状その他のファイルシステムの多くは 64bit までの為,最大ファイルサイズが 16TB や 255TB までという制限がありますが,ZFS は 16EB (エクサバイト) と何年後にその領域にたどり着くのかというほどの空間を持ちます.

ZFS はボリュームとファイルシステムの管理を統合しています.ハードディスクや SSD などのディスクドライブをストレージプール (以降,プール) という箱に投入し,プールから必要なリソース (ファイルシステム) を切り出して利用します.
Linux の LVM もこれに近い状態ですが,LVM で切り出せるのはボリュームのみで,ボリュームに対しては別途ファイルシステムを作成する必要があります.
ちなみに,ZFS もボリュームとしての切り出しも可能です.

プールとファイルシステムの関係はこのようなイメージになります.

ストレージプール

プールへディスクを追加して切り出す.と説明しましたが,プール自体が多機能なものであり,冗長性・拡張性を持たせることが可能です.
プールの構成としては RAID レベルでいう所の RAID0,RAID5,RAID6 RAID7? 相当の機能を持たせることが可能です.
また,後でディスクをどんどんプールに追加して大きなプールへ拡張していくことも可能です.

プールと RAID (冗長性) のについて以下解説していきます.

ストライピングプール

冗長性を持たず RAID0 相当になるプールです.どれか一つのディスクに障害が起きた場合プール全体が破損状態となりますのでサービス用途には向きません.
一つのディスクから作成することができますので OS 領域を ZFS 化する場合はこの構成になっていることはあります.

ミラーリングプール

RAID1+0 のような構成です.イメージでは2面ミラーですが3面ミラーなども可能です.プールを拡張する際はミラーセットの単位で拡張することになります.
2面ミラーの場合は2つのディスクずつ追加していくイメージです.
耐障害性・速度の面で優れていますが,多くの場合は次の RAIDZ の構成を採用するケースが多いのかなと思います.

RAIDZ プール

RAID5 相当のプールです.通常の RAID5 と違う点は後でも説明しますが可変長のブロックサイズであり必ず全ディスクに書くような仕組みになっております.
RAIDZ は最低3台から構成することが可能です.一つの RAIDZ セットにいくつものディスクを接続可能ですが MTBF の観点からハードディスクの場合は 5台 が現実的かと思います.

RAIDZ2 プール

RAID6 相当のプールです.RAIDZ と同様の特徴を持ち,パリティとして2つのディスクが用いられます.
RAIDZ2 は最低4台のディスクが必要です.パリティを複数持つため MTBF の観点から10台以上のディスクを纏めて利用しても RAIDZ と同じレベルの故障率になります.

RAIDZ3 プール

RAID7 (という言葉はありませんが…) 相当のプールです.こちらも RAIDZ と同様の特徴を持ち,パリティとして3つのディスクが用いられます.
RAIDZ3 は最低5台のディスクが必要です.MTBF の観点では20台以上のディスクを一つのセットでも RAIDZ 相当の故障率になります.

堅牢性

ZFS はデータの書き込み時 CoW (コピーオンライト) の方式を採用しています.これはデータを直接書き換えるわけではなく,データをコピーしてコピーされた側のデータを書き換えてポインターを修正する.という方式です.間接するデータも同様の処理が行われます.

この一連のトランザクションによってデータの一貫性が保たれる形となり,書き込み途中でのトラブルが発生した場合でも元データは損傷しません.

イメージは以下のようになります.

ZFS はチェックサムによるデータ状態の確認も行われています.他のファイルシステムでもブロックレベルでのチェックサムを行っているものがありますが,ZFS はエンドツーエンドでチェックサムを計算しています.
イメージは以下のようになります.

チェックサムエラーが発生した場合,正しいデータが存在していればそれをもとにした修復が自動的に行われます.
ブロック単位のチェックサムと ZFS のチェックサムの挙動の違いは次のようなイメージになります.

ブロック単位のチェックサムの場合

ZFS の場合

豊富な機能

ZFS は様々な機能を提供しています.代表的なものを以下に記載します.

スナップショット

スナップショットとは,Windows の「以前のバージョン」や Mac の「タイムマシーン」のようなある時の状態を保持する機能です.
この機能を持つストレージは ZFS 以外にもありますがファイルシステムレベルで持ち,かつ数事実上無制限に取得できるストレージはなかなかありません.

クローン

クローンとは,ある時点の ZFS ファイルシステム (スナップショット) を別のファイルシステムとしてコピーする機能です.
スナップショットは読み取り専用ですが,クローンされたファイルシステムは読み書き可能な状態となります.

ローカルコピー/リモートコピー

ZFS はローカルやリモートに ZFS イメージとしてコピーを行うことが可能です.NetApp などエンタープライズストレージのレプリケーションと同等な機能が利用できると考えてください.

同一プール内でのレプリケーション (ローカルコピー)

ストレージプール内でレプリケーションを行うことが可能です.この場合はクローンに近い状態となりますが,格納データはクローンとは違って独立しています.

プール間でのレプリケーション (ローカルコピー)

ストレージプールをまたいだレプリケーションを行うことが可能です.プールが違うためバックアップの一環として用いることが可能です.
通常,ローカルコピーと言ったらこの方式になるのかと思います.

ホスト間でのレプリケーション (リモートコピー)

ホスト間でもレプリケーションを行うことが可能です.ホスト (プールも) が違うためバックアップの一環として用いることが可能です.
もちろん,遠隔地にレプリケーションを行うということも可能です.

容量制限 (クォータやリザーブ)

ディレクトリークォータ,ユーザークォータ機能および容量のリザーブ(予約)の機能が利用可能です.
切り出すファイルシステムに対しての容量制限をかける.また,最低容量を予約する.であったり,グループ,ユーザーに対しての容量制限を設けることができます.

圧縮

ストレージレベルでの圧縮が利用可能です.複数の圧縮方式から任意の方式を選択可能です.現時点で利用可能な圧縮方式は lz4,gzip,lzjb,zle,zstd になります.
圧縮する・しない をファイルシステム単位で制御することが可能です.

重複排除

重複排除は A と B のファイルのデータの重複部分 (同じ部分) は纏めてストレージに記録・管理し,違いがある箇所は各々記録するという機能です.ZFS はこれも利用が可能です.
注意としては大量のメモリーを必要とすることです.

以上,ZFS の概要について解説しました.次回以降は ZFS を構成~使用してみるという所を纏めていきます.

コメント

タイトルとURLをコピーしました