他のプロセスで添付ファイルを安全に読み取ることができますか?

他のプロセスで添付ファイルを安全に読み取ることができますか?

プロセスAがファイルをlocのいくつかの場所にコピーし、プロセスBが定期的にlocから別の場所にファイルをコピーする場合、Bは現在Aがlocにコピーしているファイルを読み取ることができますか?

これが重要な場合は、Ubuntu Linux 12.04を使用しています。


背景情報:PostgreSQLクラスタを継続的にバックアップしたいと思います。 PostgreSQLはこの目的のためにWALアーカイブを提供します。データベースにWALファイル全体をバックアップ場所にコピーするスクリプトを呼び出すことで機能します。

バックアップされたWALファイルを定期的に別のサーバーにコピーする別のプロセスが必要です。データベースが現在WALファイルをコピーしている場合、ファイル全体がコピーされる前に、2番目のプロセスが一部のEOF条件に遭遇することなくファイルを読み続けることができますか?

つまり、AとBを同期せずに次のことができますか?

A                                   B
cp pg_xlog/some_wal_file /backup/   scp /backup/* user@remote-machine:/backups/

ベストアンサー1

この場合の唯一の保証は、Bがファイルまたはファイルのプレフィックスをコピーしないことです。 Bはファイルが作成されていることがわからないので、ファイルの(現在の)最後まで読み取ってから停止します。

このトラップを回避する一般的な方法は、ファイルを一時的な名前にコピーしてから名前を変更することです。

dest=$(TMPDIR=/backup mktemp)
trap 'rm -f "$dest"' INT HUP ERR
cp -p pg_xlog/some_wal_file "$dest"
mv "$dest" "/backup/some_wal_file"

消費者から一時ファイルがコピーされないように準備します。あなたのシナリオでは、dest=$(TMPDIR=/backup mktemp .XXXXXXXXXX)上記の方法を使用してドットファイルにすることでこれを達成できます。より簡単なアプローチは、基本的にこの戦略を使用する代わりにをrsync呼び出すcpことです。rsync

rsync -a pg_xlog/some_wal_file /backup/

手順Bでは、次の一時ファイルを除外する必要があります。

rsync -a --exclude='/.*' /backup/ user@remote-machine:/backups/

ドットファイルに依存したくない場合は、ステージングディレクトリを使用できます。両方のディレクトリが同じファイルシステム上にある限り、あるディレクトリから別のディレクトリにファイルを移動するのはアトミックです。

mkdir -p /backup/incoming
cp -p pg_xlog/some_wal_file /backup/incoming/
mv /backup/incoming/some_wal_file /backup/
rsync -a --exclude=/staging  /backup/ user@remote-machine:/backups/

おすすめ記事