RAID1とは
RAID(Redundant Arrays of Inexpensive Disks)とは、複数台のハードディスク(HDD)を組み合わせて、
仮想的な1台のHDDとして運用する技術であり、信頼性向上(RAID1,RAID5)や高速化(RAID0)を目的としています。
その中で、RAID1は最もシンプルなRAIDであり、複数台のHDDに同時に同じ内容を書き込むミラーリングという方法です。
RAID1は、常に記録容量の2倍の容量のHDDが必要であるという欠点はありますが、
以下のような利点があるため、信頼性が必要なサーバのHDD、
特にOSをインストールするシステムディスクにはぜひ導入しておきたい技術と言えるでしょう。
- 片方のHDDが故障しても、もう一方のHDDが正常である限り、システム全体は正常に機能する。
- 故障したHDDを交換すれば、バックグラウンドでデータの復旧が行われるため、復旧が簡単で速い。
- FreeBSD8.0上で安定して稼動するソフトウェアRAID1を提供してくれるgmirrorがある。
GMIRRORによるRAID1の組み方
GMIRRORによりRAID1を組むためには、少なくとも2台のHDDが必要です。
また、
FreeBSD8.0ソースのダウンロードおよびインストールCDの作成で述べたように、
8.0-RELEASE-*-livefs.iso のCDが必要ですので、あらかじめ準備して下さい。
HDD名称およびパーティションの確認
まず、FreeBSD8.0 をインストールしたサーバのHDDが認識されているかどうか確認します。
ここで、認識されていなければ、FreeBSD8.0がHDDインターフェースに対応していない可能性がありますので、
再度、
FreeBSD8.0でサポートされているデバイスのチェックで示した通り、
FreeBSD8.0でデバイスがサポートされているかどうか、確認して下さい。
以下の例では、480GBのHDDが2台認識されており、その名称は、"ad4"と"ad6"になっていることがわかります。
表1 "dmesg"コマンドによるHDD名称の確認
# dmesg
・・・
ad4: 476940MB <WDC WD5002ABYS-18B1B0 02.03B04> at ata2-master SATA300
ugen0.1: <Intel> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
ad6: 476940MB <WDC WD5002ABYS-18B1B0 02.03B04> at ata3-master SATA300
acd0: DVDROM <PLDS DVD-ROM DH-16D5S/VD15> at ata6-master SATA150
・・・
Trying to mount root from ufs:/dev/ad4s1a
また、FreeBSD8.0は"ad4"にインストールしましたので、"ad4"のパーティション(スライス)を示す /etc/fstab ファイルは以下のようになっています。
表2 /etc/fstabの内容確認
# cat /etc/fstab
# Device | Mountpoin | FStype | Options | Dump | Pass# |
/dev/ad4s1b | none | swap | sw | 0 | 0 |
/dev/ad4s1a | / | ufs | rw | 1 | 1 |
/dev/ad4s1e | /tmp | uf | rw | 2 | 2 |
/dev/ad4s1f | /usr | ufs | rw | 2 | 2 |
/dev/ad4s1d | /var | ufs | rw | 2 | 2 |
/dev/acd0 | /cdrom | cd9660 | ro,noauto | 0 | 0 |
GMIRRORによるRAID1の設定 - 読み込み時の負荷分散アルゴリズムの指定
8.0-RELEASE-*-livefs.iso のCDからサーバを起動し、国とキーボードを選択後、Fixitを選択し、
起動メディアとしてCD-ROM/DVDを選択すると、プロンプト"Fixit#"が表示されますので、以下のように入力します。
表3 "ad4"をgmirror仮想ディスク"gm0"に設定
Fixit# chroot /dist
Fixit# mount -t devfs devfs /dev
Fixit# kldload geom_mirror.ko
Fixit# gmirror label -v gm0 /dev/ad4 <-- "ad4"をgmirrorの仮想ディスク"gm0"に設定する。
Metadata value stored on /dev/ad4.
Done.
ここでは、"gmirror label"コマンドでは、読み込み時の負荷分散アルゴリズムを指定していませんが、
-bオプション("gmirror label -b ***")により以下の4種類の負荷分散アルゴリズムを指定することが出来ます。
負荷分散アルゴリズムには、以下の4種類の方法があります。
- load:最も負荷の低いHDDから読み込む。
- prefer:プライオリティの高いHDDから読み込む。
- round-robin:読み込むHDDを選択する際に、round-robin algorithm を使用する。ここで、round-robin algorithm とは、
読み込み要求ごとに順番にHDDに振り分ける方法を意味する。
- split(デフォルト):split size 以上の読み込み要求を、アクティブなHDDの数に分散して読み込む方法。
WEBサイトを調べた限りでは、
デフォルトの負荷分散アルゴリズムでは、2台のHDDでは読み込み速度が2倍近く向上するが、3台以上のHDDを使用したシステムでは逆に遅くなるという報告があります。
"load" も確実に負荷分散が出来る訳でもなさそうです。
以上から、"round-robin" が最も読み込み速度を高速化できそうな感触です。最もシンプルな負荷分散方法だからでしょうか!?
一度設定した負荷分散方式は、次のコマンドにより変更可能です。
表3-1 gm0 の負荷分散方式を round-robin に変更する
# gmirror configure -b round-robin gm0
ただし、GMIRRORをMySQLとの組み合わせでテストしたケースにおいて、
2台のHDDによる複数のクエリ処理速度は、1台のHDDの場合に比較して、
高々10%程度の高速化しか達成できなかったことを付記しておきます。
次に、"gmirror list"コマンドで、"ad4"が"Consumers"に設定されているか確認します。
表4 gmirror仮想ディスク"gm0"に設定した"ad4"の確認
Fixit# gmirror list
Geom name: gm0
State: COMPLETE
Components: 1
Balance: split
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1438289296
Providers:
1. Name: mirror/gm0
Mediasize: 500107861504 (466G)
Sectorsize: 512
Mode: r0w0e0
Consumers:
1. Name: ad4
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 2117239218
次に、空きディスクの"ad6"をgmirrorの仮想ディスクとして追加します。
表5 "ad6"をgmirrorの仮想ディスクとして追加
Fixit# gmirror insert -v gm0 /dev/ad6
Done.
"gmirror list"コマンドで、"ad4"と"ad6"が"Consumers"に設定されているか確認します。
また、"ad6"の追加に伴い、"ad4"と"ad6"の同期が開始されます。
"ad6"のStateが"SYNCHRONIZING"、Flagsが"DIRTY,SYNCHRONIZING"となり、同期中であることがわかります。
同期が完了するまで待ちますが、SAS6iRコントローラの146GBのディスクで30分程度、
SATAコントローラの500GBのディスクなら1~2時間程度かかります。
同期の進行状況は、"ad6"のSynchronized: **%の項目で調べることができます。
表6 gmirror仮想ディスクのリストと同期状況の確認
Fixit# gmirror list
Geom name: gm0
State: DEGRADES
Components: 2
Balance: split
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1438289296
Providers:
1. Name: mirror/gm0
Mediasize: 500107861504 (466G)
Sectorsize: 512
Mode: r1w0e0
Consumers:
1. Name: ad4
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 2117239218
2. Name: ad6
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: SYNCHRONIZING
Priority: 0
Flags: DIRTY,SYNCHRONIZING
GenID: 0
SyncID: 1
Synchronized: 0%
ID: 841091143
また、"gmirror status"コマンドでも同期の進行状況を調べることができます。
表7 gmirror仮想ディスクの同期状況の確認
Fixit# gmirror status
Nameas | Statu | Components |
mirror/gm0 | DEGRADED | ad4 |
| | ad6(33%) |
同期完了後のgmirrorの状態
HDDの同期が完了すると以下のようなメッセージが出力されます。
表8 "ad6"同期完了メッセージ
GEOM_MIRROR: Device rebuilding provider ad6 finished.
また、同期完了後、"gmirror list"コマンドにより仮想ディスクのリストを表示すると、
Stateが"ACTIVE"に、Flagsが"NONE"に、それぞれ変化していることがわかります。
その後、gmirrorが仮想ディスクを処理中には、Flags:が"DIRTY"に変化しますが、完了すると"NONE"に戻ります。
表9 同期完了後の仮想ディスクリスト
Fixit# gmirror list
Geom name: gm0
State: COMPLETE
Components: 2
Balance: split
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1438289296
Providers:
1. Name: mirror/gm0
Mediasize: 500107861504 (466G)
Sectorsize: 512
Mode: r1w0e0
Consumers:
1. Name: ad4
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 2117239218
2. Name: ad6
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 841091143
gmirrorが正常に機能しているかどうかは、"gmirror status"コマンドでも確認できます。
以下に示す通り"COMPLETE"が確認できれば、HDDにトラブルは発生していません。
表10 同期完了後の仮想ディスクの状態
Fixit# gmirror status
Nameas | Statu | Components |
mirror/gm0 | COMPLETE | ad4 |
| | ad6 |
ブート設定
gmirrorの同期完了後、ブート設定を行います。
まず、仮想ディスクを"/mnt"という名称でマウントします。
表11 仮想ディスクのマウント
Fixit# mount /dev/mirror/gm0s1a /mnt
次に、editで/mnt/boot/loader.confにgeom_mirror_load="YES"を追加します(CDからの起動なのでエディターはeditしか使用できません)。
表12 editで/mnt/boot/loader.confを編集
Fixit# edit /mnt/boot/loader.conf
また、edit にて /mnt/etc/fstabのデバイス名"/dev/ad4" を"/dev/mirror/gm0" へ変更します。
ここでは、/dev/mirror/gm0s1aを/mntという名称でマウントしているため、/mnt/etc/fstabは、表2の/etc/fstabと同じファイルを指します。
表13 editで/mnt/etc/fstabを編集
Fixit# edit /mnt/etc/fstab
/mnt/etc/fstab ファイルの内容は以下のようになります。
表14 /mnt/etc/fstabファイルの内容
# cat /mnt/etc/fstab
# Device | Mountpoin | FStype | Options | Dump | Pass# |
/dev/mirror/gm0s1b | none | swap | sw | 0 | 0 |
/dev/mirror/gm0s1a | / | ufs | rw | 1 | 1 |
/dev/mirror/gm0s1e | /tmp | uf | rw | 2 | 2 |
/dev/mirror/gm0s1f | /usr | ufs | rw | 2 | 2 |
/dev/mirror/gm0s1d | /var | ufs | rw | 2 | 2 |
/dev/acd0 | /cdrom | cd9660 | ro,noauto | 0 | 0 |
以上で、gmirrorの設定は完了です。
exit2回でFixitモードを終了してから、sysinstall Main Menuを終了し、CDを取り出した後再起動し、問題なくgm0から起動することを確認します。
片方のHDDのみによる起動テスト
システムディスクをgmirrorでRAID1にした訳ですから、HDDが1台故障しても大丈夫なはずです。
とは言っても、最初は半信半疑です。ここでは、実際に1台のHDDで起動するかどうか、確認してみましょう。
サーバをシャットダウン後、HDD1(ad6)のケーブルを抜いて起動すると、問題なく起動できます。
"gmirror status"で仮想ディスクの状態を確認するとStatuが"DEGRADED"になり、"ad6"が消えています。
表15 "ad6"のケーブルを抜いて起動時の仮想ディスクの状態
# gmirror status
Nameas | Statu | Components |
mirror/gm0 | DEGRADED | ad4 |
サーバをシャットダウン後、今度は念のため、"ad6"のケーブルを接続し、"ad4"のケーブルを抜いて起動してみましょう。
"ad6"単独でも問題なく起動でき、"gmirror status"で仮想ディスクの状態を確認するとやはりStatuが"DEGRADED"ですが、今度は"ad4"が消えています。
表16 "ad4"のケーブルを抜いて起動時の仮想ディスクの状態
# gmirror status
Nameas | Statu | Components |
mirror/gm0 | DEGRADED | ad6 |
以上で、どちらのHDDが故障してもシステムは問題なく動くことが確認できました。
gmirror特異事情発生時の処理
過去に設定したgmirrorメタデータの消去
OSの再インストール等で、過去にgmirrorを設定した場合には、"gmirror label -v gm0 /dev/ad4"
のコマンドを打つ前に、"gmirror list"と入力すると、例えば次のような過去の設定が出ます("ad6"が"Consumers"に設定されている)。
これは、HDDの最後にメタデータが書き込まれているためです。
表17 gmirror仮想ディスクに残った過去の設定
Fixit# gmirror list
State: COMPLETE
Components: 1
Balance: split
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1438289296
Providers:
1. Name: mirror/gm0
Mediasize: 500107861504 (466G)
Sectorsize: 512
Mode: r0w0e0
Consumers:
1. Name: ad6
Mediasize: 500107862016 (466G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 2117239218
このような場合には、まず、以下に示す通り"ad6"に書き込まれたメタデータを消去してからgmirrorの仮想ディスクを設定します。
表18 "ad6"のメタデータを消去
Fixit# gmirror stop gm0
Fixit# gmirror clear ad6
HDD故障・交換時のGMIRRORの操作
HDDの読み込みエラーが頻繁に発生するようになると、やがてgmirrorはそのHDDを認識しなくなる。
例えば、HDDの"ad6"が故障すると、表15に示す通り"ad6"のケーブルを抜いた状況と同じになる。
故障したHDDをgmirrorから除外するには、表19に示す通り、"gmirror forget"コマンドを使用します。
表19 故障したHDDをgmirrorから除外
# gmirror forget gm0
# gmirror status
Nameas | Statu | Components |
mirror/gm0 | COMPLETE | ad4 |
故障したHDDのままの状態では、データを失う危険性が高い上、読み取り時の負荷分散も出来ませんので、故障したHDDは速やかに交換するのが望ましいでしょう。
"ad6"を"ad4"と同容量の HDD
WD5003ABYX に交換直後、
dmesg コマンドにより、表20 に示す通り HDD が正常に認識されていることを確認します。
GMIRROR では、HDD のスライス(パーティション)ごとにRAID1 を組むことも可能ですが、煩雑になるので、
私は、必ず同容量のHDDを使用して、HDD を丸ごとミラーリングするようにしています。
表20 "ad6"を交換直後の dmesg コマンド
# dmesg
・・・
ad4: 476940MB <WDC WD5002ABYS-18B1B0 02.03B05> at ata2-master SATA300
ugen0.1: <Intel> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
GEOM_MIRROR: Device mirror/gm0 launched (1/1).
ad6: 476940MB <WDC WD5003ABYX-01WERA0 01.01S01> at ata3-master SATA300
GEOM: mirror/gm0s1: geometry does not match label (16h,63s != 255h,63s).
ad8: 152587MB <WDC WD1602ABKS-18N8A0 02.03B04> at ata4-master SATA300
ad10: 152587MB <WDC WD1602ABKS-18N8A0 02.03B04> at ata5-master SATA300
acd0: DVDROM <PLDS DVD-ROM DH-16D5S/VD15> at ata6-master SATA150
・・・
HDD が正常に認識された後は、表21に示す"gmirror insert"コマンドで"ad6"(交換HDD)をgm0に追加します。このコマンドにより、
"ad4"(既存のHDD)と"ad6"の同期が開始されます。
同期の進行状況は、表6 あるいは表7 に示す通り、"gmirror list"あるいは"gmirror status"コマンドで確認できます。
表21 "ad6"(追加HDD)をgm0に追加
# gmirror insert -v gm0 ad6
Done.
最終更新日:2011年6月12日