その他
    ホーム 技術発信 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と同様に追加をしてあげれば良いです。