FreeBSDでZFSを使用するときに気を付けたいこと

はじめに

弊社ではFreeBSD(をベースとしたアプライアンスであるXigmaNAS)とZFSを使用してどの逸般の誤家庭にもあるようなファイルサーバを運用しています。

構築する際に参考になるようなページがもっと増えればいいかなと思いまとめておこうと思います。

ZFSの概要

f:id:jyuch:20210101112011p:plain

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に書いてありました。

freebsdfoundation.org

詳しくは上記の記事を読んでいただくとして、要点からいうと以下が理由となります。

  • バイス名はSATAケーブルを刺す場所が変わると変わっちゃうから扱いずらいよね
  • パーテーションラベルの命名規則をちゃんとしておけば壊れたデバイスが一発で分かるから便利だよね

ちなみに弊社の環境では、f01-W▓▓▓▓▓▓▓のような規則を使用しています。

  • f:フロントベイ
  • 01:ベイの番号
  • W▓▓▓▓▓▓▓:HDDのシリアル番号

おわり

*1:幸運にもそのような事態には陥っていませんが