今回は GEOM による RAID3 について纏めてみたいと思います.
RAID3 は複数のディスクに対して分散してデータを書き、耐障害性の為パリティデータを1本のディスクに保持する冗長方式です.
3本以上のディスクが必要になり GEOM RAID3 の場合は 3, 5, 9, 17 と 2のn乗 +1 の数量が必要となります.
- GEOM に関するお話
- FreeBSD GEOM 再々学習
- GEOM CONCAT (ディスクの連結) を使ってみる
- GEOM STRIPE (ストライプ/RAID0) を使ってみる
- GEOM MIRROR (ミラーリング/RAID1) を使ってみる (1)
- GEOM MIRROR (ミラーリング/RAID1) を使ってみる (2)
- GEOM STRIPE + MIRROR で RAID10 を構成してみる
- GEOM RAID3を使ってみる
- GEOM CACHE を使ってみる
- GEOM GVIRSTORを使ってみる
- GEOM GATE を使ってみる
- GEOM LABEL で名前による管理を行う
- GEOM PART でディスクパーティションの管理を行う
- GEOM MULTIPATH でマルチパスを構成する (1)
- GEOM MULTIPATH でマルチパスを構成する (2)
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 の紹介を終わります.
コメント