如何高效地使用 S3 增量备份文件?

Jai*_*ich 45 rsync amazon-s3 duplicity

我了解 rsync 如何在高层次上工作,但有两个方面。对于 S3,没有守护进程可言——好吧,但它基本上只是 HTTP。

看起来有几种方法。

s3rsync(但这只是将 rsync 绑定到 s3)。直截了当。不确定我想依赖第三方的东西。我希望 s3 只支持 rsync。

也有一些 rsync '克隆',如双重性,声称支持 s3 而不说螺栓连接。但它怎么能做到这一点呢?他们是否在本地保存索引文件?我不确定这如何有效。

我显然想使用 s3,因为它既便宜又可靠,但 rsync 是一些工具,比如备份一个巨大的图像目录。

这里有哪些选择?使用 duplicity + s3 而不是 rsync + s3rsync + s3 我会失去什么?

Dan*_*tts 42

由于上次回答了这个问题,因此有一个新的 AWS 命令​​行工具aws.

它可以在本地存储和 s3 之间进行类似 rsync 的同步。用法示例:

aws s3 sync s3://mybucket /some/local/dir/
Run Code Online (Sandbox Code Playgroud)

如果您系统的 python 环境设置正确,您可以使用pip以下命令安装 AWS 客户端:

pip install awscli
Run Code Online (Sandbox Code Playgroud)

  • 我相信你它不起作用,但是文档说“如果本地文件的大小与 s3 对象的大小不同,本地文件将需要上传,本地文件的最后修改时间比s3 对象的最后修改时间,或者指定的存储桶和前缀下不存在本地文件。” 确保您拥有最新版本的 aws-cli - 如果您可以重现这一点,请在 github 上向他们提交错误。当我不久前提交错误时,他们做出了回应。 (3认同)
  • 根据我的经验,这会上传所有内容,而不仅仅是变化的增量。例如,我使用 `rsync` 将一个静态站点推送到一个开发服务器,平均需要 1 秒,只有在我的慢速连接上发生更改。另一方面,`aws s3 sync` 需要大约 5 分钟,重新传输每个文件。 (2认同)

Nic*_*ell 16

s3cmd工具有一个伟大的sync选择。我用它来同步本地备份,使用类似的东西:

s3cmd sync --skip-existing $BACKUPDIR/weekly/ s3://MYBACKUP/backup/mysql/
Run Code Online (Sandbox Code Playgroud)

--skip-existing意味着它不会尝试校验和比较现有文件。如果已经有一个具有该名称的文件,它会快速跳过它并继续前进。还有一个--delete-removed选项可以删除本地不存在的文件,但我想保留 S3,即使是我在本地清理过的文件,所以我不使用它。


Jac*_*ack 6

不想告诉任何人该做什么,但我可以挥舞一面旗帜以示两面派吗?或其他增量备份解决方案。同步一切都很好,但如果你每晚备份,如果两天都没有注意到问题会怎样?答:太晚了,你的本地文件和你的备份是互为镜像的,都没有你需要的数据。您确实应该考虑增量备份或快照,以便您可以及时恢复到特定时刻,并且要有效地执行此操作,您需要增量备份。如果丢失您的数据是世界末日的情景,那么在您永远不知道的情况下将副本保存在不同的提供商处,然后可能会丢失,谁知道被黑客入侵。

我使用双重性和 s3,它很好,但是 CPU 密集型。但它做增量备份。在紧急情况下,当您想恢复一个目录或特定文件时,因为它是上周三或去年一月,而不恢复同一分区上的其他文件,您需要增量备份和一个工具,您可以在其中请求您需要的文件。

我有一个 cron,它每 x 个月执行一次,否则增量并删除超过 x 个月以保持 s3 存储总量下降,最后执行收集状态,所以我每天早上都会收到带有状态的邮件。您需要定期关注它,以便您注意到备份何时不起作用。

它需要大量的本地临时空间来保存本地签名,因此请仔细设置临时目录。这会备份 /mnt,不包括 /mnt 中的各种目录。这有利于备份数据,系统分区使用亚马逊镜像或快照工具。

PHP脚本:

# Duplicity Backups

$exclude  = "--exclude /mnt/ephemeral ".
            "--exclude /mnt/logs ".
            "--exclude /mnt/service ".
            "--exclude /mnt/mail ".
            "--exclude /mnt/mysql ";

$key = "PASSPHRASE=securegpgpassphrase";

$tmp = "/mnt/mytempdir";

system("mkdir -p $tmp");

# Amazon

$aws = "AWS_ACCESS_KEY_ID=xxxxxx ".
       "AWS_SECRET_ACCESS_KEY=xxxxxx ";

$ops = "-v5 --tempdir=$tmp --archive-dir=$tmp --allow-source-mismatch --s3-european-buckets --s3-use-new-style --s3-use-rrs";
$target = " s3://s3-eu-west-1.amazonaws.com/mybucket";

# Clean + Backup

system("$key $aws /usr/bin/duplicity $ops --full-if-older-than 2M $exclude /mnt $target");
system("$key $aws /usr/bin/duplicity $ops remove-older-than 6M --force $target");
system("$key $aws /usr/bin/duplicity $ops cleanup --force --extra-clean $target");
system("$key $aws /usr/bin/duplicity $ops collection-status $target")
Run Code Online (Sandbox Code Playgroud)

  • 打开 s3 存储桶的版本控制,然后它将保留旧副本 (2认同)

小智 5

您也可以使用 minio 客户端 aka mc使用 'mc mirror' 命令即可完成这项工作。

$ mc mirror share/sharegain/ s3/MyS3Bucket/share/sharegain 
Run Code Online (Sandbox Code Playgroud)
  • mc:minio 客户端
  • share/sharegain: 本地目录
  • s3:https ://s3.amazonaws.com 的别名
  • MyS3Bucket:我的远程 S3 存储桶
  • share/sharegain:我在 s3 上的对象

您可以编写一个简单的脚本作为 cronjob,它将定期保持同步。

希望能帮助到你。


Chi*_*ida 3

S3 是一个通用对象存储系统,它为您提供足够的灵活性来设计您想要的使用方式。

从您的问题中我不确定 rsync 的问题(索引除外)或您遇到的“第 3 方”工具的问题。

如果您有大量结构良好的文件,则可以在子文件夹上运行多个 s3 同步。

Amazon 的好心人还允许您从便携式硬盘进行导入/导出,以将大文件传输到 S3 或 EBS - http://aws.amazon.com/importexport/,您可以将其用于首次上传。

请参阅此处的 Amazon s3 最佳实践 - http://aws.amazon.com/articles/1904

至于不同的工具,请尝试一下,看看哪种最适合您。关于定价,如果适合您的需求,则可以降低冗余定价 - http://aws.amazon.com/s3/pricing/

一般建议——拥有快速的多核 CPU 和良好的网络管道。

更新:提及 S3 上的校验和

S3以键值对的形式存储数据,没有目录的概念。S3sync 验证校验和(S3 有一种机制将校验和作为标头发送以进行验证 - Content-MD5 标头)。最佳实践链接数据完整性部分有详细说明。S3 允许您发送/验证和检索校验和。有很多人口是心非地进行增量备份。即使 S3 上没有运行 rsync,您也可以像我在这里提到的那样进行校验和。

rsync 是一个经过验证的工具,大多数现代工具都使用相同的算法或 rsync 库或从外部调用 rsync。

  • 我不明白这如何回答这个问题。我问的是,在另一端没有守护进程的情况下,口是心非如何做到 rsync 所做的事情。它甚至无法获得校验和,或者也许可以,但是它如何增量更新文件呢? (2认同)