Linuxサーバーには、プロセスによって積極的に追加されるバイナリファイルがあります(ASCII以外のバッファをファイルに開き、フラッシュするファイルハンドラを使用してCで書かれています)。書き込み(Cプロセス)をロックせずにこのファイルを別のサーバーにコピーしたいと思います。毎回ファイル全体をコピーしないことをお勧めします(ファイルサイズ〜1 + GBとコピー頻度< 1秒)。
以下を調べました。 rsync:rsyncは完全コピーを実行しますが、増分コピーは実行しないと思います。
filebeat by elasticsearch:ASCIIテキストと改行文字が必要です(どちらもありません)。
私は標準のLinuxツールを利用することを好みますが、他のサードパーティのソリューションやCプログラムを直接作成することもオープンです。 :)
答え1
存在する場合のみ追加(そして途中で変更せずに)tail -f
直接実行できます。新しく追加されたデータを待ってから印刷する必要があります。開始する場所を教えてください。
tail -c 0 -f datafile # start at the current file end
tail -c +123 -f datafile # start at byte 123
実際にデータをどこかに移動するには、パイプがssh
機能する必要があります。
したがって、リモート側にすでに最初の123456バイトがある場合:
tail -c +123456 -f datafile | ssh user@somehost 'cat >> datafile.copy'
(もちろん、パイプラインを開始する前に、リモートでファイルサイズを確認する必要があります。)
逆に、ファイルの途中で変更すると、プログラム自体に一種のロギング層が必要になります。ファイルシステムのスナップショットは機能できますが、1秒間隔は難しい場合があります。特に、ファイル内の変更を検索する必要があるため、さらにそうです。
答え2
Rsyncは初期同期後にデルタをプッシュする必要があります。別のオプションは、ファイルの場所のスナップショットを撮ることです。これは、使用しているLVMにスナップショットをサポートするファイルシステムがあるかどうかによって異なります。スナップショットを撮ってから、ファイルをリモートの場所に同期できます。その後、スナップショットを削除します。ライブファイルに触れないので、このアイデアも気に入っています。