読者です 読者をやめる 読者になる 読者になる

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との速度比較をやってみたい。ただ、それをやれるマシンがない……
次はスナップショットとかその辺をやってみる予定。