FreeBSDでzfsを試してみた その2
前回の続き。
今回はmirror環境でハードディスクの追加とか削除とかをやってみる。多分raidzとかでも同じ様に出来ると思う。
# zpool create -m /zmirror zpool0 mirror da0s1 da1s1 # zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 errors: No known data errors
適当なデータの書き込み
とりあえず、なにか適当なデータを書き込んでおく。
# vim /zmirror/helloworld.rb
#!/usr/bin/env ruby p "Hello world!"
# ruby /zmirror/helloworld.rb "Hello world!"
ついでに、ベンチマークをかねて128MBのファイルを作成する。mkfileコマンドがなかったのでついでにインストールした。timeコマンドはcshの内部コマンドを使用しているので、zshとかでやるとちょっと出力のされかたが違うかもしれない。
# portinstall /usr/ports/sysutils/mkfile # time mkfile 128M sample 0.000u 0.318s 0:09.48 3.2% 5+1566k 0+0io 0pf+0w
128MBのファイルを作成するのに約10秒くらい。別にmkfileをインストールしなくてもddコマンドでも出来る。
# dd if=/dev/zero of=zero.dat count=131072 bs=1024 131072+0 records in 131072+0 records out 134217728 bytes transferred in 7.488602 secs (17922935 bytes/sec)
countの計算が面倒くさいけど、とくになにもインストールしなくていいからddのが楽だと思う。時間しか分からないけど。
参考までに、librettoのハードディスクに作成した時の結果。
# time mkfile 128M sample 0.000u 0.321s 0:07.57 4.2% 5+1661k 0+1021io 0pf+0w
ハードディスクの追加
ハードディスクを追加するにはzpool attachコマンドを使用する。とりあえず、2台でのミラーリングから3台でのミラーリングにしてみる。
# zpool attach zpool0 da0s1 da0s2
確認してみる。データの同期が完了していないとstatusとかにちゃんと出てくる。
# zpool status pool: zpool0 state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scrub: resilver in progress, 86.40% done, 0h0m to go config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 errors: No known data errors
同期が完了するまでしばらく待つ。同期が完了したらこんな感じ。
# zpool status pool: zpool0 state: ONLINE scrub: resilver completed with 0 errors on Wed Apr 16 14:17:43 2008 config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 errors: No known data errors # df -h /zmirror Filesystem Size Used Avail Capacity Mounted on zpool0 472M 128M 344M 27% /zmirror
ちゃんとmirrorに1台追加されていて、容量も変化していない。とりあえず、最初に作ったrubyファイルを実行してみる。
# ruby /zmirror/helloworld.rb "Hello world!"
ちゃんと動いた。この状態でまたベンチマークをかねて128MBのファイルを作成する。
# time mkfile 128M sample2 0.000u 0.300s 0:13.53 2.2% 5+1464k 0+0io 0pf+0w
2台の時と比べると、4秒程遅くなっている。CPU使用時間とかは殆ど変っていないので、純粋にハードディスクへの書き込み分遅くなっているのかな?
ハードディスクの削除
ハードディスクの削除にはzpool dettachコマンドを使用する。さっき追加したのとは違うハードディスクを削除してみる。
# zpool detach zpool0 da0s1
確認してみる。
# zpool status pool: zpool0 state: ONLINE scrub: resilver completed with 0 errors on Wed Apr 16 14:17:43 2008 config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 errors: No known data errors # df -h /zmirror Filesystem Size Used Avail Capacity Mounted on zpool0 472M 256M 216M 54% /zmirror
ちゃんと2台のミラーリングになっている。で、最初に作ったrubyファイルを実行してみる。
# ruby /zmirror/helloworld.rb "Hello world!"
ちゃんと動いている。
ハードディスクの交換
ハードディスクの交換にはzpool replaceコマンドを使用する。
# zpool replace zpool0 da1s1 da0s1
交換中のzpool statusはこんな感じ。
# zpool status pool: zpool0 state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scrub: resilver in progress, 50.00% done, 0h0m to go config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 replacing ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 errors: No known data errors
しばらく待つと交換が完了した。ただ、同じUSBメモリの別パーティション同士でやったら75%辺りで固まってしまった。再起動してもう一回やったら大丈夫だったけど。
# zpool status pool: zpool0 state: ONLINE scrub: resilver completed with 0 errors on Wed Apr 16 15:12:11 2008 config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 errors: No known data errors # df -h /zmirror Filesystem Size Used Avail Capacity Mounted on zpool0 472M 256M 216M 54% /zmirror
まとめ
ハードディスクの追加とかがコマンド一発で出来るのは楽でいい感じ。時間のある時にでもハードウェアRAIDとの速度比較をやってみたい。ただ、それをやれるマシンがない……
次はスナップショットとかその辺をやってみる予定。