Linux-HA Logo

ハイアベイラビリティNFSサーバーのセットアップ

こちらのページは、Guochun Shiさんが作成し、現在はデーブ・ダイクストラ(Dave Dykstra)が中心となって管理しています。

次のいずれかをご参照ください。

手際よくセットアップを完了させるには、以下の手順に従ってください(Heartbeat[6]のセットアップ方法について、すでに理解していることが前提です)。

  1. 2台のサーバー間のハードウェア、またはDRBD[7]によって共有された共有ディスクデバイスを使用していることを確認します。

  2. いずれかのマシンで共有デバイスをマウントします。例えば、デバイスが/dev/sdb1で、マウント先のディレクトリが/dataである場合には、次のコマンドを実行します。

mount -t ext3 /dev/sdb1 /data エクスポートするディレクトリが/data/userdataであり、このディレクトリがない場合は、作成してください。

mkdir /data/userdata
  1. /var/lib/nfsを共有ディスクに移動し、リンク(/var/lib/nfs)を作成します。

mv /var/lib/nfs /data
ln -s /data/nfs /var/lib/nfs

rm -fr /var/lib/nfs
ln -s /data/nfs /var/lib/nfs
  1. rpc.statd クラスタ名(ホスト名またはIPアドレス)を入力する必要があります。Debianでは、ロックサービスは/etc/init.d/nfs-commonで開始されます。/etc/default/nfs-commonSTATDOPTS="-n <cluster_host_name>"を入力して、コモンファイルを編集する必要がありません。それ以外のLinuxシステムでは、/etc/init.d/nfslockスクリプトにロックサービスが含まれています。

start() {
        ...
        echo -n $"Starting NFS statd: "
        ...
        daemon rpc.statd "$STATDARG" -n <cluster_host_name>
        ....
}

  1. ユーザーディレクトリをエクスポートします。/etc/exportsに次の行を追加します。

/data/userdata  *(rw,sync)

exportfs -a

ヒント

  1. NFSサーバー上でファイルシステムをNFSマウントすることはお勧めできません。かつて、デーブ・ダイクストラ(Dave Dykstra)が、両方のサーバーでアクティブサーバーの複製ファイルシステムをNFSマウントするという構成を試み、何とか動作するようになりました。しかし、「NFSサーバーが応答しない」という問題が起こり、Heartbeatがフェイルオーバしないケースが無くならなかったため、この構成での運用は最終的に断念しました。最大の問題は、fuserコマンドのハングです。詳細については、メーリングリストのここ[8]からここ[9]までの議論のアーカイブをご参照ください。

  2. NFSにTCPを使用する設定がカーネルのデフォルトになっている場合(2.6カーネルなど)、「'udp'」マウントオプションを使用してUDPに切り替えます。これを行わないと、「A」が15~20分間のTIME_WAITステートの間TCP接続を持続して、再接続を拒否してしまうので、サーバー「A」から「B」にすばやく切り替えた後に、すぐに「A」へと戻せません。

デバイス番号の割り当て

注: デバイスのメジャー/マイナー番号はNFSファイルハンドルに埋め込まれるので、フェイルオーバ[10]の実行に合わせてメジャー/マイナー番号が変更されると、ファイルハンドルが無効になってしまいます。DRBD[11]を使用しているときには、構成を変更して番号を合わせていただくか、または共有ディスクを使用しているときには、EVMSやLVMを使用して同じメジャー/マイナー番号を持つ共有ボリュームを作成してください。

EVMSはhttp://evms.sourceforge.net/から、 LVMはhttp://www.sistina.com/products_lvm.htmからダウンロードできます。

NFSデバイスの番号割り当て問題に対処する別の方法は、新バージョンのNFS(2.6 Linuxカーネルに含まれる)で提供されています。これらのバージョンでは、マウントしたデバイスのメジャー/マイナー番号の代わりに、fsidパラメータによって整数を指定できます。詳細については、exports(5)をご参照ください。

HA-NFSのテスト

NFSロックの動作確認のために、Heartbeat[6]が動作するHA環境でNFSの広範にわたるテストを行いました。ここでは、テストとその結果についてご説明します。Bonnie++でNFS I/Oをテストし、Connectathonスイートおよび独自設計の複数クライアントNFSロックテストでNFSをテストしました。

テスト環境

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 10
warntime 10
initdead 20
udpport 694
bcast   eth0            # Linux
auto_failback off
node    posic066
node    posic067
apiauth ping gid=haclient uid=gshi,hacluster
apiauth ccm  gid=haclient uid=hacluster
apiauth evms gid=haclient uid=root
apiauth ipfail gid=haclient uid=gshi,hacluster

Bonnie++

ロックを使用していない場合、NFSはLinux-HAとともに順調に動作します。Bonnie++(バージョン1.03a、http://www.coker.com.au/bonnie++/からダウンロード可能)は、2台のNFSサーバーで2分ごとにフェイルオーバを交互に繰り返しながら、約6時間動作しました。[13]

Connectathonによるロックテスト

テスト手順は、以下のとおりです。

複数クライアントのロックテスト

複数クライアントのロックテストコードのソースコードは、Linux-HA Mercurial[16]レポジトリのcontrib/mlock/ディレクトリに含まれています。

テスト手順は、以下のとおりです。

が表示された。

さらに、ラッパー関数を使用してfnctlを無効にしてみました。そのラッパー関数では、1回目に障害を起こすと、fcntlが2回呼び出されます。このラッパー関数を使用すると、成功することもありますが、障害が発生することもあります。

NFSのバグ

クライアントがロックテストを実行している最中に、サーバーのフェイルオーバが実行されると、ファイルシステムのマウント解除が失敗する恐れがあります。実行したロックテストはConnectathonです。これは、2台のマシン(サーバーとクライアント)だけを使用して、以下の手順を実行することで、簡単に再現できます。

  1. サーバーがディスクデバイスをディレクトリにマウントします。
  2. サーバーがnfsとnfslockを開始します。
  3. クライアントがサーバーからエクスポートされたディレクトリをマウントします。
  4. クライアントがConnectathonロックテストを実行します。
  5. サーバーがnfsとnfslockを終了します。
  6. サーバーがデバイスをマウント解除しようとします。
    • ====> 「the device is busy」のエラーが返されます。

サーバーとクライアントの両方で、常に同じカーネルバージョンを使用しました。Red Hat 9では、カーネル2.4.20、2.4.26、2.6.5-1.339を使用しました。いずれのカーネルでも、同様に障害が発生しました。

ただし、Linux-HA(バージョン1.2.1以降)では、この障害の発生時には自動的にマシンを再起動してサービスを自動的に続行するために、これは重大な問題ではありません。サービスは中断されることなく続行されますので、ロックとデータの整合性に影響は生じません。

2004年5月付のlinux-NFSメーリングリストに、ジェフ・レイトン(Jeff Layton)が、この問題に対する修正を発見しました。ディストリビューションに、NFSシャットダウンスクリプトを組み込む必要があります。Jeffによると[18]、lockdカーネルスレッドにSIGKILLシグナルを送信すると、全てのロックが解放され、ファイルシステムをマウント解除することができます。以前に、lkmlでも[19]これについて議論がなされています。

結論

クライアントアプリケーションがファイルロックを使用しなければ、HA NFSは正常に動作します。しかし、クライアントアプリケーションがロックを使用すると、単一のNFSサーバーに到達できないエラーが発生します。NFSにはこのような問題を引き起こすバグが複数あります。 -- Guochun Shiさん

しかし、NFSカーネルを適切に実行してさえいれば、大部分の問題は修正ができるものです。それでもなお、集中的なロックが行われると、ロック障害が発生する恐れがあります。解決方法はまだ確認されていません。 -- アラン・ロバートソン(Alan Robertson)

アクティブ/アクティブHA NFS

上記の手順やコメントは、主にアクティブ/パッシブ配置に適用されるものです。アクティブ/アクティブ構成については、マット・シリンガー(Matt Schillinger)のNFSページ[20]をご参照ください。


References

[1]http://www.linux-mag.com/2003-11/availability_01.html
[2]http://linux-mag.com
[3]http://www.linux-magazine.com/issue/33/High_Availability_NFS_Server.pdf
[4]http://linux-magazine.com/
[5]http://www.howtoforge.com/high_availability_nfs_drbd_heartbeat
[6]http://www.linux-ha.org/ja/Heartbeat_ja
[7]http://www.linux-ha.org/ja/DRBD_ja
[8]http://lists.community.tummy.com/pipermail/linux-ha/2005-February/013873.html
[9]http://lists.community.tummy.com/pipermail/linux-ha/2006-May/019800.html
[10]http://en.wikipedia.org/wiki/Failover
[11]http://www.linux-ha.org/ja/HaNFS_ja/ja/DRBD_ja
[12]http://www.linux-ha.org/ja/ha.cf_ja
[13]http://www.coker.com.au/bonnie++/からダウンロード可能)は、2台のNFSサーバーで2分ごとにフェイルオーバを交互に繰り返しながら、約6時間動作しました。
[14]http://www.linux-ha.org/ja/ha.cf/AutoFailbackDirective_ja
[15]http://www.linux-ha.org/haresources
[16]http://www.linux-ha.org/ja/Mercurial_ja
[17]http://www.linux-ha.org/ja/ha.cf/AutoFailbackDirective_ja_auto_failback
[18]http://lists.community.tummy.com/pipermail/linux-ha/2004-May/011128.html
[19]http://seclists.org/lists/linux-kernel/2002/Sep/1841.html
[20]http://chilli.linuxmds.com/~mschilli/NFS/active-active-nfs.html


This information provided courtesy of the Linux-HA project at http://linux-ha.org/