2011-02-16 60 views
1

我有一個使用rdiff進行在線備份的產品。目前是什麼情況是:流rdiff - 三角洲差異?

  1. 將文件複製到一個臨時區域(所以該文件將不會消失或者被修改,而我們在它的工作)

  2. 哈希原始文件,並計算出使用rdiff簽名(用於增量差異) 計算一個rdiff進行增量差(如果我們沒有現有版本中,這個步驟是跳過)

  3. 壓縮&加密所得到的增量差

目前,這些階段是相互獨立執行的。最終的結果是我們多次迭代文件。對於小文件來說,這並不是什麼大問題(特別是磁盤緩存),但對於大文件(10 GB甚至100 GB)來說,這是一個真正的性能殺手。

我想將所有這些步驟合併爲一個讀/寫通行證。

要做到這一點,我們必須能夠以流方式執行上述所有步驟,同時仍保留所有「輸出」 - 文件哈希,rdiff簽名,壓縮的&加密差異文件。這將需要從源文件讀取一塊數據(比如100k?),然後迭代內存中的文件以更新散列,rdiff簽名,做差異差異,然後將輸出寫入壓縮/加密輸出流。目標是大大減少我們所做的磁盤抖動量。

目前我們使用rdiff.exe(這是底層librsync庫頂層的薄層)來計算簽名並生成二進制增量。這意味着這些都是在一個獨立的過程中完成的,並且是以一次性完成的,而不是流式時尚。

我怎樣才能得到這個來做我需要使用librsync庫?

回答

0

您完全可以跳過第1步。文件在打開時不能被刪除,打開文件時選擇合適的鎖定標誌也會阻止文件被修改。例如,CreateFile函數採用dwShareMode參數。

在開始創建rdiff增量之前,您需要計算整個rdiff簽名。您可以避免通過計算簽名來讀取整個文件,然後爲每個(比如說)100MB的文件塊一次增量。這種方式會損失一些壓縮效率*。您也可以考慮從rdiff切換到xdelta,這可以通過輸入一次性創建增量文件。

壓縮和加密可以與計算增量並行完成。如果壓縮和加密是通過單獨的程序完成的,它們通常允許從標準輸入讀取並寫入標準輸出。這可以通過管道在批處理文件中使用最簡單的,例如:如果您使用的壓縮/加密庫在你的程序

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的增量文件。rdiff每次100 MB或更少的塊將會產生大約10 GB的delta。 200 MB的塊將產生大約5 GB的增量,因爲每個塊中只有一半數據來自舊版本文件的相應塊。

+0

你是什麼意思,「適當的鎖定標誌」?我如何實現這一目標?另外,你說「壓縮和加密可以與計算三角洲並行完成」,這是如何實現的?我只是沒有看到(試圖實現這一點後幾小時)如何可能。你會怎麼做? – spentak 2011-02-17 15:48:40