Linuxサーバーのサービスはフルバックアップのみを実行でき、各バックアップは.tarアーカイブ(圧縮されていません)です。アーカイブの内容のほとんどは日々変わりません。各.tarファイルサイズは約3GBです(毎日ゆっくりと増えます)。
バックアップをアーカイブしている別のサーバーに転送したいです。転送はインターネット経由で行われます。
要件は、バックアップが変更されていないことです(結果は、再度md5の合計がサーバーの元のファイルと同じ.tarファイルのリストです)。
私は現在rsyncを使ってファイルを転送していますが、うまくいきますが、すべてのファイルはフルサイズで転送されます。私が知る限り、rsyncは転送中に一種の重複排除を実行しますが、ファイルごとのレベルでのみ実行されます(正しいですか?)。
同じファイルチャンク(ある種の重複)を再送信せずにSSH接続を介して同様のファイルを転送する方法はありますか?
- サーバーへの書き込みアクセスは必要ありません(tarファイルを解凍する必要はありません)。
- 接続損失を許可します(中断時に一時ファイルを残さず、正しく転送されていないファイルを検出します)。
- 接続が切断された後に転送を再開する機能(接続が中断された場合はすべてのファイルを再送信しない)
- rsyncを含む標準のUnixツールチェーンに加えて、サーバーに追加のツールは必要ありません。
- 転送のためにクライアントが開始したSSH接続を引き続き使用しています。
答え1
あなたができることの1つは、rsyncを起動する前に(受信側で)最後のバックアップファイルを新しい名前にコピーすることです。それはあなたが持っているものとあなたが持っているべきものの間の違いだけを伝えます。
これを行う場合は、rsync -u
コピーが新しいソースファイルより古いかどうかを確認してください(更新のみ、タイムスタンプに基づいて)。
答え2
考えられる考えローランド (Cybso) Tapkenrsync --fuzzy
、日付別カタログで使用
current.tar
日付と名前の付いたディレクトリにアーカイブを配置し、古いディレクトリへのハードリンクがあるparent.tar
場所を指定します。の編集距離が25(実際には3)未満なので、これをこれと組み合わせると機能します。もちろん、ソースファイルシステムとターゲットファイルシステムの両方がハードリンクをサポートし、転送前にこれを保証する必要があります。parent.tar
current.tar
--hard-links
current.tar
parent.tar
parent.tar
current.tar
私はこれを(完全にテストされていない)と解釈します。
cd $backups
dir=$(date +%s)
latest=$(ls | tail -n 1) # N.B. we control names in this directory!
mkdir $dir
ln $latest/01-current.tar $dir/01-parent.tar
$do_backup > $dir/02-current.tar
rsync -arz --fuzzy --hard-links ./ $server/backups/
失敗した場合は、上記の行をrsync
再度実行でき、中断された部分から続行する必要があります。親ファイルを最初に転送することを奨励するために、数値プレフィックスを使用して日次ディレクトリのファイル名を指定します。--delete
完全に転送されたディレクトリをクライアントから安全に削除し、バックアップがサーバーに残るように意図的にそれを含めませんでした。
次のディレクトリ構造で終了する必要があります。
$backups
1437502724
02-current.tar-\
1437589112 |
01-parent.tar--/
02-current.tar---\
1437675488 |
01-parent.tar----/
02-current.tar
接続線はハードリンク(つまり同じインデックスノード)を表します。