rsync スケジュール操作競合状態の停止 (大きなディレクトリ、小さな時間間隔)

rsync スケジュール操作競合状態の停止 (大きなディレクトリ、小さな時間間隔)

プラットフォーム情報:

OpenBSD 6.2 amd64

$ rsync --version rsync version 3.1.2 protocol version 31

daily.local大容量ディレクトリ(4TB)を次のファイルと同期しようとしています(これはデフォルトではLinux管理者の毎日のクローン操作です)。

#!/bin/sh
# Sync the primary storage device to the backup disk
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/

初期のrsyncコピーには1日以上かかります。 1日か2日後、プロセスリストに実行中のrsyncコピーが複数表示されます。新しいプロセスが予定通りに開始され、これらの新しいプロセスが互いに競合しているように見え、タスクを完了できません(少なくとも高速ではありません)!

新しいrsyncプロセスが他のrsyncプロセスを認識するようにする方法(またはrsync競合状態を防ぐ他の方法)はありますか?

最初にディレクトリをコピーしたり、スケジュールされた間隔を増やすためにrsyncを手動で実行できることを知っています。オンラインでこのトピックに関する情報が見つからないため、この質問にもっと興味があります。

答え1

解決策は次のように似ています。マークのソリューション/etc/fstabただし、ファイルシステムを変更したり、マウントおよびアンマウントする必要はありません。

#!/bin/sh

lockdir=/tmp/file-copy.lock

if ! mkdir "$lockdir"; then
   echo 'File copy already in progress' >&2
   exit 1
fi

trap 'rmdir "$lockdir"' EXIT

PATH=$PATH:/usr/local/bin

rsync -ai ...

これに関するいくつかの注意:

  1. ディレクトリがすでに存在する場合はタスクは失敗しますが、ディレクトリがない場合はディレクトリが作成されるのmkdirと同じアトミックタスクです。mountロックを最初に確認するよりもこれが安全です。文書その後、作成します(2つのステップ間に競合条件がある可能性があります)。

  2. このEXITトラップは、スクリプトの終了時にロックされたディレクトリが削除されることを保証します。ロックディレクトリはにあるため、再起動時にシステムによって削除されます/tmp

  3. フルパスで呼び出すPATHのではなく、適切な値に設定しました。rsyncこれは純粋に装飾的なものですが、後でOpenBSDポートコレクションの他のコマンド(resticまたは)を使用するようにスクリプトを拡張する場合にborgbackup便利です。

  4. このオプションには、-z実際にはrsync次のものだけが必要です。非常に遅いネットワーク接続(ネットワーク帯域幅より速くデータを圧縮/圧縮解除する場合)といいえローカル複製用。私も-i--itemize-changes)より-v()を好みます。--verboseなぜなら、ファイル転送の目的を正確に伝えるからです。

大量のデータを安全にバックアップするには、通常、次rsyncのように特別に作成されたバックアップソフトウェアを使用することをお勧めします。resticまたはborgbackup。どちらも重複排除と暗号化も可能で、オプションborgbackupで圧縮することもできます。サーバーがまだインストールされていない場合でも、外部サーバーにバックアップを保存できますが、ターゲットシステムにソフトウェアをインストールする必要があることをお勧めしますrestic。両方ともバックアップストレージロックを処理します。sftpresticborgbackupresticborgbackup

答え2

この問題を解決する1つの方法(バックアップディレクトリが独自のパーティションにある場合)は、ボリュームをアンマウントされたままにして、rsyncコマンドを開始する前にボリュームをマウントすることです。これにより、使用する必要がなくなり、flockドライブの寿命が延び、消費電力が低くなるという利点があります。

/etc/fstabnoauto起動時に自動的にインストールされないようにパーティションにオプションを追加します。

進行中のタスクdaily.localまたはcron.dailyスケジュールされたタスク:

#!/bin/sh
mount /mnt/media_backup && \
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/ && \
umount /mnt/media_backup

&&デュアルアンパサンド演算子()は、前のコマンドが成功した場合にのみ次のコマンドを開始します。したがって、バックアップディスクをマウントできない場合(すでにマウントされていてrsyncがすでにパーティションで実行されているため)、残りのコマンドは続行されません。

関連情報