既存のパーティションをミラーリングする方法

すでに運用に入っているパーティションをミラーリングする方法。

一つは、LVMで運用されているならlvconvertで簡単にできる。
普通にext3なんかのパーティションの場合はどうするか。
sda1, sda2がすでに運用に入っていて、sdb1, sdb2をミラーリングディスクとして追加する例を考える。

ここではmdadmを使うことにする。

で、今回の作業の流れ。

  1. ブロックデバイスの作成
  2. 新規追加するディスクを方肺でミラー化
  3. 既存運用のディスクからデータを移行
  4. 既存運用のディスクをRAID1に参加

ということでブロックデバイスの作成。

# mknod /dev/md1 b 9 0
# mknod /dev/md2 b 9 1

sdb1, sdb2はsda1, sda2と同じサイズでパーティションを切る。
パーティションのタイプはsda1, sda2も含めてすべてfd(Linux raid autodetect)にする。
で、新しく追加する方のディスクを方肺でミラー化する。

# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2

ミラー化したら、ファイルシステムを作成して、既存運用のディスクからデータを移行する。
この辺は/dev/md1, md2をmkfsしてsda1, sda2からmd1, md2にデータをcpする。

コピーが終わったら、元のディスクもミラーリングに参加させる。

# mdadm --add  /dev/md1 /dev/sda1
# mdadm --add  /dev/md2 /dev/sda2

っていう感じだろうか。

LVMでミラーリング

LVMにはミラーリングやストライピングといった機能がある。
って最近知った。
とりあえずデータが飛びかけた今回の障害から復旧するにあたって、LVMで構築したパーティションをミラーリングしようと思っていて調べていて気づいた。
以前と同じようにmdadmを使ったソフトウェアRAIDでミラーリングしようと思っていたけど、LVM自前のミラーリング機能を使った方が楽そうなのでこっちにした。

とりあえず、ミラーリングなのでディスクは最低2本いる。
で、同一ボリュームである必要があるようだ。
ということで、

# pvcreate /dev/sda1 /dev/sdb1
# vgcreate vg1 /dev/sda1 /dev/sdb1

みたいな感じで。
で、ミラーリングするのは至極簡単なようだ。
普通に論理ボリュームを作成するのと同じような感じで、-m 1とかつければいいみたい。

# lvcreate -L 30G -n lv1 -m 1 --alloc anywhere vg1

みたいな。
–alloc anywhere ってのが謎だが、これがないとLVMのミラーリングはディスクを3個必要になるらしい。基本は。
というのは、一つはログ用で用いるようだ。
で、このログを配置する先を、一つのディスクを利用しないで適当なファイルに書き出すようにするのがこのオプションらしい。
っていうのも、allocオプションの詳しい話がman lvcreateじゃ出てこないからよくわからん。
単純にこのオプションを使わずに、–mirrorlogオプションを使った方が平和かもしれない。
–mirrorlogオプションでは、以下のようになる。

  • disk ミラーリングしてるディスクとは異なるディスクにログを保存
  • core in-memoryログ
  • mirrored ログ自体をミラーリング。保存先はどこだろね。

で、論理ボリュームをミラーリングにしたりするのは、作成時だけじゃなくてすでに稼働している状態からでも簡単に行える。

lvconvertで似たような感じで指定すればいい。
mountしている状態でも、オンラインミラーリング化なんてことも問題なくできた。

# lvconvert -m 1 --alloc anywhere /dev/ms09/ms09

これで、普通の論理ボリュームがミラーリングされたボリュームに化けた。
このLVMの柔軟性はすばらしいというほかない。