使用数据块进行高效的增量备份

时间:2012-02-12 15:41:10

标签: backup backup-strategies remote-backup

我正在开发一个备份工具,我无法找到最有效的远程备份方法。我不希望每次发生小变化时发送整个文件,所以我认为增量备份是解决方案。这一切都很好,但现在我遇到了一个问题,我怎么能将一个文件分成多个部分。

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

First line
Second line
Third line
Fourth line

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

但是如果发生这样的事情会发生什么:

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

现在我添加了“First and half line”,现在每一行都在不同的地方。因此,如果每一行都是一个块,看起来第一个块之后的每个块都发生了变化,即使内容是相同的。

这有什么简单的解决方案吗?首先,我认为我可以对每个块进行散列,然后创建指示正确块顺序的“目录”。这样,如果块已经存在哈希,我可以轻松匹配。但是我意识到哈希表解决方案除了可以预测和修复块的文件之外别无效。例如,对于二进制文件,你几乎受限于固定字节大小的块,所以如果在开始时添加了更多的数据并且你开始砍掉它以让我们说100k块,那么你将在后面的块中获得与之前不同的数据。 / p>

任何解决方案?

2 个答案:

答案 0 :(得分:0)

“diff”或“rsync”等程序以自己的方式解决了这个问题。

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

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

答案 1 :(得分:0)

您可以使用rsync将昨天备份同步到今天的文件夹,然后运行rsync以仅同步更新的文件。

#!/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/
相关问题