
DRBDはディスクをネットワークを介してミラーリングすることによりデータの安全性を高める「データミラークラスタ」タイプのソフトウェアです。いわば、ネットワークでRAID-1を実現していることになります。Gigabit Ether でピアネットワークを構築しているならばほとんどローカルと変わらないくらいです。
DRBD は 8.0.0 より共有ディスク構成(ACT/ACT構成)をとることができるようになりました。今回は、Fedora Core 6 上で CMAN + GFS2 を使用したACT/ACT構成をおこなうことを主眼として構築していきます。
なお、わたし自身は片方からバックアップがとれればいいかなとおもっているので、両方に書き込み負荷をかけたときの挙動まではみていません 
公式ホームページからダウンロードしてください。
面倒なので RPM を作成します。
# rpmbuild -ta --target=i686 drbd-8.0.1.tar.gz
GFS2 は ClusterManager などに依存するものがありますので、それらも一緒にインストールする必要があります。
# rpm -Uvh cman-2.0.60-1.fc6.i386.rpm # rpm -Uvh lvm2-2.02.17-1.fc6.i386.rpm # rpm -Uvh lvm2-cluster-2.02.17-1.fc6.i386.rpm # rpm -Uvh gfs2-utils-0.1.25-1.fc6.i386.rpm
上記をインストールした後に先ほど作成したRPMをインストールします。
# rpm -Uvh drbd-km-2.6.20_1.2933.fc6-8.0.1-1.i686.rpm # rpm -Uvh drbd-8.0.1-1.i686.rpm
設定がいっぱいあるので、順を追って説明します。
まず、Clusterの設定からおこないます。設定はかなり端折っていますので、くわしくはマニュアルを参照してください。(redhatはGUIからの設定を推奨しているようです)
<?xml version="1.0"?>
<cluster name="cluster1" config_version="11"> ←ここの名前は重要!
<clusternodes>
<clusternode name="node1" votes="1" nodeid="1">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.35.101"/>
</method>
</fence>
</clusternode>
<clusternode name="node2" votes="1" nodeid="2">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.35.102"/>
</method>
</fence>
</clusternode>
<fencedevices>
<fencedevice name="manual" agent="fence_manual"/>
</fencedevices>
<rm>
<failoverdomains/>
<resources/>
</rm>
</cluster>
上記の設定は1台目も2台目も全く同じ設定をおこないます。また、通常の設定ではタイムアウトがあまりにも長いので、今回は以下をいれてタイムアウト時間を短くします。
# # Setting of Cluster Manager # CMAN_CLUSTER_TIMEOUT=60 FENCED_START_TIMEOUT=45
ここで、おもむろに両方のマシンから ClusterManager を起動してみます。最初は2台同時に起動しないと認識せずにタイムアウトするかもしれません。
# service cman start
ちゃんとクラスタ化されているか、ツールを使って確認します。(両方のステータスが'M'になっていればOKです。また、成功していれば fence サービスに全てのノードが接続されています。
# cman_tool nodes Node Sts Inc Joined Name 1 M 456 2007-04-01 14:15:47 node1 2 M 456 2007-04-01 14:15:47 node2 # cman_tool services type level name id state fence 0 default 00010001 none [1 2]
こちらはバージョン0.7のときとそれほど変更はありません。
global {
usage-count yes;
}
resource r0 {
protocol C;
startup {
wfc-timeout 60; ## 60 seconds.
degr-wfc-timeout 10; ## 10 seconds.
}
disk {
on-io-error detach;
}
net {
allow-two-primaries; ## ←ここが重要
# after-sb-0pri disconnect; ←このあたりはポリシーで
# after-sb-1pri disconnect;
# after-sb-2pri disconnect;
# rr-conflict disconnect;
}
syncer {
rate 300M;
al-extents 257;
}
on node1 {
device /dev/drbd0;
disk /dev/mapper/VolGroup00-LogVol01;
address 192.168.35.101:7788;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/mapper/VolGroup00-LogVol01;
address 192.168.35.102:7788;
meta-disk internal;
}
}ここから、DRBDのコマンドでリンクをおこないます。この手順もv0.7のときと変わりありません。
# insmod drbd # drbdsetup /dev/drbd0 disk /dev/VolGroup00/LogVol01 # drbdsetup /dev/drbd0 net 192.168.35.101 192.168.65.102 C # drbdsetup /dev/drbd0 primary
状態を確認してすべて同期がとれたところで Primary にしてみてください。
# cat /proc/drbd
version: 8.0.1 (api:86/proto:86)
SVN Revision: 2784 build by root@localhost, 2007-03-26 00:49:26
0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r---
ns:20 nr:4 dw:24 dr:30340 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:5 misses:0 starving:0 dirty:0 changed:0
ここまできましたら、ようやくLVMクラスタサービスを起動できます。このサービスはGFS2が使用するロック(DLM)サービスを提供してくれますので、かならず起動する必要があります。
# service clvmd start
ここまで全て動作して、ようやくGFS2ファイルシステムを使用できます。以下のコマンドは例です。
# mkfs.gfs2 -p lock_dlm -t cluster1:drbd0 -j 2 /dev/drbd0
順を追って説明します。
| -p | ロックサービスは何を使用するか?(clvmdで起動してるので"lock_dlm") |
| -t | クラスタ名とこのファイルシステムの一意な名前(クラスタは設定した"cluster1") |
| -j | ジャーナルの数(=GFSで接続する数:drbdは2台なので"2") |
エラーがでないで作成できたら、Primary/Primaryなことを確認して、おもむろに mount してみてください。両方からマウントできれば成功です。
# mount -t gfs2 /dev/drbd0 /opt


意外に、以下の設定に惑わされることが多いので、日本語訳マニュアル(β)から抜粋
| pass_on | 入出力エラーを上位レイヤに報告する。プライマリ側ではファイルシステムにエラーを伝える。セカンダリ側では何も報告しない |
| call-local-io-error | ハンドラスクリプトlocal-io-error を呼び出して実行する |
| detach | 低レベルデバイスを切り離して、ディスクレスモードで処理を続行する |
引用元: http://www.drbd.jp/files/drbd_doc/drbd.conf.pdf
まだ、ACT/ACTで安定して使えるかどうか分からないので、報告などがありましたらコメントください。
<?xml version="1.0"?>
<cman two_node="1" expected_votes="1">
</cman>
<cluster name="cluster1" config_version="11">
<clusternodes>
:
: