0

我正在开发一个备份工具,但我想不出最有效的远程备份方法。我不想每次有小的变化时都发送整个文件,所以我猜增量备份是解决方案。这一切都很好,但现在我遇到了一个问题,即如何将一个文件分成多个部分。

问题是,假设我有一个简单的文本文件,一大块是一行:

First line
Second line
Third line
Fourth line

现在我有 4 块。如果我将第二行更新为“第二行”,现在我只需要备份第二个块。

但是如果发生这样的事情怎么办:

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

现在我添加了“第一行和半行”,现在每一行都在不同的位置。因此,如果每一行都是一个块,那么看起来第一个块之后的每个块都发生了变化,即使内容是相同的。

有什么简单的解决方案吗?首先,我认为我可以对每个块进行哈希处理,然后创建指示正确块顺序的“目录”。这样,如果该块已经与散列一起存在,我可以轻松匹配。但是,我意识到哈希表解决方案只能用于可以预测和修复块的文件。例如,对于二进制文件,您几乎受限于固定字节大小的块,因此如果在开始时添加了更多数据并且您开始将其切割成 100k 块,那么您在后面的块中将获得与以前不同的数据。

有什么解决办法吗?

4

2 回答 2

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 回答
0

诸如“diff”或“rsync”之类的程序以它们自己的方式解决了这个问题。

基本算法需要你选择一个“修改窗口”(它的大小取决于可用内存和时间,更长的窗口需要更长的匹配工作),当同一块的新旧哈希不匹配时,你实际上会尝试匹配与给定窗口内的下一个块。您需要一个更通用的算法来处理块删除(例如,您实际上可以尝试在 +/- 半窗口进行匹配)。

Rsync (http://rsync.samba.org/) 以磁盘和网络 I/O 有效的方式执行此增量备份工作,并且比这种简单的哈希匹配要复杂得多。它需要作者 Andrew Tridgell 数年时间和专门的硕士论文来设计算法和协议。如果你没有 3 年的空闲时间,请尝试阅读论文!玩得开心:http ://samba.org/~tridge/phd_thesis.pdf

于 2012-04-20T13:09:39.427 回答