この記事はアピリッツの技術ブログ「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.1 | testserver1 | DRBD, Heartbeat, nfsサーバ |
192.168.99.2 | testserver2 | DRBD, Heartbeat, nfsサーバ |
192.168.99.3 | testserver_virtual | Heartbeatが管理する仮想IP |
192.168.99.4 | testclient | nfsでマウントするクライアント |
まず、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と同様に追加をしてあげれば良いです。