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


42

我了解rsync在更高层次上的工作原理,但是有两个方面。使用S3,没有守护程序可言-确实存在,但基本上只是HTTP。

看起来有一些方法。

s3rsync(但这只是将rsync连接到s3)。直截了当。不确定我是否要依赖第三方。我希望s3仅支持rsync。

还有一些类似rsync的“克隆”(如双重性)声称在不使用螺栓的情况下支持s3。但是如何做到这一点?他们在本地保存索引文件吗?我不确定这会如何有效。

我显然想使用s3,因为它便宜且可靠,但是rsync是其中的工具,例如备份庞大的图像目录。

这里有什么选择?使用重复性+ s3而不是rsync + s3rsync + s3,我会失去什么?


4
S3便宜吗?这对我来说是个新闻。可靠?当然,但不便宜。
EEAA 2012年

5
好吧,随着您存储更多或想要更少的冗余,s3为$ 0.13 / gb或更低。快速搜索显示evbackup.com用于rsync存储。贵得多。什么更便宜并且具有一定程度的冗余?
2012年

如果要设计rsync,它将支持插件,以便可以添加新协议(例如s3://)。但是,目前rsync不支持此功能,因此我认为rsync不能直接用于备份到S3。
爱德华·福尔克

下一个问题是我不认为S3会存储所有权或权限之类的元数据,因此使用“ aws s3 sync”进行备份将可以工作,但可能不适合Unix文件系统的全面备份,因为还原时会丢失太多数据。我还认为符号链接,硬链接和其他特殊文件将丢失。
爱德华·福尔克

Answers:


39

自上次回答此问题以来,就有一个新的AWS命令行工具aws

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

aws s3 sync s3://mybucket /some/local/dir/

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

pip install awscli

1
以我的经验,这将上传所有内容,而不仅仅是变化的增量。例如,我使用将该静态站点推送到开发服务器rsync,平均花费了1秒的时间,而所做的更改仅通过缓慢的连接发出。 aws s3 sync另一方面,大约花费了5分钟,重新传输了每个文件。
ryebread16年

2
我相信您无法使用,但是文档说:“如果本地文件的大小与s3对象的大小不同,则本地文件将需要上传,本地文件的最后修改时间比s3对象的上次修改时间,或者本地文件在指定的存储区和前缀下不存在。” 确保您具有最新版本的aws-cli-如果可以重现此文件,请在github上向其提交错误。当我前一段时间提交错误时,他们反应迅速。
丹·普里兹

该命令应为:aws s3 sync / some / local / dir / s3:// mybucket
Carlo S

1
卡洛斯,我不确定你的意思是。如果您要暗示我的示例命令是错误的,那么我们都是对的。s3同步可以在任一方向上工作。
丹·普里兹

聚会晚了,但是发生了什么事情:上传到S3时,将应用快速检查规则(如果大小或日期已更改,则进行上传)。在下载时,没有快速检查规则,并且所有内容都是无条件下载的。
爱德华·福尔克

16

s3cmd工具有一个伟大的sync选择。我使用它来同步本地备份,方法如下:

s3cmd sync --skip-existing $BACKUPDIR/weekly/ s3://MYBACKUP/backup/mysql/

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


5

不想告诉任何人该怎么做,但是我可以挥舞一下以示重复吗?或其他增量备份解决方案。同步一切都很好,但是如果您每晚备份一次,如果两天都没有注意到问题会怎样?答:为时已晚,您的本地文件和备份是彼此的镜像,并且都没有所需的数据。您确实应该考虑增量备份或快照,以便可以及时恢复到特定时刻,并且要高效地执行此操作,您需要增量备份。而且,如果丢失数据是世界末日的场景,那么将副本保存在您从未知晓的其他提供商处,则可能会丢失,被黑客知道。

我使用duplicity和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")

1
开启s3存储桶的版本控制,然后它将保留旧副本
mcmillab

3

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

从您的问题中,我不确定rsync的问题(除了索引编制)还是您遇到的“第三方”工具的问题。

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

亚马逊的好伙伴还允许您从便携式硬盘驱动器进行导入/导出,以将大文件传输到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。


1
我看不出这如何回答问题。我在问,如果没有另一端的守护程序,重复性如何管理rsync所做的事情。它甚至无法获得校验和,或者可能会获得校验和,但是它将如何增量更新文件?
Jaimie Sirovich 2012年

好。因此,您是说Duplicity使用了S3中的哈希值,但它也声称可以在FTP上工作。FTP没有哈希机制。我倾向于在安全方面犯错误,并使用“经过验证的”工具。Rsync被证明是可以的,但是如果没有s3附加服务s3rsync,它将不会执行s3备份。我有点害怕重复性,但是如果我可以在不使用上述辅助服务的情况下使用s3获得某种程度的类似于rsync的功能,则它具有更大的协议吸引力。我只是不明白如何以及它的工作原理(也可能是不同的各种协议)。FTP同步如何执行?:)
Jaimie Sirovich 2012年

@JaimieSirovich测试一下,看看。如果你有,你就知道口是心非建立在比它把你键入这些关于它的评论更短的时间“清单”的文件可能会做的事情。
ceejayoz 2014年

3

您也可以使用minio client aka mc使用“ mc mirror”命令来完成这项工作。

$ mc mirror share/sharegain/ s3/MyS3Bucket/share/sharegain 
  • mc:minio客户
  • share / sharegain:本地目录
  • s3:https://s3.amazonaws.com的别名
  • MyS3Bucket:我的远程S3存储桶
  • 分享/分享收益:我在s3上的对象

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

希望能帮助到你。


-w现在还有一个标志,它将用于fsnotify监视更改。可以轻松将其设置为系统服务或类似服务。
alkar

2

我不确定真正的rsync是否适合亚马逊。

据我了解,标准的rsync算法意味着客户端为文件的每个块计算哈希,而服务器为文件的副本计算哈希并将这些哈希发送给客户端,这意味着客户端可以确定哪些块已更改并需要上传。

这给亚马逊带来了两个问题,即大量的哈希必须通过互联网发送出去,并且还需要处理能力来计算所有这些哈希,这会增加亚马逊的成本-这可能就是为什么他们将其留给第三方提供商的原因为此功能额外收费。

至于克隆,它们显然将哈希存储在某个地方,并且某个地方可能会因克隆而异。他们有可能将哈希作为每个文件的单独对象存储在Amazon或存储在Amazon的数据库中,或者可以将它们存储在本地和远程。

无论哪种方式,都有其优点和缺点。如果散列远程存储在单个文件中,则连续检索它们可能会很昂贵。如果散列远程存储在数据库中,则该数据库可能会很大,并且不断检索和更新它们可能会很昂贵。如果将哈希存储在本地,则有助于降低成本,但会带来其他复杂性和问题。

(当然,Amazon还有其他服务,因此可以将数据库保留在Amazon DB中)

作为示例,很多年前,我尝试了一个早期的rsync克隆。编写此代码时未考虑到亚马逊的定价结构,而是发行了许多http来检索每个区块的哈希值,并且由于Amazon为每个区块收取费用,这意味着虽然我的账单的存储部分急剧下降,但转帐部分气球

使用重复性+ s3而不是rsync + s3rsync + s3,我会失去什么?

您失去了使用rsync知道您正在将源文件与备份文件进行比较的事实。使用双重性和其他克隆,您会将源文件与执行备份时使用的哈希进行比较。例如,可以直接访问S3并替换其文件之一,而无需重新计算哈希或更新哈希数据库。


0

在比较了该线程中提到的多个选项之后,我决定选择S3fs。它允许您将S3挂载为本地文件系统。然后,您可以按照已知的方式继续使用rsync。

这是一个入门的好教程: 带有Rsync的Amazon S3

作者先前使用了提到的s3sync,但随后切换到S3F的选项。我喜欢它,因为我还通过SSHFS在本地安装了其他备份文件夹。


12
危险,威尔·罗宾逊!这确实很昂贵,因为您无法获得rsync低带宽通信的任何好处--- s3fs最终将读取(然后写入,如果它发生更改)整个文件,这意味着Amazon将向您收取两次费用。而是考虑使用EC2实例,并通过ssh远程使用rsync。从EC2实例到S3的传输是免费的,因此您所支付的只是rsync从本地计算机到EC2实例的低带宽通信。按需运行EC2微型实例几乎不花任何费用。
大卫

2
这个!对于那些不了解rsync和S3的人,有很多不好的建议……
Mark

这样做的一个缺点是现在您要管理一个微型实例。如果您知道如何的话,这是微不足道的,但是对于许多人来说,这是一个进入障碍。从正面来看,与EC2相连的EBS存储大约是S3每字节价格的一半。
丹·普里兹

@DavidGiven如果我不使用rysnc直接写到挂载的s3fs,然后通过生命周期管理寿命,该怎么办?
Forethinker '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.