CentOS Stream 9でNFSをマスターする:クラスター向け高速データ共有ソリューション

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

なぜ集中ストレージが必要なのか?

複数サーバー間のデータ管理は、必ずしも苦労を伴うものである必要はありません。5〜10台のWebサーバーやDockerノードを運用している場合、SCPやRsyncによるデータ同期は大きな遅延(時には数分)を引き起こすことがあります。NFS(Network File System)は、サーバーが共有データストレージにリアルタイムでアクセスできるようにすることで、この問題を解決します。

例えば, 100GBの製品画像があるとしましょう。10台のサーバーに10個のコピーを作る代わりに、1か所に配置するだけで済みます。以前、CentOS 7でECサイトのシステムを構築した際、1日あたり数百万件の画像リクエストを処理するためにNFSを使用しました。CentOS Stream 9でもこのプロセスは安定していますが、より厳格なセキュリティ設定が求められます。

NFSv4と注意点

NFSはシンプルなクライアント・サーバーモデルで動作します。サーバーがディレクトリを「エクスポート(export)」し、クライアントがそれを自機に「マウント(mount)」します。

  • NFSv4: CentOS 9のデフォルトバージョンです。より安全で、ファイアウォールでポート2049のみを開放すれば動作します。
  • パフォーマンス: 複合プロシージャ(compound procedures)という仕組みにより、旧バージョンに比べてファイル処理が大幅に高速化されています。

NFSサーバーの構築

この例では、**サーバー (192.168.1.10)** と **クライアント (192.168.1.20)** の2台を使用します。目的は `/data/shared` ディレクトリを共有することです。

1. nfs-utilsパッケージのインストール

まず、両方のマシンにNFS管理ツールをインストールします:

sudo dnf install nfs-utils -y

2. 共有ディレクトリの設定

ディレクトリを作成し、権限を設定します。注意:NFSはユーザーのUID/GIDに非常に敏感です。

sudo mkdir -p /data/shared
sudo chown -R nobody:nobody /data/shared
sudo chmod -R 755 /data/shared

`nobody:nobody` を使用するのは、異なるサーバー間でのユーザーIDの不一致によるエラーを避けるためのちょっとしたコツです。これにより、クライアントがシステムから不当に拒否されることなくファイルを書き込めるようになります。

3. /etc/exportsファイルの設定

このファイルで、誰がデータにアクセスできるかを決定します。ファイルを開きます:

sudo vi /etc/exports

以下の設定行を追加します:

/data/shared 192.168.1.20(rw,sync,no_subtree_check)

ここで、**rw** は読み書きを許可し、**sync** は予期せぬ停電時のデータ損失を防ぐために、データが即座にハードディスクに書き込まれることを保証します。

4. サービスの有効化とファイアウォールの設定

NFSサービスを起動し、システムの起動時に自動実行されるように設定します:

sudo systemctl enable --now nfs-server

ファイアウォールのポートを開放することを忘れないでください。この手順を怠ると、クライアント側で「Connection timed out」エラーが発生します。

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload

クライアント側の設定

次に、**クライアント (192.168.1.20)** マシンに切り替えて、サーバーに接続します。

1. マウントポイントの作成

sudo mkdir -p /mnt/nfs_share

2. マウントと確認

すべてが正常に動作するか確認するために、手動でマウントを実行します:

sudo mount -t nfs 192.168.1.10:/data/shared /mnt/nfs_share

`df -h` コマンドを入力します。サーバーの正しい容量でネットワークドライブが表示されれば、90%は成功です。

3. 起動時の自動マウント

再起動のたびにマウントし直す手間を省くため、`/etc/fstab` に情報を追加します:

192.168.1.10:/data/shared /mnt/nfs_share nfs defaults,_netdev 0 0

重要な注意点: `_netdev` パラメータは非常に重要です。これは、ネットワーク接続が確立された後にのみマウントするようにシステムに指示するもので、ドライブが見つからずに起動時にサーバーがフリーズするのを防ぎます。

SELinuxの壁を越える

設定が終わっても、SELinuxによって「Permission Denied」エラーが発生することがよくあります。Webサーバー(Nginx/Apache)のコードを置くためにNFSを使用している場合は、次のコマンドを実行してください:

sudo setsebool -P httpd_use_nfs 1

このコマンドにより、SELinuxを完全に無効にすることなく、WebサービスがNFSドライブ上のファイルと正常にやり取りできるようになります。

運用最適化のヒント

  1. セキュリティ第一: exportsファイルで `*`(アスタリスク)を絶対に使用しないでください。内部データの漏洩を防ぐため、必要なサーバーのIPのみを許可します。
  2. ヘルスチェック: 定期的に `nfsstat -c` コマンドを使用してください。`retrans`(再転送)の数値が高い場合は、内部ネットワークの混雑やスイッチの不具合の兆候です。
  3. ネットワークの分離: 可能であれば、エンドユーザーの帯域幅に影響を与えないよう、NFSを専用のネットワークカード(ストレージネットワーク)で運用してください。

まとめ

CentOS Stream 9上のNFSは、中規模システムにとって非常に安定しており、導入しやすいソリューションです。現在ではS3やCephのような最新のソリューションも多くありますが、シンプルさと低遅延という点において、NFSは依然として独自の地位を保っています。システムの構築が成功することを願っています!

Share: