DRBD on CentOS 5
DRBD のインストールと手動での migration までを試してみました。
※今回は VMWare Server 上の CentOS 5 で行いました。
※コマンドプロンプトにホスト名が無い場合は2つのホスト両方で実行しています。
※ホスト特定の作業には、toire# や ohuro# という風に明示しています。
環境
| OS | ホスト名 | IPアドレス | DRBDデバイス名 | 物理デバイス名 | メタデータ領域 | ポート |
|---|---|---|---|---|---|---|
| CentOS 5 | toire | 192.168.159.128 | /dev/drbd0 | /dev/sdb1 | internal(/dev/sdb1) | 7788 |
| CentOS 5 | ohuro | 192.168.159.129 | /dev/drbd0 | /dev/sdb1 | internal(/dev/sdb1) | 7788 |
準備
DRBD でマウントするための専用のディスクを追加しておきます。
VMWare Server 上でディスクを追加すればOKです。
追加すると /dev/sdb が出来ているはずです。
DRBD のインストールにはカーネルの開発環境が必要なので、インストールします。
# yum -y install kernel-devel
もし現行のカーネルとカーネル開発環境のバージョンが異なっているとインストールで
失敗するので、その場合はカーネルもアップデートします。
(どっちにしろドキュメント関係のところで何故か失敗する・・・)
# yum -y update kernel
リブートします。
# shutdown -r now
DRBD をコンパイルするために gcc、flex が必要なので、インストールします。
# yum -y install gcc flex
インストール
DRBD をダウンロードして展開、インストールします。
$ tar xzf drbd-8.0.5.tar.gz $ cd drbd-8.0.5 $ make # make install
設定
/dev/sdb を DRBD で管理する物理ディスクとして、パーティションを作成します。
# fdisk /dev/sdb
DRBD モジュールをロードします。
# modprobe drbd # lsmod | grep drbd drbd 181384 0
/etc/drbd.conf を編集します。とりあえずほぼデフォルト構成で作成します。
drbd.conf の設定項目については man を参照すると詳しくわかります。
(あまりデフォルトでいいような気がしませんが、今回はテストなので・・・)
global {
# ユーザーダイアログを再描画する間隔。0 は再描画しない。
dialog-refresh 0;
}
common {
# 無くてもいいかも。全てのセクションでの共通設定
# rate で同期の帯域幅を設定
syncer { rate 10M; }
}
resource r0 {
# デフォルト値 C。ローカルディスク、リモートディスクに書き込み完了した時点で完了とみなす。
protocol C;
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
outdate-peer "/usr/sbin/drbd-peer-outdater";
}
startup {
# スタートしてピアノードが見つかるまでの待ち時間。超えると一人で起動。
degr-wfc-timeout 120;
}
disk {
# IO エラー時の挙動。detach はディスクを切り離して稼動する(死亡状態?)
on-io-error detach;
}
net {
# split-brain になったあとの挙動。この場合はすべて切断する。
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
syncer {
# common で設定したからいらない?
rate 10M;
# この値が大きいほど、再同期の時間(間隔?)が長くなる。
al-extents 257;
}
# ホストの設定
on toire {
# DRBD デバイスを指定
device /dev/drbd0;
# 物理デバイスを指定
disk /dev/sdb1;
# IP アドレスと DRBD ポート(7788)を指定
address 192.168.159.128:7788;
# メタデータを格納する場所を指定。internal の場合はデータと同じディスクを使う。
meta-disk internal;
}
# ホストの設定
on ohuro {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.159.129:7788;
meta-disk internal;
}
}
2つのホストで同じ drbd.conf を使用するのでどちらかで作成したらコピーします。
toire# scp drbd.conf 192.168.159.129:/etc
iptables などでフィルタしている場合は、ポート 7788 を開けてあげます。
今回はテストなので iptables を停止しました。
# /etc/init.d/iptables stop
起動
起動するまえにこのコマンドを実行します。
# drbdadm create-md r0
起動します。DRBD をインストールすると /etc/init.d/drbd 起動スクリプトが作成されます。
# /etc/init.d/drbd start
片方だけ起動した場合のステータス
toire# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by watanabe@toire, 2007-09-12 20:05:03 0: cs:WFConnection st:Secondary/Unknown ds:Inconsistent/DUnknown C r--- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
両方とも起動した場合のステータス
toire# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@toire, 2007-09-12 20:08:18 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r--- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 ohuro# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@ohuro, 2007-09-12 20:08:38 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r--- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
どちらも secondary 状態で開始しています。
ホスト toire を primary に昇格させる
DRBD 8 から –do-what-I-say の代わりに –overwrite-data-of-peer を使います。
なんでそうなったかは、Getting started に書かれています。日本語訳はこちら
toire# drbdadm -- --overwrite-data-of-peer primary all
これを実行すると、/proc/drbd のステータスが変わります。
toire# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@toire, 2007-09-12 20:09:22 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:66248 nr:0 dw:0 dr:70560 al:0 bm:4 lo:0 pe:4 ua:135 ap:0 [>...................] sync'ed: 2.3% (3074400/3140544)K finish: 0:06:56 speed: 7,348 (7,348) K/sec resync: used:1/31 hits:4267 misses:5 starving:0 dirty:0 changed:5 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 ohuro# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@ohuro, 2007-09-12 20:09:41 0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r--- ns:0 nr:1947296 dw:1947296 dr:0 al:0 bm:118 lo:1 pe:48 ua:0 ap:0 [============>.......] sync'ed: 62.1% (1193248/3140544)K finish: 0:49:43 speed: 0 (6,952) K/sec resync: used:1/31 hits:121635 misses:119 starving:0 dirty:0 changed:119 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
両方のステータスを見ると、同期処理が行われている最中であることがわかります。
完了するまでしばらく待ちます。
同期が完了したら、ファイルシステムを作成します。
ファイルシステムの作成
ext3 ファイルシステムを作成して /mnt/data にマウントします。
toire# mkfs.ext3 /dev/drbd0 toire# mkdir /mnt/data toire# mount /dev/drbd0 /mnt/data toire# df /mnt/data Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/drbd0 3091152 70216 2863912 3% /mnt/data
migration のテスト
手動での migration のテストをします。
primary ホスト(toire)で ファイルを作成してみます。
toire# touch /mnt/data/test toire# ls /mnt/data test ←作成したファイル
リソースを開放しないと secondary に降格できないので /dev/drbd0 アンマウントします
(アンマウントしないと drbdadm secondary r0 でコケます。)
toire# umount /dev/drbd0
アンマウントしたら、secondary に降格させます
toire# drbdadm secondary r0 toire# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@toire, 2007-09-12 20:12:18 0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r--- ns:3256472 nr:0 dw:115928 dr:3140677 al:41 bm:221 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:196092 misses:192 starving:0 dirty:0 changed:192 act_log: used:0/257 hits:28941 misses:41 starving:0 dirty:0 changed:41
ホスト ohuro を primary に昇格させます。
ohuro# drbdadm primary r0 ohuro# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@ohuro, 2007-09-12 20:13:38 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:0 nr:3256472 dw:3256472 dr:0 al:0 bm:192 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:196092 misses:192 starving:0 dirty:0 changed:192 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
ホスト ohuro でリソースをマウントします。
ohuro# mkdir /mnt/data ohuro# mount /dev/drbd0 /mnt/data ohuro# df /mnt/data Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/drbd0 3091152 70216 2863912 3% /mnt/data
ホスト toire で作成したファイルが引き継がれています。
ohuro# ls /mnt/data test ←ある
これで手動で DRBD をmigration することができました。
実運用ではトラブル時に手動でごにょごにょとやっている余裕もないので、自動化したほうがよさそう。
自動で行うには、Heartbeat や Keepalived などを利用することで実現できるようです。
自動でのフェイルオーバーについては後ほどやってみようかと思います。
参考
DRBD INSTALL [翻訳]
DRBD – Getting started [対訳]
DRBD – Migrating DRBD resources [対訳]
DRBD – man page of drbd.conf #1 [対訳]
DRBD – man page of drbd.conf #2 [対訳]
DRBD – man page of drbd.conf #3 [対訳]
DRBD – man page of drbd.conf #4 [対訳]
DRBD – man page of drbd.conf #5 [対訳]