zfsのI/Oパフォーマンス向上のためにSSDを組み合わせる、 というのが一般的だが、SSDの壊れ方(いきなりボン)に遭遇したときに poolにアクセスできるのか、軽く試してみた。
実機では面倒なのでvm-bhyve環境で。 configファイルでのdisk設定はこう。
disk0_type="ahci-hd" disk0_name="disk0.img" # システムディスク = ada0 disk1_type="ahci-hd" disk1_name="cache.img" # L2ARC用 = ada1 disk2_type="ahci-hd" disk2_name="ramdisk.img" # ZIL用 = ada2
disk2(ZIL用)の ramdisk.img はtmpfs上のファイルへの symlink で作成したのだが書き込み全く速くならなかったのでここでは無視。 ゲストで作成した zpool=zt0 はこう。
zpool status zt0
NAME STATE READ WRITE CKSUM
zt0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
zpool add zt0 cache ada1 zpool status zt0 NAME STATE READ WRITE CKSUM zt0 ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 cache ada1 ONLINE 0 0 0
この状態でゲストに tar.gz ファイルをガリガリ書かせている途中、 ホスト側で vm poweroff する。
SSDがイカレて次のデバイスも用意できない場合を想定。 configファイルから disk をコメントアウト
disk0_type="ahci-hd" disk0_name="disk0.img" # システムディスク = ada0 #disk1_type="ahci-hd" #disk1_name="cache.img" # L2ARC用 = ada1 #disk2_type="ahci-hd" #disk2_name="ramdisk.img" # ZIL用 = ada2
そして起動。ちゃんと起動する。
zpool status
NAME STATE READ WRITE CKSUM
zt0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
cache
3837179185207539351 UNAVAIL 0 0 0 was /dev/ada1
このまま zpool remove zt0 3837179185207539351 すれば何事もなく使えるだろうが、しばらく使ったあと、新品SSDを 差した場合を想定してサイズを変えた cache.img を作ってゲスト起動。
zpool status
NAME STATE READ WRITE CKSUM
zt0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
cache
ada1 ONLINE 0 0 0
行けた。まあキャッシュだから大丈夫やね。
SSDのデータが化けた場合を想定。
同様にゲストでファイルを書かせている途中で vm poweroff。 そのあと、ディスクイメージファイルを同じサイズのままゼロクリア。 ゲスト起動。
zpool status
NAME STATE READ WRITE CKSUM
zt0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
cache
3837179185207539351 UNAVAIL 0 0 0 was /dev/ada1
なるほど、ada1は存在するものの今度はUNAVAILになった。 一度外してつければいいのかな?
zpool remove zt0 3837179185207539351 zpool add zt0 cache ada1
はい、行けた。
実はこのとき間違えて
zpool add zt0 ada1
とやってしまってzt0プールがストライピングになって外せなくなってしまった。 そしてゲストを作り直すはめになった。こわいこわい。
さて、書き込みキャッシュはどうだ。読み込みより深刻なはず。
ゲストで大量ファイル書き込み中に vm poweroff。その後、 configファイルからZIL用diskをコメントアウトして再起動。ローダで止まる。
Mounting from zfs:zt0/ROOT/default failed with error 6. Loader variables: vfs.root.mountfrom=zfs:zt0/ROOT/default Manual root filesystem specification: <fstype>:<device> [options] Mount <device> using filesystem <fstype> and with the specified (optional) option list. eg. ufs:/dev/da0s1a zfs:tank cd9660:/dev/cd0 ro (which is equivalent to: mount -t cd9660 -o ro /dev/cd0 /) ? List valid disk boot devices . Yield 1 second (for background tasks) <empty line> Abort manual input miniroot>
ここからはどうしようもない(と思う)。いったん停めて FreeBSDインストールDVDからLiveDVDを起動する。
(ホスト)
vm -f install guest FreeBSD-11.x-RELEASE-amd64-dvd1.iso
[2]のシングルユーザモードで起動して、強制importしてみる。
zpool import -f -R /altroot zt0
The devices below are missing or corrupted, use '-m' to import the pool
anyway:
ada2 [log]
cannot import 'zt0': one or more devices is currently unavailable
「-mオプションつけろ」とのことなのでつけてみる。
zpool import -fm -R /altroot zt0 (warning多数) zpool status NAME STATE READ WRITE CKSUM zt0 DEGRADED 0 0 0 ada0p3 ONLINE 0 0 0 logs 8184467690034791332 UNAVAIL 0 0 0 was /dev/ada2
とりあえず外す、
zpool remove zt0 8184467690034791332
ゲストを再起動してみる。
halt -p vm start guest vm console guest
正常に起動した。 強制 poweroff するときに書き込んでいたものは失われている。
同様にゲストでファイルを書かせている途中で vm poweroff。 そのあと、ZIL用ディスクイメージファイルを同じサイズのままゼロクリア。 ゲスト起動。
……ローダプロンプトで止まる。あとの手順は上記といっしょ。 インストールDVDでシングルユーザモード起動して -m つき強制importのあと zpool remove でZILデバイスを外し、ゲストを再起動すると使える。
ふむ。
ということで、ZILを使うならLiveDVDを常備していないとおっかない。 その点vm-bhyve下で動くゲストなら vm start ... のかわりに vm install ... と起動すればいいので比較的安心かもしれない。いずれにせよ、 ZIL用ディスクが壊れるのは恐い。
実機(ベアメタル)で持つzfsにZIL持たすより、ゲストのzfsにZIL持たした方が 安心だな。
と、ここまで書いたところで、「ZILで書き込み速くなるのかい?」が 気になった。ゲストのZILをtmpfsで持たせても大して速くないことに気付いた。 たしかに、NFS先からの書き込みアクセスでしか恩恵がない。 NFSの先で書き込みが遅いのを解消する選択肢
それぞれに障害が起きるとしたら、前者はSSDが壊れる、 後者はHDDや電源を含めた全体的な故障でシステムが突然落ちる、 となるのだが、現時点ではシステム全体のトラブルが(なんとなく) 「多くて2、3年に1度かなあ」といった程度なのに対し、 SSDのほうは未経験で予想もつかない。さらにいえば、 HDDや電源ユニットの故障はある程度予兆があるし、突然落ちたとしても これまでの利用方法でzfsが壊れたという経験もない。 それを考えると、やはりまだSSD破損の経験がない時点では「SSDのZIL」は 恐くて足せない。そんな結論である。