ホーム DoRuby DRBD+Heartbeat+NFS

DRBD+Heartbeat+NFS

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、たろちゃんです。

今回、DRBDとHeartbeatとNFSを組み合わせた仕組みを作成しました。

DRBDとHeartbeatの構築自体については、tacchiさんのDRBDのインストール及びHeartBeatの設定を参照してください。

なお、今回作成した環境はXenの準仮想化環境上の CentOS 5.2 64bit です。そのため、前述のDRBDの記事とはインストール方法が異なり、yumを使ってCentOSのレポジトリからDRBDの導入をしました。

# yum install kmod-drbd82-xen.x86_64
# yum install drbd82.x86_64

DRBDのバージョンは8.2.6ですが、設定については8.0系とほとんど変更はございません。

では、構築作業を見ていきましょう。

今回構築するサーバは以下のような構成になっているとします。

IPアドレスホスト名用途
192.168.99.1testserver1DRBD, Heartbeat, nfsサーバ
192.168.99.2testserver2DRBD, Heartbeat, nfsサーバ
192.168.99.3testserver_virtualHeartbeatが管理する仮想IP
192.168.99.4testclientnfsでマウントするクライアント

まず、DRBDとHeartbeatの構築をしておきます。こちらは省略します。

続いて、Heartbeatの /etc/ha.d/haresoureces の設定を行ないます。

# vim /etc/ha.d/haresources
testserver1 drbddisk::drbd0 Filesystem::/dev/drbd0::/var/drbd::ext3 IPaddr::192.168.99.3/24/eth0

こちらの設定で DRBD の復帰と、 /dev/drbd0 を /var/drbd へのマウント、仮想IPの割りあてが行なえます。もちろん、testserver1とtestserver2で /var/drbd を作成しておく必要があります。

# mkdir /var/drbd

この段階で一度 heartbeat のテストをします。testserver1でheartbeatを停止してtestserver2で/var/drbdがマウントされるのを確認し、testserver1でheartbeatを再起動してtestserver1で/var/drbdがマウントされるのを確認すれば良いかと思います。

さて、肝心のnfsmountをするための設定を行います。

まずはnfs関係のサービスなどを停止します。testserver1とtestserver2の両方で行います。

# /etc/init.d/nfs stop
# /etc/init.d/nfslock stop
# /etc/init.d/rpcidmapd stop
# umount sunrpc

次にtestserver1でnfsのサービスが使用するファイルの移動と元の場所へのシンボリックリンクの作成を行います。

# mkdir -p /var/drbd/nfs/var/lib
# mv /var/lib/nfs /var/drbd/nfs/var/lib/
# ln -s /var/drbd/nfs/var/lib/nfs /var/lib/nfs

次にtestserver2で不必要になるファイルの移動とtestserver1と同様にシンボリックリンクの作成を行います。

# mv /var/lib/nfs /var/lib/_nfs
# ln -s /var/drbd/nfs/var/lib/nfs /var/lib/nfs

これでtestserver1からtestserver2に切り変わってもnfsのサービスを動かせるようになりました。

次にtestserver1でnfsmountする領域を作成します。

# mkdir /var/drbd/nfs/userdata

次にtestserver1とtestserver2の両方で、 /etc/exports を編集します。

# vim /etc/exports
/var/drbd/nfs/userdata  testclient(rw,sync)

次に、testserver1とtestserver2でOS起動時にnfsのサービスが起動しないように設定します。

# chkconfig nfs off
# chkconfig nfslock off
# chkconfig rpcgssd off
# chkconfig rpcidmapd off

以上でnfsの基本設定は終わりです。次に、heartbeatがnfsのサービスを起動、停止を行なうためのスクリプトを作成します。こちらはtestserver1とtestserver2の両方に設置します。

# vim /etc/ha.d/resource.d/nfsmount
#!/bin/bash
#
# nfsmount
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

start() {
        mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs
        service rpcidmapd start
        service nfslock start
        service nfs start
        exit 0
}

stop() {
        service nfs stop
        service nfslock stop
        service rpcidmapd stop
        umount sunrpc
        STATUS=`LANG=C service nfs status|grep "running"`
        if [ -n "${STATUS}" ];
        then
                killall -HUP nfsd
        fi
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        *)
                echo $"Usage: $0 {start|stop}"
                exit 1
esac

exit 0

ここで注意する点は、停止時(stop)にnfsのサービスが終了していない場合はnfsdをkillする必要がある点です。この処理が無いと、nfsdが終了しなかった際にheartbeatが正常に動作せず、予期せぬトラブルを招く恐れがあります。(実際には、heartbeatがOSの再起動プロセスを走らせてしまい、サーバがシャットダウンもできないという状態になった事があります)

最後に先程作成したnfsmountスクリプトに実行権限を与えて、 /etc/ha.d/haresources を修正します。

# chmod 755 /etc/ha.d/resource.d/nfsmount
# vim /etc/ha.d/haresources
testserver1 drbddisk::drbd0 Filesystem::/dev/drbd0::/var/drbd::ext3 IPaddr::192.168.99.3/24/eth0 nfsmount

以上で設定は完了です。heartbeatの停止、起動をしてみてnfsがちゃんと切り替わる事、nfsmountが継続される事を確認しましょう。

# mount -t nfs testserver_virtual:/var/drbd/nfs/userdata /mnt/nfstest

問題がなければ、testclientのfstabに通常のnfsと同様に追加をしてあげれば良いです。

記事を共有

最近人気な記事