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 [対訳]

2007年 9月 12日 | Posted in Linux
タグ:
コメントは終了しています。