VFSを使用した動的マウント

VFSを使用した動的マウント

奇妙に聞こえる状況に直面しました。さまざまなログファイルを含むディレクトリを含むマウントポイントがあります。ディレクトリをアンマウントして別の場所に再インストールする必要があるかもしれません。 (logrotate主な意図ではありませんが、これを別の方法で考えることができます。)

問題は、これがリアルタイムシステムであることです。いつもログファイルが開きます。アンインストールして再インストールする前に、最初にすべての書き込みプロセスを停止して再インストールした後に再起動できますが、私の場合は常にこれを保証することはできません。ログに記録されているすべてのプロセスが管理下にあるわけではなく、インストールの移行ルーチンが聞こえなかった新しいプロセスが常に存在する可能性があります。あるいは、誰かがインタラクティブにログインしてロギングディレクトリに変更した可能性があります。 (また、一部のプロセスは潜在的な不安定なしに停止できません。)しかし、ロギングディレクトリのファイルに書き込んでいるか、ロギングディレクトリを現在のディレクトリとして使用しているすべてのプロセスは削除をブロックするため、スイッチはまったく機能しません。

だから私がしたいのは、仮想の「動的マウント変換ファイルシステム」を試してみることです。これは、基本的にすべてのファイルシステム操作をデフォルトの物理ファイルシステムにマップする単純なパススルー仮想ファイルシステムです。しかし、マッピングをさまざまな基本的な物理ファイルシステムに動的にリダイレクトする機能いつでも、ファイルが開いていても同じです。

変換中に当然、いくつかの意味論的意味がある。

  • 書き込み用に開かれたファイルは、以前に作成された部分が以前の仮想マウントポイントに残り、新しく作成されたすべての部分が新しい仮想マウントポイントに移動されるように分割する必要があります。これはO_APPENDモードで開かれたファイルで最もうまく機能し、実際にそのファイルに書き込まれたファイルの検索を抑制する必要があるかもしれません。しかし、これらの結果はすべて、順番に作成されたログファイルの場合は完全に問題ありません(もちろん、私のアプリケーションに関連しています)。

  • 読み取るために開いたファイルはEOFまたはEIOを返す必要があります。

  • ログディレクトリを現在のディレクトリとして使用するプロセスは影響を受けるべきではありません(ls移行前後の結果が非常に異なる可能性があるにもかかわらず)。

  • ログディレクトリのサブディレクトリにはさらに考慮する必要があるかもしれませんが、基本的に同じ規則に従います。

これまでは、これらすべてが理解になることを願っています(たとえ私がそう思うのは狂ったと思うかもしれませんが)。

だから私の質問は次のようになります

  1. これを実行できる仮想ファイルシステムモジュールはすでにありますか? (私は「union」ファイルシステムについて知っており、autofsある点ではやや似ています。)

  2. そのようなモジュールが存在しない場合、作成しようとすると克服できない困難を見落としていますか?

  3. 私がやりたいことをするより良い方法はありますか?私の要件は、ファイルシステムをアンマウントして再マウントするのと同じことを行うことですが、私の制限は、ファイルが開いている可能性が高いことです。

(まだ「クレイジーだ。削除するときに開いているファイルがないことを確認すればいい」と言う方もいらっしゃいます。私が言うのはまったく保証できないということです。ログファイルを事前に識別する必要がある解決策は、完全に未来に対処することはできません。


付録:誰かが集中管理を容易にするために、すべてのロギングをsyslog(または他の一意の集中サービス)に切り替えることを提案しました。しかし、前述したように、私はロギングを実行中または実行できるすべてのプロセスを制御できません。たとえば、chronyトレース情報などのエントリを記録するためにsyslogの代わりにfwriteを使用します。 (タイミングをめちゃくちゃにしたくないため、chronyを停止して再起動できないため、ほとんどのchronyロギングを放棄する必要があります。)

答え1

考えられる解決策の1つは、ログを非リレーショナルデータベースに送信することです。

また、いくつかのトリックを試して、複数のソースから同時に書き込みをサポートするファイルシステムを選択することもできます。

どちらのソリューションにも固有の問題があり、私にとっては魅力的ではありません。

質問する際のもう一つの可能​​な解決策は、NFSを介してパブリック/var/log/machineディレクトリを共有することです。これはまた、いくつかのサーバーで動作することができますが、スケーラブルではない不快なハッキングです。

可能であれば、中央のsyslogサーバーを作成し、すべてのログをこのサーバーとして指定します。このようにして、少なくともそのログでは同時問題が解決されます。

直接のシステムロギングに適していない他のアプリケーションでは、システムログの場合でもfilebeatまたはgreylogを考慮します。

最終的にsyslogが不可能なログを中央のsyslogとして処理しようとしています(後者の場合はApacheログとTomcatログを使用します)。

Loggly、Scalyrなどの他の商用製品もご確認いただけます。ニューレリック(New Relic)またはスプランクエンタープライズ(Splunk Enterprise)。追加のボーナスで、経営陣に非常に役立つ統計を提示し、容量計画を立てることができます。

費用を費やして明確に定義されたプロセスがある場合は、新しいソリューションをインストールする必要がある人は誰でも「公式」の方法を使用して公式のターゲットにログを送信する必要があるという内部ルールを設定できます。

PS:あなたは技術的な解決策で組織の問題を解決しようとしています。通常、仕事はうまくいきません。上司に参加する必要があります。

関連情報