RSS RSS
たろちゃんの記録(ruby on railsシステム開発)
2009.03.19
カテゴリ:Linux

DRBD+Heartbeat+NFS

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

今回、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と同様に追加をしてあげれば良いです。

ブックマークに追加する

.
web開発ならKBMJ
Rubyでのwebシステム開発は
実績豊富なKBMJにお任せ下さい
iPhone開発
iPhone開発は
KBMJにお任せ下さい
ブラウザゲーム エインヘリアル
ブラウザゲーム「エインへリアル」
サービス中
オープンソースECパッケージ エレコマ
オープンソースECパッケージ
「エレコマ」
Google Analytics徹底活用スクール
レベルに合わせた
実用的な活用スキルを徹底指導。
好評定期開催中です!

プロフィール

matuzawa
matuzawa
エレコマの開発者をやっています。
smellmanだったりbtmだったりする人です。
Firefox関係でオライリーから本出したり、Software Designで連載書いていたりします。
スマートフォン勉強会の関東スタッフをやっていたりします。

最近チェックした記事

最新記事

アーカイブ

アクセスランキング

KBMJのWebソリューション
Ruby on railsの開発ならKBMJ
株式会社ケイビーエムジェイ