通过 ssh 传输许多类似的文件

通过 ssh 传输许多类似的文件

Linux 服务器上的服务只能进行完整备份,其中每个备份都是 .tar 存档(无压缩)。档案的许多内容每天都不会改变。每个 .tar 文件大小约为 3GB(每天都在缓慢增加)。

我想将备份传输到另一台服务器,该服务器将它们存档。转移是通过互联网完成的。

要求是备份不被更改(结果又是一个 .tar 文件列表,其 md5 和仍然与服务器上的原始文件相同)。

我目前正在使用 rsync 来传输文件,效果很好,但所有文件都以其完整大小传输。据我所知,rsync 在传输上进行了某种重复数据删除,但仅限于每个文件级别(对吗?)。

有没有什么方法可以通过 SSH 连接传输一些相似的文件,而无需重新传输相同的文件块(因此某种重复),即

  • 不需要服务器上的写访问权限(无需解压 tar 文件)
  • 容忍连接丢失(中止时不会留下临时文件并检测未正确传输的文件)
  • 能够在连接丢失后恢复传输(如果连接中止,则不重新传输所有文件)
  • 不需要服务器上任何额外的工具(除了标准的unix工具链,包括rsync)
  • 仍然使用客户端发起的 SSH 连接进行传输

答案1

您可以做的一件事是(在接收端)在启动 rsync 之前将最后一个备份文件复制到新名称。然后它只会传输你拥有的和你应该拥有的之间的差异。

如果您这样做,请务必小心rsync -u(仅更新,基于时间戳)确保您的副本比新源文件旧。

答案2

一个可能的想法,来自罗兰(Cybso)塔普肯rsync --fuzzy,与按日期的目录一起使用

将存档放在以日期命名并称为current.tarand的目录中parent.tar,其中parent.tar是到前一个的硬链接current.tar。与此结合 应该可以工作,因为和--hard-links的编辑距离低于 25(实际上是 3)。当然,源文件系统和目标文件系统都必须支持硬链接,并且必须确保在之前传输。current.tarparent.tarparent.tarcurrent.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

其中连接线表示硬链接(即相同的索引节点)。

相关内容