GEOM RAID3を使ってみる

GEOM

今回は GEOM による RAID3 について纏めてみたいと思います.
RAID3 は複数のディスクに対して分散してデータを書き、耐障害性の為パリティデータを1本のディスクに保持する冗長方式です.
3本以上のディスクが必要になり GEOM RAID3 の場合は 3, 5, 9, 17 と 2のn乗 +1 の数量が必要となります.

SPONSORED LINK

GEOM RAID3 のイメージ

RAID3 のイメージはこのような形です.ディスク3本の場合,5本の場合を表しています.

GEOM RAID3 の利用・管理

GEOM RAID3 は graid3 というコマンドを通じて利用・管理を行います.簡単に触れますが,詳細はコマンドのオプションの詳細は FreeBSD の マニュアル「graid3」を見てください.

# graid3
usage: graid3 clear [-v] prov ...
       graid3 configure [-adfFhnrRvwW] name
       graid3 dump prov ...
       graid3 insert [-hv] <-n number> name prov
       graid3 label [-hFnrvw] [-s blocksize] name prov prov prov ...
       graid3 rebuild [-v] name prov
       graid3 remove [-v] <-n number> name
       graid3 stop [-fv] name ...
       graid3 help
       graid3 list [-a] [name ...]
       graid3 status [-ags] [name ...]
       graid3 load [-v]
       graid3 unload [-v]

gconcat, gstripe 等と違い create サブコマンドはなく,作成は label サブコマンドだけとなります.
(間違いがなくなるからこれでいいと思います)

RAID3 ボリュームを作成してみる

RAID3 ボリュームを作成してマウントするまでの流れを以下に記載します.

先に geom_raid3 カーネルモジュールをロードします.
その後,graid3 label コマンドで ディスク da1,da2,da3 を指定して RAID3 ボリュームの raid3-0 を作成します.

# kldload geom_raid3

# kldstat
Id Refs Address                Size Name
 1   10 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff82319000     3218 intpm.ko
 3    1 0xffffffff8231d000     2180 smbus.ko
 4    1 0xffffffff82320000     7490 vmci.ko
 5    1 0xffffffff82328000     d788 geom_raid3.ko

# graid3 label raid3-0 da1 da2 da3

再起動時に必ず有効になるように明示的にロードさせる事をお勧めします.

# cat /boot/loader.conf
geom_raid3_load="YES"

graid3 status コマンドでステータスを表示できます.
以下は raid3-0 のステータスです.da1,da2,da3 がコンポーネントとして含まれており,ステータスが COMPLETE の状態です.
COMPLETE の状態とは,この RAID3 ボリュームで指定しているディスクの同期が取れている状態となります.

# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  da1 (ACTIVE)
                         da2 (ACTIVE)
                         da3 (ACTIVE)

graid3 list コマンドで詳細を表示する事ができます.
100GB HDD 3本で構成している為,raid3-0 のボリュームが 200GB となっています.
また,da3 がパリティディスクとして指定されている事が確認できます.

# graid3 list
Geom name: raid3-0
State: COMPLETE
Components: 3
Flags: NONE
GenID: 0
SyncID: 1
ID: 2182500346
Zone64kFailed: 0
Zone64kRequested: 0
Zone16kFailed: 0
Zone16kRequested: 0
Zone4kFailed: 0
Zone4kRequested: 50
Providers:
1. Name: raid3/raid3-0
   Mediasize: 214748363776 (200G)
   Sectorsize: 1024
   Mode: r0w0e0
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 0
   Type: DATA
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 1
   Type: DATA
3. Name: da3
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Flags: NONE
   GenID: 0
   SyncID: 1
   Number: 2
   Type: PARITY

newfs でファイルシステムを作成します.指定するデバイスは GEOM RAID3 の場合は /dev/raid3 以下に指定した名前のデバイスファイルが作成されますので,これを指定します.
今回は作成の際に raid3-0 を名前としたため,/dev/raid3/raid3-0 がデバイスファイルとなります.

# newfs /dev/raid3/raid3-0
/dev/raid3/raid3-0: 204800.0MB (419430392 sectors) block size 32768, fragment size 4096
        using 328 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944,
 32011392, 33291840, 34572288, 35852736, 37133184, 38413632, 39694080, 40974528, 42254976, 43535424, 44815872, 46096320,
....

マウントおよびマウントの結果です./mnt にマウントをしています.

# mount /dev/raid3/raid3-0 /mnt

# df
Filesystem         1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2          19279260 2591140  15145780    15%    /
devfs                      1       1         0   100%    /dev
/dev/raid3/raid3-0 203123604       8 186873708     0%    /mnt

IOについて確認してみる

RAID3 はデータは分散して書き込み,パリティを1本が受け持つ形となります.従ってすべてのディスクに IO がかかるのですが,実際にどの様な IO が発生しているのかを確認してみます.

dd でランダムデータを生成,random.img としてファイル書き込みの IO を発生させました.
見て頂くと分かる通り da1 と da2 の両方に IO がかかっています.
このことから,分散してのディスクの読み書きが行われる事が分かります.

# dd if=/dev/random of=/mnt/random.img

# iostat -n 4 2
       tty             da0              da1              da2              da3             cpu
 tin  tout KB/t  tps  MB/s  KB/t  tps  MB/s  KB/t  tps  MB/s  KB/t  tps  MB/s  us ni sy in id
   1    79 18.7    2   0.0   169    4   0.7   169    4   0.7   172    4   0.7   0  0  1  0 99
   0   285  0.0    0   0.0   256   35   8.9   256   35   8.7   256   31   7.9   1  0  6  0 93
   0   177  0.0    0   0.0   255  132  32.8   255  137  34.0   255  136  33.8   1  0 28  0 71
   0   113  0.0    0   0.0   256   65  16.2   256   56  14.0   256   60  15.0   1  0 12  0 87
   0   109  0.0    0   0.0   240   22   5.2   243   28   6.6   242   25   6.0   0  0  5  0 95

# ls /mnt
.snap           random.img

イメージとしてはこのような形ですね.

障害発生時のディスク交換手順 (完全に見えなくなった場合)

ディスクが故障した際に,交換,リビルドが必要になります.
今回は da1 が故障したというシチュエーションで復旧を試みます.

障害の状態によりますが,ディスクが停止してしまったなどが発生すると status サブコマンドの結果はこのように DEGRADED となり,da1 の表記が無くなります.

# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da2 (ACTIVE)
                         da3 (ACTIVE)

このような場合は新しいディスクに交換後 insert サブコマンドを使用して組み込みを行います.
組み込みが成功すると status サブコマンドでリビルドが実行されている事が確認できます.

# graid3 insert raid3-0 da1

# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da2 (ACTIVE)
                         da3 (ACTIVE)
                         da1 (SYNCHRONIZING, 2%)

リビルドが完了すると status サブコマンドの結果は COMPLETE になります.

# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  da2 (ACTIVE)
                         da3 (ACTIVE)
                         da1 (ACTIVE)

自発的にディスクを交換する (メディアエラー等の不調の場合)

ディスクが突然見えなくなるという障害より,セクター不良等のメディアエラーの障害のケースが多いと思います.
ここでは,自発的にディスクを交換する手順を説明します.

メディアエラーが出たとしても即 DEGRADED になるわけではありません.
以下のようにステータス上は問題が無いとしても例えば messages や dmesg で da2 にエラーの兆候が出てたとします.

# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  da2 (ACTIVE)
                         da3 (ACTIVE)
                         da1 (ACTIVE)

エラー例
(da2:ahcich3:0:0:0): WRITE_FPDMA_QUEUED. ACB: 61 08 e0 4d 50 40 5a 01 00 00 00 00
(da2:ahcich3:0:0:0): CAM status: Command timeout
(da2:ahcich3:0:0:0): Retrying command, 3 more tries remain

まずは da2 を取り外します.取り外すにあたって list サブコマンドを利用してディスク番号を確認します.
この場合,da2 は 1 になります.

# graid3 list
Geom name: raid3-0
State: COMPLETE
Components: 3
Flags: NONE
GenID: 0
SyncID: 1
ID: 2182500346
Zone64kFailed: 0
Zone64kRequested: 990
Zone16kFailed: 0
Zone16kRequested: 1205
Zone4kFailed: 0
Zone4kRequested: 2141
Providers:
1. Name: raid3/raid3-0

Consumers:
1. Name: da2
   Number: 0

2. Name: da3
   Number: 1

3. Name: da1
   Number: 2

続いて remove サブコマンドで取り外します.
取り外すとステータスは DEGRADED に変化します.

# graid3 remove -n 1 raid3-0

# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da3 (ACTIVE)
                         da1 (ACTIVE)

新しいディスクに交換後 insert サブコマンドを使用して組み込みを行います.
組み込みが成功すると status サブコマンドでリビルドが実行されている事が確認できます.

# graid3 insert raid3-0 da2

# graid3 status
         Name    Status  Components
raid3/raid3-0  DEGRADED  da3 (ACTIVE)
                         da1 (ACTIVE)
                         da2 (SYNCHRONIZING, 1%)

リビルドが完了すると status サブコマンドの結果は COMPLETE になります.

# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  da3 (ACTIVE)
                         da1 (ACTIVE)
                         da2 (ACTIVE)

ディスクを拡張する

GEOM MIRROR のように玉突きで大きなディスクに入れ替えていって拡張が出来るか確認してみましたが,どうやら出来ないようです.
ディスクの入れ替えは出来ますが,プロバイダー側デバイス (今回だと raid3-0) を拡張する方法がありませんでした.
GEOM CONCAT と組み合わせて拡張することは可能です.やり方は RAID10 と同様ですので「GEOM STRIPE + MIRROR で RAID10 を構成してみる」を参考にしてください.

GEOM RAID3 デバイスを終了 (破壊) する

ファイルシステムとして用済みになった.であったり,別用途に転用する為に初期化したい場合を説明します.

当然ながら,ファイルシステムはアンマウントする必要があります.
また,STRIPE や MIRROR の場合は destroy サブコマンドがあったのですが,RAID3 には存在しません.
従って stop で停止させる.という方法になります.

# graid3 stop raid3-0

# graid3 status

もし間違って stop した場合ですが,ドキュメントだと load で再度読み込めるはずですが失敗します.再起動実施の上で load を行えば読み込めます.
再起動を行わずに復活させたい場合は再度 label を同じ引数で渡すことで復活させる事が可能です.
やらかしてしまった… という事案の場合は慌てずにそっと元に戻しましょう.

# graid3 label raid3-0 da1 da2 da3

# graid3 status
         Name    Status  Components
raid3/raid3-0  COMPLETE  da1 (ACTIVE)
                         da2 (ACTIVE)
                         da3 (ACTIVE)

# mount /dev/raid3/raid3-0 /mnt

# ls /mnt
.snap           random.img

以上で GEOM RAID3 の紹介を終わります.

コメント

タイトルとURLをコピーしました