unoh.github.com

DRBDによるコンテンツの相互バックアップ

Sun Dec 24 22:26:13 -0800 2006

こんにちは satoです。
DRBDは誤解を恐れないで、簡単に言ってしまうと、ネットワーク越しにRAID1を構築できるオープンソースのソフトウェアです。

DRBDには以下の特徴があります。
・カーネルモジュールで動作し、有償でサポートが受けられます
・電源等が壊れても、ソフトウェアRAIDやPICカード型のRAIDと違ってサービスを続けることができます
・heartbeat等と組み合わせて、HAなシステムを構築できます
・secondary(slave、待機系)はマウントすることができません。

DRBDの設定から使用までを簡単に解説しようと思います。また待機系が必要なのですが、待機だけではもったいないので、相互に違う領域をバックアップ(s1のsda3のバックアップ先は s2のsda3、s2のsda4のバックアップ先はs1のsda4)をしてみました。

構成

s1.unoh.net 10.1.0.1
+-------------
| sda3 (drbd0 master)
+-------------
| sda4 (drbd1 slave)
+-------------

s2.unoh.net 10.1.0.2
+-------------
| sda3 (drbd0 slave)
+-------------
| sda4 (drbd1 master)
+-------------
uname -a
Linux s1.unoh.net 2.6.18-1.2200.fc5smp #1 SMP Sat Oct 14 17:15:35 EDT 2006 i686 i686 i386
GNU/Linux

インストール

必要なものを yum でインストールします。

yum install kernel-devel
yum install hardlink
yum install rpm-build

最新のソースをDLします。
wget http://oss.linbit.com/drbd/0.7/drbd-0.7.22.tar.gz

ソースからRPMをビルドします。

tar zvxf drbd-0.7.22.tar.gz
cd drbd-0.7.22
make rpm
cd dist/RPMS/i386/
rpm -ivh drbd-0.7.22-1.i386.rpm
rpm -ivh drbd-km-2.6.18_1.2200.fc5smp-0.7.22-1.i386.rpm

設定

/etc/drbd.conf を編集します。無い場合は作成します。
resource drbd0 {
# 同期プロトコル A, B, C のいずれかを選択
# A:リモートのディスクへの書き込み要求が完了した時点
 # B:リモートのディスクのバッファキャッシュ書き込みが完了した時点
# C:リモートのディスクへの書き込みが完了した時点
protocol B;
incon-degr-cmd "halt -f";

syncer { # 同期の速度
rate 200M;
}
disk { # エラーが起こったときの処理
# pass_on:上位レイヤに通知, panic:カーネルパニックになる, detach:ディスクレスモードで動作
on-io-error pass_on;
}
net { # 接続が切れた場合の処理
# reconnect:再接続,stand_alone:1台だけで継続,freeze_io:IOを止める
on-disconnect reconnect;
}

# 1番目のノードを定義
on s1.unoh.net {
device /dev/drbd0;
disk /dev/sda3;
address 10.1.0.1:7789;
# メタデータの定義
meta-disk internal;
}

# 2番目のノードを定義
on s2.unoh.net {
device /dev/drbd0;
disk /dev/sda3;
address 10.1.0.2:7789;
# メタデータの定義
meta-disk internal;
}
}
resource drbd1 {
 # drbd0 と違うところだけ記述
# 1番目のノードを定義
on s1.unoh.net {
device /dev/drbd1;
disk /dev/sda4;
address 10.1.0.1:7790;
# メタデータの定義
meta-disk internal;
}

# 2番目のノードを定義
on s2.unoh.net {
device /dev/drbd1;
disk /dev/sda4;
address 10.1.0.2:7790;
# メタデータの定義
meta-disk internal;
}
}

DRBDをスタートします
/etc/init.d/drbd start
以下のような状態 Inconsistent(同期がとれていない状態) になります
cat /proc/drbd
version: 0.7.22 (api:79/proto:74)
0: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:71984032 nr:0 dw:71984032 dr:52390757 al:169318 bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:45988528 nr:0 dw:45988528 dr:91767569 al:185559 bm:0 lo:0 pe:0 ua:0 ap:0

本来ならここでprimaryモードに移行するために

drbdadm -- --do-what-I-say primary drbd0

と行うのですが、これを行うと、一旦ディスクを同期するため、
サイズによってはかなりの時間がかかってしまいます。

この作業をスキップするために以下のスクリプトを使用します。

wget http://svn.drbd.org/drbd/branches/drbd-0.7/testing/read_gc.pl
wget http://svn.drbd.org/drbd/branches/drbd-0.7/testing/write_gc.pl

read_gc.pl resource_name
write_gc.pl resource_name 1

/etc/init.d/drbd restart

プライマリーに移行します
s1.unoh.net にて drbdadm primary drbd0
s2.unoh.net にて drbdadm primary drbd1

cat /proc/drbd

version: 0.7.22 (api:79/proto:74)
0: cs:Connected st:Primary/Secondary ld:Consistent
ns:71984032 nr:0 dw:71984032 dr:52390757 al:169318 bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Connected st:Secondary/Primary ld:Consistent
ns:45988528 nr:0 dw:45988528 dr:91767569 al:185559 bm:0 lo:0 pe:0 ua:0 ap:0

Consistent となって同期がとれていることがわかります

mkfs.ext3 /dev/drbd0
mount /dev/drbd0 /mnt/drbd0
とするとファイルシステムを作成し、デバイスをマウントすることができます

テスト

s1.unoh.net で適当なファイルを作成します。
cd /mnt/drbd0
touch hoge
ls -la
-rw-rw-r-- 1 unoh unoh 0 12月 25 14:39 hoge
デバイスをアンマウントしてセカンダリーに移行します
cd ..
umount /mnt/drbd0
drbdadm secondary drbd0

s2.unoh.net でプライマリーにして、デバイスをマウントします。

drbdadm primary drbd0
mount /dev/drdb0 /mnt/drbd0

作成したファイルがあるか確認します

cd /mnt/drbd0
ls -la
-rw-rw-r-- 1 unoh unoh 0 12月 25 14:39 hoge


DRBDの設定のために 以下の書籍を参考にしました。
Linuxアドバンストネットワークサーバ構築ガイド HAサーバ構築編
デージーネット
秀和システム
売り上げランキング: 14319
おすすめ度の平均: 4.5
5 ミッションクリティカルなサーバを構築するなら
3 構築から運用まで担当する方向け
5 高度だが説明はわかりやすい