0

バックアップ ツールを開発していますが、リモート バックアップを行う最も効率的な方法がわかりません。小さな変更があるたびにファイル全体を送信したくないので、増分バックアップが解決策だと思います。これで問題はありませんが、1 つのファイルを複数の部分に分割するにはどうすればよいかという問題に悩まされています。

問題は、単純なテキスト ファイルがあり、1 つのチャンクが 1 行であるとしましょう。

First line
Second line
Third line
Fourth line

今、私は4つのチャンクを持っています。2行目を「THE 2行目」と言うように更新すると、2番目のチャンクをバックアップするだけで済みます。

しかし、次のようなことが起こったらどうでしょうか。

First line
First and half line
Second line
Third line
Fourth line

「前半行」を追加したので、すべての行が別の場所になりました。したがって、各行が 1 つのチャンクである場合、内容が同じであっても、最初の行以降のすべてのチャンクが変更されているように見えます。

これに対する簡単な解決策はありますか?最初に、各チャンクのハッシュを実行してから、正しいチャンクの順序を示す「カタログ」を作成できると考えました。このようにして、チャンクがすでにハッシュに存在する場合、簡単に一致させることができます。しかし、ハッシュ テーブル ソリューションは、チャンクを予測して修正できるファイル以外では機能しないことに気付きました。たとえば、バイナリ ファイルの場合、固定バイト サイズのチャンクにかなり制限されているため、最初に追加されたデータがさらに多く、たとえば 100k チャンクに切り刻み始めた場合、後のチャンクでは以前とは異なるデータが取得されます。

解決策はありますか?

4

2 に答える 2

0

「diff」や「rsync」などのプログラムは、独自の方法でこの問題を解決します。

基本的なアルゴリズムでは、「変更ウィンドウ」を選択する必要があり(そのサイズは使用可能なメモリと時間に依存し、ウィンドウが長いほど一致する作業が長くなります)、同じブロックの新旧のハッシュが一致しない場合は、実際に一致させようとします指定されたウィンドウ内の次のブロックで。ブロックの削除も処理するには、より一般化されたアルゴリズムが必要です(たとえば、実際には+/-ハーフウィンドウで一致を試みることができます)。

Rsync(http://rsync.samba.org/)は、ディスクとネットワークの両方のI / O効率的な方法でこの増分バックアップジョブを実行し、この単純なハッシュマッチングよりもはるかに高度です。アルゴリズムとプロトコルを設計するには、著者のAndrewTridgellと数年の専門の修士論文が必要でした。これに3年の余裕がない場合は、論文を読んでみてください。楽しんでください:http ://samba.org/~tridge/phd_thesis.pdf

于 2012-04-20T13:09:39.427 に答える
0

rsync を使用して昨日のバックアップを今日のフォルダーに同期し、rysnc を実行して更新されたファイルのみを同期できます。

#!/bin/sh
# Create a Backup of Today
mkdir -p /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username
rsync -avz /storage/backups/`date --date=yesterday +\%Y-\%m-\%d`-`date --date=yesterday +\%A`/$host/$username/ /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username/
rsync -avz -e ssh --delete --exclude='logs' tim@tim.tim.net:/home/tim/ /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username/
于 2012-09-12T06:55:23.640 に答える