wanatabe's Weblog
DRBD+Heartbeat で NFS Server をクラスタ化してみる
今回は DRBD + Heartbeat で NFS Server を HA クラスタ 構成にしてみます。
結論としては、F/O 時にイマイチうまくできなかったのですが、過程も大事ということでメモ。
テストにあたって Setup of high availability NFS servers を参考にしました。
DRBD のインストールや設定については DRBD on CentOS 5 の記事のような感じです。
Heartbeat との組み合わせについては MySQL DRBD Heartbear HA の記事のように設定しています。
OS 環境は同じく VMWare Server 上の CentOS 5 を使用します。
環境
| OS | ホスト名 | 実IPアドレス | 仮想IPアドレス | DRBDデバイス名 | NFS マウントポイント |
|---|---|---|---|---|---|
| CentOS 5 | toire | 192.168.159.128 | 192.168.159.130 | /dev/drbd0 | /data |
| CentOS 5 | ohuro | 192.168.159.129 | 192.168.159.130 | /dev/drbd0 | /data |
NFS Server の準備
NFS がインストールされていなかったので、yum でインストールしました。
# yum -y install nfs-utils
プライマリの設定
NFS 共有のディレクトリを作成します。/data としました。
toire# mkdir /data toire# mount -t ext3 /dev/sdb1 /data toire# mkdir /data/userdata
/var/lib/nfs を共有ディスクに移動してシンボリックリンクを作成します。
toire# cp -R /var/lib/nfs /data toire# mv /var/lib/nfs /var/lib/_nfs toire# ln -s /data/nfs /var/lib/nfs
セカンダリの設定
/var/lib/nfs を削除してシンボリックリンクを作成します。
ohuro# mv /var/lib/nfs /var/lib/_nfs ohuro# ln -s /data/nfs /var/lib/nfs
プライマリ、セカンダリ両方の設定
/etc/exports を編集します。テストなので簡素にしました。
/data/userdata *(rw,sync)
エクスポートします。
# exportfs -a
/etc/ha.d/haresourses を設定します。
toire drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 192.168.159.130/24 nfs
プライマリの /data をアンマウントします。
toire# umount /dev/sdb1
Heartbeat と DRBD を起動
# modprobe drbd # /etc/init.d/heartbeat start # /etc/init.d/drbd start
プライマリ側で drbdadm コマンドを実行します。
toire# drbdadm primary r0
プライマリの状態を確認するとこんな感じになります。
toire# cat /proc/drbd
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-i386-build, 2008-02-06 01:17:51
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
ns:552 nr:408 dw:960 dr:242 al:3 bm:23 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:135 misses:3 starving:0 dirty:0 changed:3
そしてセカンダリの状態を確認するとこんな感じになります。
ohuro# cat /proc/drbd
version: 8.0.6 (api:86/proto:86)
SVN Revision: 3048 build by buildsvn@c5-i386-build, 2008-01-06 01:17:51
0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r---
ns:408 nr:552 dw:960 dr:53 al:5 bm:5 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:97 misses:5 starving:0 dirty:0 changed:5
プライマリでデバイスがマウントされているかを確認します。(/dev/drbd0 がマウントされてることが確認できます)
toire# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
3555040 1078772 2292768 32% /
/dev/sda1 101086 16041 79826 17% /boot
tmpfs 95304 0 95304 0% /dev/shm
/dev/drbd0 2063404 35920 1922668 2% /data
テストしてみる
クライアントのホストからマウントしてみます。(クライアントは別途用意しました)
client# mount 192.168.113.135:/data/userdata /mnt/mpoint
無事にマウントできれば OKです。
うまくいかなかったところ
この状態でプライマリサーバの Heartbeat のシャットダウンを試みたところ、シャットダウン途中で固まってしまい、クライアントのほうでも共有にアクセスすると、固まってしまった。
しばらくすると、プライマリサーバの OS 自体がシャットダウンをはじめました。
(split-brain 状態になって DRBD の何かのハンドラ(pri-lost-after-sb とか)が呼ばれたとか?)
そんで、プライマリサーバがシャットダウンされると、セカンダリサーバが DRBD ようやくプライマリに昇格して、クライアントから共有が見えるようになりました。
要調査です。
次に試すかもしれないこと
setup of high availability NFS servers を見て、NFS のロックサービスの設定をしていないことに気づいた。
つまり NFS Server がダウンしたことを rpc.statd がクライアントに通知できていないからなのかも。
/etc/init.d/nfslock を以下のようにするといいかも。あとで試すかも。
start() {
...
echo -n $"Starting NFS statd: "
...
daemon rpc.statd "$STATDARG" -n <cluster_host_name>
....
}
Posted at 10:38PM Feb 06, 2008 by Hideo Watanabe in Linux |