共有ストレージ上のシンボリックリンク

共有ストレージ上のシンボリックリンク

たとえば、複数のサーバー間で共有され、アプリケーションによってアクセスされる glusterfs マウントがあり、ログは通常そのマウント ポイントのディレクトリ ツリー内にあるディレクトリに書き込まれるとします (/foo はマウントされた共有ストレージで、/foo/bar はログが書き込まれるディレクトリです)。すべてのサーバーが同じログ ファイルに書き込まないようにするために、/foo/bar を別のローカル ディレクトリ /var/bar へのシンボリック リンクにします。共有ストレージ マウントにローカル シンボリック リンクを作成することは可能ですか? また、それらのシンボリック リンクは、そのストレージにアクセスする他のサーバーにマップできますか? できない場合は、ループ デバイスなど、別の方法がありますか? ログが書き込まれるディレクトリを変更することはできないものとします。

答え1

ファイルシステムがシンボリック リンクをサポートしている場合、シンボリック リンク (POSIX 標準に準拠) はサーバーではなくクライアントで解釈されます。したがって、Linux などの Unix または Unix ライクなシステムでは、他のファイルシステムへのシンボリック リンクを確実に作成できるはずです。

例えば:

/foo        A gluster remote file system
/var        A local file system

/foo/barがへのシンボリックリンクである場合/var/log/myhost、/foo/bar に書き込むすべてのマシンは、そのマシン上のローカルの /var/log/myhost に書き込みます。

/var/logただし、 が存在しない場合は、驚くようなエラー メッセージが表示されて書き込みが失敗します。(試してみてください) したがって、/var/logが存在することを確認してください。ほとんどのシステムではインストール時に作成されるため、これは問題ではありません/var/log。ただし、 へのリンクの場合は、まだ存在しない/var/log/dirname/filename.txt可能性があります/var/log/dirname。この問題に以前遭遇したことがあります。

(この例は、『The Practice of System and Network Administration』の第 28 章で、ネットワーク ファイル システムから /etc/ にリンクすることが推奨されていると思います。)

はい、シンボリックリンクを使用してこれを行うことができます。ただし、同僚を混乱させる可能性があります。ソフトウェアに に書き込むように指示することは可能ですか/var/log/foo? そうすれば混乱が少なくなり、より持続可能になります。同僚は感謝するでしょう。

答え2

共有ファイルシステムに依存します。ただし、一般的には、リモート FS がシンボリックリンクをサポートしている場合は動作します。Gluster ボリュームでシンボリックリンクを実行できますが、問題ありません (テスト済み)。

答え3

おそらく、次のようにシンボリックリンクを設定したいのでしょうか?

/foo      - Gluster mountpoint
/var/log  - local filesystem mountpoint

ローカル サーバー上のサービスは、 にログを記録するように構成されています/foo/log/app.log。また、その/foo/logディレクトリはサーバーごとに存在する必要がありますが、必要に応じて他のユーザーがログを検査できるように、Gluster ボリューム上にも配置する必要があります。

そのためには、2 つのシンボリック リンクを作成することをお勧めします。各サーバーで次の操作を行います。

# mkdir /foo/logs/$(hostname)
# ln -s /foo/logs/$(hostname) /var/log/app

Gluster ボリュームの場合 (必要なのは 1 回のみ):

# ln -s /var/log/app /foo/log

アプリケーションが に書き込むと/foo/log/app.log、シンボリックリンク/foo/logは に解決されます/var/log/app。現在、 は/var/log/app各サーバーのローカルファイルシステム上のシンボリックリンクであり、各サーバーは Gluster ボリューム上の異なるディレクトリを指します。したがって、 は1 つのサーバー上で/var/log/appを指し/foo/logs/server1.example.com/foo/logs/server2.example.com別のサーバー上で を指します。

/foo/log/app.log -> /var/log/app/app.log -> /foo/logs/server1.example.com/app.log

関連情報