mdadm - ソフトウェアRAID

  • mdadm でソフトウェアRAIDを構築・管理をする
    • ハードウェアRAIDとの違い
      ○ 専用RAIDコントローラが故障する心配がない
      ○ ある程度高速(CPUがデュアルコアだと)
      ○ 安価(投資ほぼゼロ)
      ○ Linuxとの相性がほぼ100%のはず
      △ ホットスワップ不可
        ※一応できる(ホットスワップの項を参照)
      △ アラートが不安定かもしれない
  • 適用済みのディストリビューションを利用したため、インストールは省略。
  • ちゃんとどうでも良いディスクとデータを使って、一通り予行練習をしておきましょうね!!!

RAID構築

  • ディスクの準備
    • ここでは 320GB x 4 (/dev/sdb〜e) を用意した
      • これを RAID5 して /home とする
    • fdisk /dev/sdb
      • primary pertition, サイズ一杯いっぱい, type fd (Linux Auto RAID)
      • sdeまで同様のパーティションを作る
      • AFT (4KB sector)を使っているWD20EARSのようなHDDは
        fdisk -H 224 -S 56 /dev/sdb でfdisk入って、
        n p 1 enter enter t fd して、wする前に
        x(エキスパートモード) b(パーティション開始位置をいじるモード) 1(パーティション1) 64(開始位置64セクタ)して、w。
  • RAID構築
    • mdadm -C /dev/md0 -l5 -n4 -c128 -f /dev/sd[bcde]1
      • -C : create 新規構築
      • /dev/md0 : RAIDデバイス
      • -l5 : level=5 RAID5 (0, 1, 5, 6等が指定可能)
      • -n4 : raid-devices=4 アレイ内のアクティブなデバイス数
        raid-devices = /dev/sd[bcde]1の数 + spare-devices
      • -c128 : chunk=128 チャンクサイズ
        raid5 -> 128, raid1-> 64,32, raid0 -> 64,32 ぐらい?
      • 1発を縮退(degreed)させた状態で構成したいときは
        mdadm -C /dev/md0 -l5 -n4 -c128 -f /dev/sd[bcd]1 missing
        上と比べてsdeが存在せず縮退した状態で構成されて起動する。
        その後、mdadm /dev/md0 --add /dev/sde1
    • その他オプション
      • --name=hoge ラベルをつける
      • --bitmap=internal ラインインテントビットマップ(再同期短縮用のジャーナルのようなもの)
  • RAID状態表示
    • mdadm -D /dev/md0
  • 自動認識するための記述
    • vi /etc/mdadm.conf
      DEVICE partitions
      • 以前は DEVICE /dev/sd[b-e]1 としていたが、いつのまにか DEVICE partitions とすれば、どういう仕掛けか自動的に見つけてくれるようになっていた。
    • mdadm -E --scan >> /etc/mdadm.conf
      • アレイに関するIDをスキャンしてconfに追加
    • vi /etc/mdadm.conf
      DEVICE partitions
      ARRAY /dev/md0 level=raid5 num-devices=4 UUID=8297c2bb:487bfd25:7fa25624:939d84de
    • vi /etc/rc.d/rc.sysinit
      /sbin/mdadm -As
      • どこかに記述しておく
      • TL11SやCentOSではすでに記入されている
  • フォーマットとかマウントとか
    • mke3fs -b 4096 -R stride=32 /dev/md0
      • ブロックサイズは通常 4096B
      • -R stride = chunk-size ÷ ブロックサイズ = ここでは32
    • vi /etc/fstab
      /dev/md0  /home  ext3  defaults  0 3
      • 当然ですが後ろの 0 3 は環境に応じて変えること。

故障時のリビルド

  • RAIDの状態の確認
    • cat /proc/mdstat
      Personalities : [raid6] [raid5] [raid4]
      md0 : active raid5 sdb1[3] sde1[2] sdd1[1](F) sdc1[0]
            937705728 blocks level 5, 128k chunk, algorithm 2 [4/3] [UU_U]
      
      unused devices: <none>
      • sdd1[1](F) が故障しているとする。
  • 故障フラグを立てる
    • mdadm /dev/md0 -f /dev/sdd1
      mdadm: set /dev/hdf1 faulty in /dev/md0
  • 故障ディスクをアレイからパージ
    • mdadm /dev/md0 -r /dev/sdd1
      mdadm: hot removed /dev/hdf1
  • ディスク交換
    • halt して ディスク交換後起動
      • もしかしたら halt しなくてもホットスワップでいけるかもしれない(確認中)
    • fdisk して 交換したディスクのパーティションを作り直す
  • リビルド
    • mdadm /dev/md0 -a /dev/sdd1
      mdadm: hot added /dev/hdf1
      • リビルドが開始される
    • cat /proc/mdstat
      Personalities : [raid6] [raid5] [raid4]
      md0 : active raid5 hdh1[3] hdg1[2] hdf1[1] hde1[0]
            937705728 blocks level 5, 128k chunk, algorithm 2 [4/4] [UUUU]
      
      unused devices: <none>
    • 320GB x 4 = 960GB で 2時間、1TB x 4 = 3TB で 4時間強。

比活性化(デバイスを削除)

  • mdadm -Ss /dev/mdX

もしも 2ディスク一気に吹っ飛んだら

  • むりやりmdを起動させる
    • mdadm -A /dev/md0 -u 3fee8ddc:fc710c65:daa5f7c5:4109bf44 --run --force
      • -u の後ろは /etc/mdadm.conf の UUID 参照
      • たぶんリビルドが進むと途中でmdが落ちて見えなくなることがあるみたい。

ホットスワップ(linuxの機能)

  • HDD取り外し(オフライン化)
    echo 1 > /sys/class/scsi_device/X:0:0:0/device/delete
    • X:0:0:0 の頭の数字(X)はたいてい sd? の順番に準じている模様
    • dmesg|grep sd したら sd X:0:0:0: [sda] 321672960 512-byte hardware...
  • HDD再認識(オンライン化)
    echo 0 - 0 > /sys/class/scsi_host/hostX/scan
    • オフライン化していないなら刺すだけで動いた。
    • 電源を刺す時にショートしないように気をつけること。
      • デバイスとか電源によってはつられて同系列のデバイスに再起動がかかることも。

障害時のメール通知機能

  • 設定
    • vi /etc/mdadm.conf
      MAILADDR serveradmin@ezweb.ne.jp
    • /etc/init.d/mdmonitor start
    • chkconfig mdmonitor on
  • 当然だが、RAID組んでるサーバにメールサーバがあったら通知は正常に飛ばないことが多い。
    • なぜなら、死んだディスクが固まってサーバもしくはmd丸ごと固まることがあるから。

RAIDの拡張(ディスクの増設)

スペアディスクとして使う

  • fault発生時に自動的にスペアを使って再構築が始まるようにすることができる
  • ディスクの追加
  • 構築時と同様にパーティションを作る
  • mdadm /dev/md0 --add /dev/sdg1
  • mdadm -D /dev/md0
    • 追加した /dev/sdg1 が spare として見えているはず

RAIDを拡張してディスク容量を増加させる

  • 未確認
  • ディスクの追加
    • 上のスペアディスクをとりあえず追加する
  • mdadm --grow /dev/md0 --raid-devices=5
    • 稼働本数を5本に変更する
  • リビルド完了待ち
  • アンマウント
    • 必ずアンマウントすること。
  • fsck.ext3 -f /dev/md0
    • 不安要素払拭
  • resize2fs -S 32 /dev/md0
    • -S 32 は 構築時に mke3fs した時の raid-stride のサイズ
    • 一番後ろにサイズを指定することも可能。
      今回は省略したのでパーティションいっぱいいっぱいまで拡張される。
  • マウント

RAIDを解除する

  • RAIDがもういらない、作り直したいときに。
  • mdデバイス停止
    • mdadm --stop /dev/md0
  • superblockの消去
    • mdadm --misc --zero-superblock /dev/sdb1
      • 面倒であればddでも使ってLinux raid autodetectパーティションを消す。
  • vi /etc/mdadm.conf
    • コンフィグ消去

RAIDのりビルドスピードを変更する

  • vi /proc/sys/dev/raid/speed_limit_max
    200000
    • デフォルトは 200000 = 200MB/s
    • md毎に個別で設定する場合は/sys/block/md?/md/sync_speed_max
  • vi /proc/sys/dev/raid/speed_limit_min
    1000
    • デフォルトは 1000 = 1MB/s

毎週日曜にresyncが走って重くなる件

  • mdadmにいつの間にか定期的に整合性チェックをする機能が搭載される
  • 対策1 チェックしない荒技
    • vi /etc/sysconfig/raid-check
      ENABLED=yes
      CHECK=check
      # To check devs /dev/md0 and /dev/md3, use "md0 md3"
      CHECK_DEVS=""
      REPAIR_DEVS=""
      SKIP_DEVS="md2"
      • とりあえずmd2をチェックされて困るので、SKIP_DEVS="md2"
      • 全部したくなければ ENABLED=no
  • 対策2 チェックするタイミングを変更する荒技
    • mv /etc/cron.weekly/99-raid-check /etc/cron.monthly/
  • とりあえず今すぐチェック
    • echo check > /sys/block/md2/md/sync_action
    • 停止は逆に idle と書く
    • 強制的にrebuildしたければ、echo repair とのこと
  • 参考

参考文献