先日、我が家で稼動するメール・サーバーのスプール領域を拡張した。このメール・サーバーはDRBD + Heartbeat による高可用性クラスター構成を採る仮想マシン 2台のペアで、スプール領域は DRBD の下地に LVM を利用している。

ディスク領域の拡張・縮小に LVM が威力を発揮するのは言うまでもないが、その上に DRBD が乗った場合は、DRBD リソースのサイズも変更しなければいけない。その作業で少々混乱したので (情報量少ない?)、記録に残しておく。

まず最近リニューアルされた日本語サイトの ユーザーズ・ガイド を見ると、DRBD リソースをオンラインで拡張する際の条件として、次のように書かれている。

  1. 影響を受けるリソースの下位デバイスが、 LVMやEVMSなどの論理ボリューム管理サブシステムによって管理されている。
  2. リソースの接続状態が Connected になっている。

この条件を満たしていれば、ユーザーズ・ガイドの記述どおりにオンラインで拡張が可能だ。例えばボリューム・グループ vg01 内の論理ボリューム test01 を利用した DRBD リソース r0 (resource: r0, device: /dev/drbd0, meta-disk: 任意, disk: /dev/vg01/test01) を 1GB 拡張する場合は、次のようにする。

・LV を拡張 (Primary & Secondary)
# lvextend -L +1G /dev/vg01/test01

・DRBD リソースを拡張 (Primary)
# drbdadm resize r0

・ファイル・システムを拡張 (Primary) (※ ファイル・システムが ext3 の場合)
# resize2fs /dev/drbd0

しかしこの手順は DRBD リソースのメタ・データ (meta-disk) を外部に置いている場合の話で、内部メタ・データを利用している場合は、少々手間が増える。例えば内部メタ・データを利用する DRBD リソース r1 (resource: r1, device: /dev/drbd1, meta-disk: internal, disk: /dev/vg01/test02) を 1GB 拡張する際の手順は、以下の通り。
(※ 2011-07-31 追記: コメント欄の通り、mkubo さんより、内部メタ・データでも大丈夫とのご指摘あり)
(※ 2011-08-07 追記: 内部メタ・データでも、上記と同様の手順で拡張可能なことを確認)

・LV を拡張 (Primary & Secondary)
# lvextend -L +1G /dev/vg01/test02

・DRBD を停止 (Primary & Secondary) (※ Primary 側で DRBD ボリュームがマウントされていれば、自動的にアンマウント)
# /etc/init.d/drbd stop

・メタ・データを作り直す (Primary & Secondary)
# drbdadm create-md r1

・DRBD を起動 (Primary)
# /etc/init.d/drbd start

・リソースを強制的に Primary 化 (Primary)
# drbdsetup /dev/drbd1 primary -o

・任意の場所にマウント (Primary)
# mount -t ext3 /dev/drbd1 /mnt/test02

・DRBD リソースを拡張 (Primary)
# drbdadm resize r1

・ファイル・システムを拡張 (Primary) (※ ファイル・システムが ext3 の場合)
# resize2fs /dev/drbd1

・DRBD を起動 (Secondary)
# /etc/init.d/drbd start

このように、一度 DRBD を停止してメタ・データを作り直す必要があるので、必然的に事前に該当ボリュームを利用するプログラムを停止したり、必要に応じてディレクトリをアンマウントしたり、と言った準備作業が発生する。外部メタ・データ利用時のように 「オンラインでお手軽拡張」 とは行かないが、まァ仕方ないだろう。

さて、メタ・データの形式に関わらず、DRBD で冗長化されているデータは重要であることが多いはず。失敗すると面倒なことになる可能性がある場合は、作業前のバックアップをお忘れなく。

2 Responses to this entry.

  • mkubo:

    内部メタデータであっても、プライマリ側でdrbdadm resizeを実行すれば拡張できます。

    拡張前に一度DRBDを止めてdrbdadm dump-mdを実行してmd_offsetの値を覚えておき、拡張後にもう一度同じことを実行すると、メタデータが論理ボリュームの末尾に自動的に移されたことが確認できますよ。

    いずれにせよ、作業前のバックアップはとても大切ですね。

  • Natz:

    > mkubo さん
    内部メタ・データの DRBD で検証し、外部メタ・データ同様の手順で拡張できることを確認しました。記事執筆当事に何度か失敗したため、別手順が必要であると思い込んでいました。
    ご指摘ありがとうございました。