wanatabe's Weblog

Wednesday Feb 06, 2008

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 5toire192.168.159.128192.168.159.130/dev/drbd0/data
CentOS 5ohuro192.168.159.129192.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>
        ....
}

Comments:

Post a Comment:
Comments are closed for this entry.

Calendar

Feeds

Search

Links

Navigation

Referers