FreeBSDでZFSを使用するときに気を付けたいこと
はじめに
弊社ではFreeBSD(をベースとしたアプライアンスであるXigmaNAS)とZFSを使用してどの逸般の誤家庭にもあるようなファイルサーバを運用しています。
構築する際に参考になるようなページがもっと増えればいいかなと思いまとめておこうと思います。
ZFSの概要
ZFSは頂点にzpoolが存在し、このストレージプールを用途に合わせて分割して使用します。
zpoolは複数のvdevから構成され、vdevに複数のHDDが属するイメージですね。
さて、ZFSはその堅牢性を強調されることが多いですが、その冗長性がどこで担保されているかというとvdev単位で担保されています。 イメージとしてはvdevをストライピングしてzpoolを構成している感じです。
そのため、zpoolを構成するvdevが1つでもアクセス不可能になるとプール全体が崩壊します。
プールのエクスポートとインポート
ZFSのプールは可搬性があり、エクスポート後HDD群をそのままそっくり新しい筐体に移動してインポートすればそのまま新しい筐体で認識されます。*1 そのため、XigmaNASのようなアプライアンスを使用している場合であれば最悪ブートディスクが壊れても、新しいブートディスクを用意してインポートしなおせば何とかなります。
なので、純粋なファイルサーバとして運用するならデータ用のHDDの健全性に気をつけておけば大丈夫です。
mirror・RAID-Z1・RAID-Z2
ZFSのストレージプール構成はそれぞれmirror・RAID-Z(1)・RAID-Z2がありますが、どれが良いのでしょうか。
一概には言えませんが、弊社の個人的な意見としては10TBを超えるような大容量なプールが欲しい等の明確な理由がなければとりあえずミラー構成が良いと考えています。
RAID-Zでは現状トップレベルのvdevの削除が出来ませんが、ミラー構成なら削除が出来ます。 これは以下の点においてメリットとなります。
現状唯一スケールダウンができる構成です。 RAID-ZであればHDDのリプレースも同等サイズかそれ以上を維持しなくてはならず、初期の見積もりを過大評価してしまった場合でもHDD交換の際は大容量のHDDで交換しなければいけませんが、ミラー構成であれば小さいサイズのHDDで置き換えることが可能です。
また、スケールアップする際も、RAID-ZではHDDを1本ずつreplace → resilverしなくてはなりませんが、ミラー構成であればvdevとして新しいHDDを投入後、古いvdevを除去するコマンドを投入すれば古いvdevをリタイアさせるところまでやってくれます。
どの構成でも初期の見積もりを誤ると傷口が大きいですが、ミラー構成なら比較的つらみポイントは低めってことです。
まずは100GB×2のミラー構成でプールを作成します。
% doas gpart create -s gpt da1 da1 created % doas gpart add -t freebsd-zfs -l hdd-1 -a 4k -s 98g da1 da1p1 added % doas gpart create -s gpt da2 da2 created % doas gpart add -t freebsd-zfs -l hdd-2 -a 4k -s 98g da2 da2p1 added % doas gpart show -l da1 => 40 209715120 da1 GPT (100G) 40 205520896 1 hdd-1 (98G) 205520936 4194224 - free - (2.0G) % doas gpart show -l da2 => 40 209715120 da2 GPT (100G) 40 205520896 1 hdd-2 (98G) 205520936 4194224 - free - (2.0G) % doas zpool create tank mirror gpt/hdd-1 gpt/hdd-2 % zpool status tank pool: tank state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 gpt/hdd-1 ONLINE 0 0 0 gpt/hdd-2 ONLINE 0 0 0 errors: No known data errors
分かりやすいように適当なファイルを作っておきます。
% doas touch /tank/msg.txt % doas vi /tank/msg.txt % cat /tank/msg.txt Our Spirit, Our Evolution
50GB×2のミラーvdevを追加します。
% doas gpart create -s gpt da3 da3 created % doas gpart add -t freebsd-zfs -l hdd-3 -a 4k -s 48g da3 da3p1 added % doas gpart create -s gpt da4 da4 created % doas gpart add -t freebsd-zfs -l hdd-4 -a 4k -s 48g da4 da4p1 added % doas gpart show -l da3 => 40 104857520 da3 GPT (50G) 40 100663296 1 hdd-3 (48G) 100663336 4194224 - free - (2.0G) % doas gpart show -l da4 => 40 104857520 da4 GPT (50G) 40 100663296 1 hdd-4 (48G) 100663336 4194224 - free - (2.0G) % doas zpool add tank mirror gpt/hdd-3 gpt/hdd-4 % zpool status pool: tank state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 gpt/hdd-1 ONLINE 0 0 0 gpt/hdd-2 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 gpt/hdd-3 ONLINE 0 0 0 gpt/hdd-4 ONLINE 0 0 0 errors: No known data errors
100GB×2のvdevを取り除きます。
% zpool remove -n tank mirror-0 Memory that will be used after removing mirror-0: 2.34K % doas zpool remove tank mirror-0 % zpool status pool: tank state: ONLINE scan: none requested remove: Removal of vdev 0 copied 288K in 0h0m, completed on Fri Jan 1 15:40:46 2021 1008 memory used for removed device mappings config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 gpt/hdd-3 ONLINE 0 0 0 gpt/hdd-4 ONLINE 0 0 0 errors: No known data errors
先ほど作ったファイルに引き続きアクセスできます。
% cat /tank/msg.txt Our Spirit, Our Evolution
GPTパーテーションラベル
zpoolにデバイスを追加する際は、ada0
のようなデバイス名ではなく上の例のようにGPTパーテーションラベルを使うといいってFreeBSD Journalに書いてありました。
詳しくは上記の記事を読んでいただくとして、要点からいうと以下が理由となります。
ちなみに弊社の環境では、f01-W▓▓▓▓▓▓▓のような規則を使用しています。
- f:フロントベイ
- 01:ベイの番号
- W▓▓▓▓▓▓▓:HDDのシリアル番号
おわり
*1:幸運にもそのような事態には陥っていませんが