この話の続きです。
ZFSの特徴の一つにチェックサムを保管しエラーを検出する機能があります。しかしエラーを検出できたとしても、この例のようにZFSが自動でエラーを修正してくれるためには単純なZFSプールではうまくいきません。壊れたデータを書き直すための正しいデータを持った部分が無いと復旧できないわけで、そのためにプールに冗長構成を持たせる必要があります。冗長構成になっていれば、ZFSはエラーが発生したブロックを破棄し、正常なブロックからデータを自動で復旧してくれます。
ご存知の通り、ストレージシステムに冗長構成を持たせるためにはRAID5, 6やミラー(RAID1)などがありますが、ZFSでの冗長構成のストレージシステムを構成する方法に付いて以下に順に記載します。
RAIDZの作成
ディスクが3台以上ある場合は、RAIDZ (あるいはRAIDZ2、RAIDZ3)を構成するのが適正でしょう。この例では、3台のUSB HDDを使い、RAID構成にしています。
da0からda2までの3台のディスクがある場合のRAIDZのZFSプールを作るには次のように行います。
GPTでディスクを初期化。
$ gpart destroy -F da0 ; gpart create -s gpt da0
$ gpart destroy -F da1 ; gpart create -s gpt da1
$ gpart destroy -F da2 ; gpart create -s gpt da2
GPTでZFS用のパーティションを作成する。
$ gpart add -t freebsd-zfs -l usbdisk0 da0
$ gpart add -t freebsd-zfs -l usbdisk1 da1
$ gpart add -t freebsd-zfs -l usbdisk2 da2
USB HDDが3台初期化できたら、あとはRAIDZでZFSプールを作る。
$ zpool create -O atime=off -O compression=lz4 ztank raidz gpt/usbdisk0 gpt/usbdisk1 gpt/usbdisk2
ここでは -O で atimeをoffにし、圧縮アルゴリズムに lz4 を指定しています。
ZFS用パーティション作成時の注意点
ZFS用パーティションを作る場合、必ず -l オプションを指定し、それぞれのディスクに個別のラベルを作成しておくことがとても重要です。特にUSBディスクの場合起動時に0,1,2の順番がどうなるか保証されないため、ラベルが無いと1台のディスクが故障した場合に、故障したディスクを特定するのがとても困難となります。もちろんHDDユニットにもラベル名を物理的に記入しておくことが重要です。
実際にUSBのディスクを初期化するときは、ディスクの対応を確実にするために予めディスクを外した状態で、ディスクを1台づつ順に接続してZFS用パーティションを作成、つまりディスクを1台接続しては次の作業を3回繰り返すことになります。
$ gpart destroy -F daX ; gpart create -s gpt daX; gpart add -t freebsd-zfs -l usbdiskX daX
USB HDDに限らずSASのディスク等でも、ドライブの増減によってデバイス番号が変わるので、ラベル付けはとても重要と言えます。
ZFSミラープールの作成
ディスクが2台の場合は、ミラー構成にするのが良いでしょう。
GPTでミラー用パーティションの作成
$ gpart destroy -F da0 ; gpart create -s gpt da0 ; gpart add -t freebsd-zfs -l usbdisk0 da0
$ gpart destroy -F da1 ; gpart create -s gpt da1 ; gpart add -t freebsd-zfs -l usbdisk1 da1
ZFSミラープールの作成
$ zpool create -O atime=off -O compression=lz4 ztank mirror gpt/usbdisk0 gpt/usbdisk1
ディスク1台のZFSで冗長性を持たせる
RAIDやミラーにはディスクが複数台必要ですが、ZFSではディスク1台でもデータに冗長性を持たせる仕組みが用意されています。もちろんディスクが物理的に回転しなくってしまうような故障に対しては無力ですが、部分的なメディアエラーに対しては十分有効な方法と言えます。
これを有効にするにはZFSプロパティの copies を指定します。デフォルトは1でデータの冗長性は無い状態ですが、2 または 3 を指定することで、同じディスク内の別の場所に、指定した数に応じたデータの複製を用意してくれます。
ZFS作成時に copies を指定する
$ zfs create -o copies=2 -o compression=lz4 -o atime=off zroot/tank
copies に 2 や 3を指定すると、当然のことながら書き込みに2倍、3倍の時間が必要になり、実質の記憶容量もそれぞれ半分、3分の1となりますが、冗長構成の代償なのでそこは割り切りましょう。copies は、ディスクが1台しか内蔵できないノートPC等では極めて有効な手段と言えます。
また copies は ZFS のプロパティなので、既存のZFSに対して後から設定変更でますが、copiesを 1 から 2 に変更してもその後書き込まれる部分にのみ有効で、すでに書き込み済みの所には影響しないのでご注意ください。