c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

Linuxのmdはかしこいのう

RH9で無事raid1を組み終わった、さて実際の障害テストだ


sda1(以後A)とsdb1(以後B)で組んだRAID1で、適当に処理をしながらおもむろにsda1のRAIDアレイ(sdaとsdbはSCSI-DAS RAID6)を電源スイッチでブチ落とす*1

コンソールにはsdaがI/Oエラーと出力されたが、ls叩いてもファイルをコピーしても普通に動作。
/proc/mdstatでちゃんとデグレードされていることを確認。
そしてroot宛に障害発生したよメールが飛んだ。
偉いぞ!ハードウェア障害にバッチリ対応出来るのを確認。


ということで、Aをオフにしたまま、Bだけオンで再起動。
起動後にmdadm -Asしてみると( --assemble --scan)

mdadm: /dev/sdb1 has no superblock - assembly aborted

と出力される。

!!注意!!
sdbは今「存在しない」のでこのエラーが出た。
さっきのsdbは今はsdaになっているのだから!(sdaをoffにしてあるからね)
(実はこれを見て俺は結構焦ったんだけどね(笑

うん、たしかに/etc/mdadm.confには

ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1

と記載しておいてあるので、sdbが無い為に起動できないのは正しい。
(多分UUIDとか、superminorとか指定だとこのエラーが出ないのだろうな、しらんけど)


ってことで、ここで強制的に立ち上げてみる

mdadm --assemble --run --force /dev/md0 /dev/sda1
(繰り返すけど、ここのsdaは最初の正常時でいうとsdb)

勿論無事に起動、/proc/mdstatには[_U]とか片肺であることが出力されているが、マウントして普通に読み書き出来る。


ってことで、再度再起動、今度はAとB両方Onで。

起動後にmdadm -Asすると今度はすんなり動く。

[root@localhost root]# mdadm -As
mdadm: /dev/md0 has been started with 1 drive.
[root@localhost root]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 sdb1[1]
488391936 blocks [2/1] [_U]

unused devices:

うん、ちゃんとデグレードされたまま(しかも、間違いなく一度も障害を起こしていないsdbがアクティブ)。

mountして問題無いことを確認した後にHotaddする

[root@localhost test]# mdadm --add /dev/md0 /dev/sda1
mdadm: hot added /dev/sda1
[root@localhost test]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 sda1[2] sdb1[1]
488391936 blocks [2/1] [_U]
[>....................] recovery = 0.0% (60016/488391936) finish=677.1min speed=12003K/sec
unused devices:

勿論問題無し、リビルドが開始された。
mdadm非常に分かり易いね!デバイスの番号が狂っても普通にマウントできたし。
(raid5でどうなるのかとか、initが走る前に認識させる事を考えなければな(苦笑))



しかし…上を見ての通り、リビルド速度がめちゃくちゃ遅いよ?500GB程度に10時間以上?と思ってdmesgを確認したら

md: syncing RAID array md0
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec/disc.
md: using maximum available idle IO bandwith (but not more than 10000 KB/sec) for reconstruction.

だって、リミッター効いてるのな。

知り合いの人が教えてくれた

[root@localhost proc]# cat ./sys/dev/raid/speed_limit_max
10000
[root@localhost proc]# echo 100000 > ./sys/dev/raid/speed_limit_max
[root@localhost proc]# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 sda1[2] sdb1[1]
488391936 blocks [2/1] [_U]
[=====>...............] recovery = 28.9% (141162944/488391936) finish=89.2min speed=64825K/sec
unused devices:

よし、正しい感じになった。


終わった、家に帰ろう

Every 3s: cat /proc/mdstat Wed Jun 6 21:52:01 2007

Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 sda1[0] sdb1[1]
488391936 blocks [2/2] [UU]

unused devices:

あ、watch -n 3 cat /proc/mdstatってコマンドが便利だよ(メモ

*1:こんな怖ろしい事久々にやった(笑