VMwareでDRBDをテスト

おはようございます、牧野です。今週から朝型生活に切り替えました。できるだけがんばって続けていこうと思っています。

さて、今回はDRBDについてです。

DRBDについて簡単に説明すると、ハードディスクのRAID1(ミラーリング)を、ネットワークを介して離れた場所にあるマシンのハードディスクとできるようにするためのソフトです。
DRBDはオープンソースなので、高価な機器を買わなくてもよく、予めRAIDを組んでいなくてもミラーリングを実現できます。
さらにheartbeatと、データベースやNFSといった別サービスを組み合わせることにより、一方のマシンにトラブルが発生した場合に自動的にもう一方のマシンを使うようにする、というような冗長化システムを実現できます。
詳しくはこちらを見て下さい。英語のページの方が説明が充実しています。
http://www.drbd.jp/

ただ、いくつか制約があります。

・カーネルのバージョンに依存
カーネルモジュールを使用するため、カーネルがバージョンアップすると再インストールが必要です。

・ブロックデバイスごとの同期
RAIDなこともあり、ブロックデバイス丸ごとの同期になります。特定のディレクトリ以下だけ、という指定はできない場合もあります。

あとは、設定、検証が多少面倒とか。。
バージョンの違い(0.7系と0.8系)で、できることやコマンドが若干違ったりもします。

今回は、自分のCentOS環境でDRBDをインストールし、動作確認するところまでです。検証環境の構築にけっこう時間がかかってしまいました。。heartbeat等との組み合わせはまた後日、ということで。。。

最初、VMwareのCentOS環境を1つ作って、colinuxのCentOSと試そうとしたのですが、colinuxの方でyumインストールのカーネルモジュールが動かず…。colinuxのカーネルのバージョンとyumでインストールしたモジュールの対応カーネルバージョンが違っていたのが原因でした。
結局、VMwareでCentOS環境を2つ用意しました。CentOSは手元にあった4.5を使用しています。

1.yumでdrbdとkmod-drbdをインストール


# yum install drbd kmod-drbd

カーネルも更新された場合は再起動します。

2.検証用ハードディスクの作成
今回は、qemu、VMX Editor、VMware Playerを使って環境を作りました。
VMX Editorまたはqemuコマンドで新たにハードディスクを2つ作り、各VMware Player用設定ファイルを変更します。
最初、ディスク容量を100MBで作ったら動かず、1GBで作り直しました。
0.7系ではdrbdのメタデータ領域として、128MB必要です。
次に設定ファイルを変更します。

自分の設定ファイル vm01.vmx


#worte by vmx-editor
.encoding = "Shift_JIS"
config.version = "8"
virtualHW.version = "4"
numvcpus = "1"
nvram = "nvram"
memsize = "300"
displayName = "vm01"
guestOS = "otherlinux"
Ethernet0.present = "TRUE"
Ethernet0.connectionType = "bridged"
logging = "FALSE"
usb.present = "FALSE"
Floppy0.present = "FALSE"
Sound.present = "FALSE"
ide0:0.present = "TRUE"
ide0:0.devicetype = "disk"
ide0:0.filename = "vm01.vmdk"
ide0:0.startConnected = "TRUE"
ide0:1.present = "TRUE"
ide0:1.autodetect = "TRUE"
ide0:1.devicetype = "cdrom-image"
ide0:1.startConnected = "TRUE"
ide1:0.present = "TRUE"
ide1:0.devicetype = "disk"
ide1:0.filename = "vm0102.vmdk"
ide1:0.startConnected = "TRUE"
extendedConfigFile = "vm01.vmxf"
virtualHW.productCompatibility = "hosted"
tools.upgrade.policy = "manual"
ethernet0.addressType = "generated"
tools.syncTime = "FALSE"
uuid.location = "56 4d af ac 9d 5d 75 a4-99 8a 3d e3 35 d4 c3 28"
uuid.bios = "56 4d af ac 9d 5d 75 a4-99 8a 3d e3 35 d4 c3 28"
ide0:0.redo = ""
ide1:0.redo = ""
vmotion.checkpointFBSize = "18153472"
ethernet0.generatedAddress = "00:0c:29:d4:c3:28"
ethernet0.generatedAddressOffset = "0"
ide0:1.fileName = "C:\centos\CentOS-4.5-i386-bin3of4.iso"

「ide1:0」で始まる合せて5行を追加します。
これで起動すると「/dev/hdc」ができているので、


#mkfs.ext3 /dev/hdc

を実行します。

3.drbdの設定、準備
各マシンで実行します。
drbdカーネルモジュールの読み込み


#modprobe drbd
#lsmod

でdrbdが表示されることを確認します。

/etc/drbd.conf


resource drbd0 {
  protocol C;
  syncer {
    rate 50M;
  }
  disk {
    on-io-error pass_on;
  }
  on makmak-vm.jp {
    device /dev/drbd0;
    disk /dev/hdc;
    address 192.168.xxx.xxx:7789;
    meta-disk internal;
  }
  on makmak-vm2.jp {
    device /dev/drbd0;
    disk /dev/hdc;
    address 192.168.xxx.yyy:7789;
    meta-disk internal;
  }
}

on の後にはサーバのホスト名を書きます。
deviceの名前は同じにします。
meta-diskのinternalは、メタデータ領域をミラーリングに使用するディスクの一部に確保するという指定です。
設定ファイルが準備できたら、drbdを再起動しておきます。


#/etc/init.d/drbd restart

ところで、drbdにはプライマリ、セカンダリという概念があって、プライマリ指定されているマシンのディスクだけマウントして使用することができます。
プライマリとして使用する方のマシンで


drbdadm -- --do-what-I-say primary all

を実行すると、プライマリ指定でき、データが同期されます。
drbdのページにも解説がありますが、「--do-what-I-say」は0.7系のオプションで、0.8系では「--overwrite-data-of-peer」になります。

4.動作確認
プライマリのマシンで適当にディレクトリを作り、マウントします。


#mkdir /data
#mount /dev/drbd0 /data
#touch /data/hogehoge

ここで一度アンマウントして、プライマリ、セカンダリ設定を変更します。


#umount /data
#drbdsetup /dev/drbd0 secondary

状態を確認すると、


#drbdadm state all
Secondary/Secondary

ともにセカンダリになっていることがわかります。

もう一方のマシンで


#drbdsetup /dev/drbd0 primary
#drbdadm state all
Primary/Secondary

Primaryが最初に表示されていることを確認したら、マウントします。


#mount /dev/drbd0 /data
#ls -lah /data

これでhogehogeが出てこれば、無事同期が取れていたことになります。

DRBDはheartbeatと組み合わせて冗長化システムを組むことで真価を発揮しますが、単体でも自動バックアップ等には使えます。

ところで今回初めてちゃんとVMwareを使用しました。colinuxより多少重く、特にファイル書き込みがもっさりしている気がしました。ただ、同じ環境をぽこぽこと手軽に作ることができるのは便利です。
パフォーマンス無視で、とりあえず環境を作りたい時にはいいですね。