スケーラブルで堅牢な参照用NFSサーバのつくりかた

今開発しているサービで、約100台位のサーバに対し/usrマウントを提供しているのNFSサーバがあります。参照専用とはいえ、100台位になってくるとそこそこのパフォーマンスが要求されますし、/usrという重要なポイントをマウントしているため冗長化も重要です、また台数が日に日に増えているためとスケールアウトも出来なくてはなりません。そこで、スケーラブルで障害に強い参照用NFSサーバを構築してみました。

簡単なイメージは下図のとおりです。

nfs-11

NFSサーバはA,Bの2台ありそれぞれrsyncで内容が同期されています。それぞれのNFSサーバには仮想IPアドレス(以下、VIP)がそれぞれついています。クライアントはマウント時に、nfs.mynet(mynet部分はサービスのドメイン名等)をDNSに問い合わせると、DNSはNFSサーバのVIPのどれかを返却します。問い合わせごとに返却されるVIPが変わるため、各ホストがマウントするNFSサーバが分散する用になっています。

障害時には下図のとおり、VIPが正常な他方のNFSサーバに自動的に集められてサービスを継続します。

nfs-2

障害が解決すると、負荷分散のためフェイルバックをします。

nfs-3

ここまでの説明で「なんだkeepalivedか」と分かってしまう勘の良い方はもう以下読む必要がないかもしれません。NFS-1,2にはそれぞれkeepalivedがインストールしてあり、お互いをVRRPで監視しVIPを奪い合っています。全く難しいことはしていないのですが、強いて言うとVIPを実サーバ数分持ち、これを本来あるべきサーバに優先度をつけて設定するというのがミソです。

keepalived.confの設定は以下のようにNFSサーバ毎に優先度が異なっており、それぞれ変える必要があります。

NFS-1の設定

NFS-2の設定

DNSの設定

DNSラウンドロビンでnfs.mynetを問い合わせられたら、NFS-AのVIP(192.168.0.101)もしくは、NFS-BのVIP(192.168.0.102)が返されるように設定します。方法はDNSサービスにより異なりまた難しくないのでここでは説明を省かせて頂きます。

NFSクライアント

/etc/fstabにてマウントポイントを記述します。私は以下のようにしました。

nfs.mynet:/usr   /usr  nfs  tcp,ro,soft,intr  0 0

フェイル時にすんなりアプリケーションから再試行が掛けられるようにsoftマウントしてあります。

以上のような簡単な構成でスケーラブルな参照用NFSサーバの構築をすることができました。まだ運用試験段階なのですが、今のところ問題なく動いておりNFSサーバの再起動も気兼ねなくできるようになりました。「もっとこうやったほうがいいよ!」という知見をお持ちの方、貴重なご意見を是非コメント欄にお願いいたします。

コメント / トラックバックはありません

コメントする