mdadmでRAID6構築

linux, サーバー関連 2010年4月25日,

なんで急にこんな事しだしたかっていうと
6TBのバックアップ領域が必要になったから。

バックアップ元の/homeが6TBあって、それをそのままrsyncでバックアップとりたいんだけど
現状最高でも2TBのHDDしかなくそんなかに6TBが入らないのは小学生でもわかる。
2TBのHDD3つ用意したらいけそうな気もするんだけど全部で6TBの1ディスクがないと管理とかが手間。

一番いいのはその6TBのストレージサーバーと同じものを購入してミラーリング+ホットスタンバイだけど
できるだけ安く。そう安く!!! なんとかならないものかと言われ、考えてた時に
mdadmなるもんがあって簡単にRAID組めるっぽい事を発見。

せっかくなので1TBのHDDを8個つなげて適当なCore2DuoあたりのSATAが6個くらいついたM/Bで
バックアップサーバーを作れば比較的お安くいけるんじゃないかと思ったのです。



とりあえず仮想環境で作成

VMwareで仮想的にHDDを5個くらい作ってそれをくっつけてDebianを起動してみた。

/dev/sda 15G(プライマリ)
/dev/sdb 2G
/dev/sdc 2G
/dev/sdd 2G
/dev/sde 2G


きれいに/dev/sdb~/dev/sdeになったw
注意が必要なのはRAID6なので同じサイズのファイルシステムでないといかんです。
1個だけサイズ違うとかなら多分うまくいけないのでファイルシステム作る時にそこらへん調節する必要有り。なはず。

とりあえずはmdadmをインストール

apt-get install mdadm


楽チン。
んでHDDの追加方法(ext3)の記事の方法のとーり
それぞれのHDDにファイルシステムを作っていく。
今回はまったく同じサイズのHDDなので何も考えず1パーティションだけでいい。

1
2
3
4
5
6
7
fdisk /dev/hdb
Command (m for help): n
Command action p
Partition number (1-4): 1
First cylinder (1-10011, default 1): 1
空エンター
Command (m for help): w

これをプライマリ以外の全部のパーティションでやる。
以上ができたらついにRAIDの構築。

mdadm –verbose –create /dev/md0 –level=raid6 –raid-devices=4 /dev/sd[bcde]1


はい終わり。いや、チョー簡単だねw
んじゃ新しくできた/dev/md0をフォーマット

mkfs -t ext3 -b 4096 /dev/md0


できたらそれをマウント。
適当に/raid6ってフォルダ作ってみた。

mkdir /raid6
mount /dev/md0 /raid6


dfしてみる

/dev/md0 4.0G 73M 3.7G 2% /raid6


RAID6なので2GBのHDD4つで4Gと認識されております。
ひとまずはこれで成功。



監視


cat /proc/mdstat

でRAIDの状態を確認できちゃいます。

1
2
3
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1]
     4192768 blocks level 6, 64k chunk, algorithm 2 [4/4] [UUUU]

RAIDエラーの検出はここで取得される3行目の[4/4]か[UUUU]を取得して、違っていればアラーとメール
みたくcronとかで監視するとよさげ。


リビルドどうすんのか

わざと障害を起こしてみる。
仮想PC上からHDDを2個ひっこぬいてみました。

RAID6なので2個HDDがなくなっても無事動いている事は確認。
でも

cat /proc/mdstat

してみたらどうやらsdbとsdcを引っこ抜いていた様子。

1
2
3
4
5
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid6 sdd1[2] sde1[3]
     4192768 blocks level 6, 64k chunk, algorithm 2 [4/2] [__UU]

unused devices: <none>

再びsdbとsdcを刺してみる。
んで、通常のHDD増設のようにfdiskする

fdisk /dev/sde


次はリビルド。mdadmのRAIDセットにはすでにmd0がありそのHDDが1個消失している状態なので
以下のコマンドで追加。

mdadm –manage /dev/md0 –add /dev/sdb1
mdadm –manage /dev/md0 –add /dev/sdc1


追加したら自動でリビルドがはじまた

1
2
3
4
5
6
7
testlenny:/dev# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid6 sdb1[0](S) sdc1[1] sdd1[2] sde1[3]
     4192768 blocks level 6, 64k chunk, algorithm 2 [4/2] [__UU]
     [======>..............]  recovery = 34.2% (719800/2096384) finish=0.9min speed=24820K/sec

unused devices: <none>

sdb1[0](S)ってのはたぶんスタンバイでリビルド待ちって意味かと。
RAIDセット(ここでは/dev/md0にあたら部分?)をぶっ壊して新たに作りたい時はどうするのか、、とかはわかんない・・・。
要勉強ですな。

しかしまぁ、実用的にはここまでわかれば十分かな、と。



問題

とにかく管理は大切だと思います。うん。
つーのもsdb壊れた!! ってのがわかっても
実際PCの繋がってる線のどのHDDがsdbかわからんからw

一回これで痛い目を見た事がある僕としてはゆゆしき問題ですよ。ええ。

<チラ裏>
RAID1構成の筐体でHDD故障障害が起きて、正常な方のHDDを抜いてしまった事があった。
幸い負荷分散用の冗長化サーバーであった為サービスはとまらなかったが、
1から構築しなおし、データーを完全に同期させた上でロードバランサ配下に差し込むのは大変だった。
前回のGW(1年前)での出来事でして・・・復旧に18時間くらいかかりました。死ぬかと思いました。


というわけでしっかり!!管理しながらやらないと大変そうですが、
なにより安くできるのはいいですね。

って事で実際に実機で運用し始めたらまた記事書くかもしれません。
一応はこれで提案してみます。



コメントどうぞ