Linux 服务器上的服务只能进行完整备份,其中每个备份都是 .tar 存档(无压缩)。档案的许多内容每天都不会改变。每个 .tar 文件大小约为 3GB(每天都在缓慢增加)。
我想将备份传输到另一台服务器,该服务器将它们存档。转移是通过互联网完成的。
要求是备份不被更改(结果又是一个 .tar 文件列表,其 md5 和仍然与服务器上的原始文件相同)。
我目前正在使用 rsync 来传输文件,效果很好,但所有文件都以其完整大小传输。据我所知,rsync 在传输上进行了某种重复数据删除,但仅限于每个文件级别(对吗?)。
有没有什么方法可以通过 SSH 连接传输一些相似的文件,而无需重新传输相同的文件块(因此某种重复),即
- 不需要服务器上的写访问权限(无需解压 tar 文件)
- 容忍连接丢失(中止时不会留下临时文件并检测未正确传输的文件)
- 能够在连接丢失后恢复传输(如果连接中止,则不重新传输所有文件)
- 不需要服务器上任何额外的工具(除了标准的unix工具链,包括rsync)
- 仍然使用客户端发起的 SSH 连接进行传输
答案1
您可以做的一件事是(在接收端)在启动 rsync 之前将最后一个备份文件复制到新名称。然后它只会传输你拥有的和你应该拥有的之间的差异。
如果您这样做,请务必小心rsync -u
(仅更新,基于时间戳)确保您的副本比新源文件旧。
答案2
一个可能的想法,来自罗兰(Cybso)塔普肯rsync --fuzzy
,与按日期的目录一起使用
将存档放在以日期命名并称为
current.tar
and的目录中parent.tar
,其中parent.tar
是到前一个的硬链接current.tar
。与此结合 应该可以工作,因为和--hard-links
的编辑距离低于 25(实际上是 3)。当然,源文件系统和目标文件系统都必须支持硬链接,并且必须确保在之前传输。current.tar
parent.tar
parent.tar
current.tar
我将此解释为(完全未经测试):
cd $backups
dir=$(date +%s)
latest=$(ls | tail -n 1) # N.B. we control names in this directory!
mkdir $dir
ln $latest/01-current.tar $dir/01-parent.tar
$do_backup > $dir/02-current.tar
rsync -arz --fuzzy --hard-links ./ $server/backups/
如果失败,上面的行rsync
可以重新执行,并且它应该从中断的地方继续执行。我用数字前缀命名日常目录中的文件,以鼓励首先传输父文件。我故意不包含--delete
,以便可以安全地从客户端删除完全传输的目录,并且备份将保留在服务器上。
您最终应该得到如下目录结构:
$backups
1437502724
02-current.tar-\
1437589112 |
01-parent.tar--/
02-current.tar---\
1437675488 |
01-parent.tar----/
02-current.tar
其中连接线表示硬链接(即相同的索引节点)。