長い話を短く
pNFSは、集中型共有ストレージへの複数の同時アクセスを提供する良い方法のように見えますが、問題があります。 NFSメタデータ(メタデータサーバー、MDS)を提供する単一のNFSサーバーは、単一障害点です。 MDSにアクセスできなくなると、すぐに共有ストレージにもアクセスできなくなります。
この問題を回避するためにMDSクラスタを設定したいと思います。どうやってこれを達成できますか?集中型ストレージのクライアント直接入出力を拒否しないでください。?
HA-NFSにはいくつかのソリューションがありますが、すべて直接I / O pNFS機能を停止します。
物語はとても長いです。
OpenStack環境用の共有「データストア」を実装するための(複数の)オプションを探しています。
私は現在、集中型ストレージシステムでストレージをブロックストレージとして使用するシナリオに取り組んでいます。このシナリオでは、ほとんどのファイルシステムを同時に複数回安全にマウントできないため、問題が発生します。少なくとも複数のホストへの同時読み取りおよび書き込みI / Oがある場合はそうではありません。
マルチマウントの問題に対する解決策の1つは、XFSでNFS 4.1を使用することです。このバージョン以降、NFSを許可するpNFSがあります。顧客ブロックベースのI / Oをストレージシステムに直接接続します。カーネル文書によると、現在XFSのみがnfsブロックレイアウトをサポートしています。
このアプローチを使用すると、NFSサーバーは通常どおり共有をクライアントにエクスポートしますが、クライアントが実際にI / Oを実行すると、NFSサーバーではなくストレージシステムと直接対話します。特に、仮想マシンのユースケース(一度に1つのホストでのみ実行されると想定できます)の場合、これは適切に見えます。
共有をクライアントにエクスポートするNFSサーバーは、単一障害点です。エラーが発生すると、他のクライアントは共有をマウントできず、開かれていないファイルにアクセスできません。解決策は、あるサーバーに障害が発生した場合に別のサーバーに代わるようにNFSサーバークラスタを設定することです。 pNFSサーバーはどのようにクラスタ化されますか?
Gluster または drbd を使用して NFS をクラスタリングする方法については、多くのチュートリアルがあります。これらのヘルパーに基づくソリューションは、NFSクライアントとNFSサーバー間でデータI / Oが実行されることを意味します。しかし、pNFSの興味深い点は、データI / OがNFSサーバーではなくNFSクライアントと中央ストレージシステムの間で実行されることです。したがって、これら2つの方法のいずれかを使用すると、pNFSの重要な機能が破壊されるため、ソリューションと見なすことはできません。
私はこの分野に存在する仕事に非常に感謝します。しかし、私はレビューも重要だと思います...
私自身の理論
pNFSは数年間安定して使用されてきましたが、周囲にはノイズが多くありません。私が持っている小さな情報は次のとおりです。
ほとんどの/すべての状態はクライアントに属します。これは、NFS サーバーが失敗しても状態がすぐに失われないことを意味します。
クライアントがストレージシステムに直接I / Oを実行するため、サーバーの中断は進行中のデータフローを中断しません。
この情報に基づいて、次のアプローチが可能であると推測されます。
- 共有LUNを作成し、1つのサーバーを使用してXFSをデプロイします。
- 各NFSサーバーにカーネルnfsdを設定します。
- このNFSサーバーグループはすべて、読み取り専用モードで同じLUNをマウントします。
- 各サーバーにラムディスクを作成する
- DRBDを使用してすべてのRAMディスクに同期したミラーリング設定
- 同期したミラーRAMディスクを使用して、NFSサーバーの状態を/var/lib/nfsにマウントして保存し、nfsサービスを再起動します。
keepalived
一度に1つのサーバーのみがアクティブなVIPを使用して、サーバーグループをアクティブ/手動クラスターとして構成するために使用されます。keepalived
アクティブなNFSサーバーが読み取り/書き込みモードでLUNをマウントし、他のサーバーが読み取り専用モードでLUNをマウントできるようにするには、通知メカニズムを使用します。
「プライマリ」NFSサーバーの負荷は非常に低く、VMの変更と直接関連しています。したがって、一度に1つのNFSサーバーのみを保持することは、中小規模の仮想化環境では問題にならないようです。
NFS 4.*が動作するようにミラーリングされたNFSサーバーの状態を同期すると、プライマリサーバーに障害が発生した場合に他のサーバーが引き継がれる可能性があります。 Glusterを共有サーバーの状態ディレクトリとして使用する場合、これはアクティブ/アクティブクラスタリングを許可する必要があると思いますが、それが機能しているエントリを見つけることができません。
ミラーサーバーの状態が機能していなくても、他のサーバーがアクティブ/パッシブクラスタに代わる場合、I / Oは中央ストレージシステムを介して直接実行されるため、影響は大きくないはずです。正しいですか?