1

rdiff を使用してオンライン バックアップを行う製品があります。現在起こっていることは次のとおりです。

  1. ファイルをステージング領域にコピーします (作業中にファイルが消えたり変更されたりしないようにします)

  2. 元のファイルをハッシュし、rdiff 署名を計算します (差分差分に使用されます) rdiff 差分差分を計算します (以前のバージョンがない場合、この手順はスキップされます)

  3. 結果のデルタ差分を圧縮および暗号化します

現在、これらのフェーズは互いに別個に実行されています。最終結果は、ファイルを複数回反復処理することです。小さなファイルの場合、これは大したことではありませんが (特にディスク キャッシングの場合)、大きなファイル (数十または数百 GB) の場合、これは実際のパフォーマンス キラーです。

これらのすべてのステップを 1 つの読み取り/書き込みパスに統合したいと考えています。

そのためには、ファイル ハッシュ、rdiff 署名、圧縮および暗号化されたデルタ差分ファイルなど、すべての「出力」を保持しながら、上記のすべての手順をストリーミング方式で実行できる必要があります。これには、ソース ファイル (たとえば、100k?) からデータのブロックを読み取り、メモリ内のファイルを反復してハッシュ、rdiff 署名を更新し、デルタ差分を実行し、出力を圧縮/暗号化出力ストリームに書き込む必要があります。 . 目標は、ディスクのスラッシングの量を大幅に最小限に抑えることです。

現在、署名を計算し、バイナリ デルタを生成するために、rdiff.exe (基盤となる librsync ライブラリの最上位の薄いレイヤー) を使用しています。これは、これらが別のプロセスで行われ、ストリーミング方式ではなくワンショットで行われることを意味します。

librsync ライブラリを使用して必要なことを行うにはどうすればよいですか?

4

1 に答える 1

0

おそらく、ステップ 1 を完全にスキップできます。ファイルは開いている間は削除できません。ファイルを開くときに適切なロック フラグを選択すると、ファイルが変更されるのを防ぐこともできます。たとえば、CreateFile関数は dwShareMode 引数を取ります。

rdiff デルタの作成を開始する前に、rdiff 署名全体を計算する必要があります。一度にファイルの各 (たとえば) 100 MB ブロックの署名とデルタを計算することで、ファイル全体の読み取りを回避できます。この方法では、圧縮効率がいくらか失われます*。rdiff からxdeltaへの切り替えを検討することもできます。これにより、入力の 1 回のパスでデルタ ファイルを作成できます。

圧縮と暗号化は、デルタの計算と並行して実行できます。圧縮と暗号化を別々のプログラムで行うと、多くの場合、標準入力からの読み取りと標準出力への書き込みが可能になります。これは、バッチ ファイル内のパイプで最も簡単に使用できます。たとえば、次のようになります。

rdiff signature oldfile oldfile.sig
rdiff delta oldfile.sig newfile | gzip -c | gpg -e -r ... > compressed_encrypted_delta

プログラムで圧縮/暗号化にライブラリを使用する場合は、ストリーミング操作をサポートするライブラリを選択する必要があります。

*または、ファイル内でデータが移動すると、多くの効率が失われます。誰かが 100 MB を 10 GB ファイルの先頭に追加すると、rdiff は約 100 MB のデルタ ファイルを生成します。一度に 100 MB 以下のブロックで rdiff を実行すると、約 10 GB のデルタが生成されます。200 MB のブロックは、約 5 GB のデルタを生成します。これは、各ブロックのデータの半分だけが、古いバージョンのファイルの対応するブロックからのものであるためです。

于 2011-02-16T23:53:53.920 に答える