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>
....
}
2008年 2月 6日 | Posted in Linux
タグ:
コメントは終了しています。