web-dev-qa-db-ja.com

デュアルLinuxNFSサーバーフェイルオーバー-nfsv4leastime / nfsv4gracetime

初めてここに投稿するときは、多くの間違いをしないことを願っています。

2つのNFSサーバーを使用してセットアップしました。彼らはcorosync/pacemaker + drbdを使用して、アクティブ/パッシブnfsサーバーを提供しています。使用されるディストリビューションは、Ubuntuの最新のLTSバージョンです。

Clusterは、クライアントが接続するためのフローティングIPも提供しています。ボリュームレプリケーションは正常に機能します。

問題は、フェイルオーバー中にI/O操作が約90秒待機することです。フェイルオーバー後(新しいマシンがすでに新しいマスターとしてプロモートされている場合)、クライアントのtcpdumpは次のようなパケットを表示します。

reply ok 52 getattr ERROR:unk 10013

グーグルでエラー10013とnfsを探して私を このusenet投稿 に導きました

したがって、私のロックはnfsサーバーに保持され、90秒後にのみ解放されます。そのパラメーター(/ procに含まれている)を下げる必要がありますが、試してみると

root@nfs-ha-1:/# ls -l /proc/fs/nfsd/nfsv4gracetime
-rw------- 1 root root 0 Jan 31 11:00 /proc/fs/nfsd/nfsv4gracetime
root@nfs-ha-1:/# cat /proc/fs/nfsd/nfsv4gracetime
90
root@nfs-ha-1:/# echo 1 > /proc/fs/nfsd/nfsv4gracetime
bash: echo: write error: Device or resource busy
root@nfs-ha-1:/#

したがって、この問題に関する詳細情報、またはそのファイルに書き込む方法が必要です。ファイルは、実行時にnfs-serverを使用して作成されます。 nfsserverを停止すると、ディレクトリは単に空になり、書き込むことができなくなります。

root@nfs-ha-1:/proc/fs/nfsd# touch nfsv4gracetime
touch: cannot touch `nfsv4gracetime': No such file or directory
1
Andrea

このフォローアップで、何が問題で、どのように解決するかを説明したいと思います。パラメータは特定の瞬間にのみ変更できます。

Nfs-kernelを停止した(モジュールをアンロードした)状態で/ proc/fs/nfsdに書き込もうとすると、ファイルは単に存在しません。 nfs-kernelを起動した後に試行すると、デバイスビジーエラーが発生します。

解決策は、nfs-kernel-serverのinitスクリプトを編集し、モジュールのmodprobeの後にパラメーターを(必要なファイルの通常のエコーを介して)変更することです。

したがって、パラメータを記述する必要がありますbetween do_modprobeおよびdo_mountディレクティブ。

Ubuntu 12.04LTSの/etc/init.d/nfs-kernel-serverからのサンプル

# See how we were called.
case "$1" in
  start)
        if [ -f /etc/exports ]
        then
                do_modprobe nfsd
                echo 15 > /proc/fs/nfsd/nfsv4leasetime
                echo 25 > /proc/fs/nfsd/nfsv4gracetime

                # See if our running kernel supports the NFS kernel server
                if ! grep -E -qs "[[:space:]]nfsd\$" /proc/filesystems; then
                        log_warning_msg "Not starting $DESC: no support in current kernel."
                        exit 0
                fi
                do_mount nfsd $PROCNFSD_MOUNTPOINT || NEED_SVCGSSD=no
0
Andrea