我在Amazon S3存储桶中有关键数据。我想每周将其他内容备份到另一个云服务,甚至在S3内部。如果数据丢失,最好的方法是将我的存储桶同步到不同区域内的新存储桶。
我该怎么做?
答案 0 :(得分:13)
我更喜欢使用只更改更新的同步进行本地备份。这不是完美的备份解决方案,但您可以根据需要在以后实施定期更新:
s3cmd sync --delete-removed s3://your-bucket-name/ /path/to/myfolder/
如果您从未使用过s3cmd,请使用以下命令安装和配置:
pip install s3cmd
s3cmd --configure
此外,还应该有3美元/月的S3备份服务,但我还会查看Amazon Glacier,如果您使用多部分上传,它可以让您放置近40 GB的单个存档文件。
http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html#qfacts
请记住,如果您的S3帐户遭到入侵,您可能会丢失所有数据,因为您将同步空文件夹或格式错误的文件。因此,您最好编写一个脚本来存档您的备份几次,例如通过检测一周的开始。
2016年1月17日更新:
基于Python的AWS CLI现在非常成熟。
请使用:https://github.com/aws/aws-cli
示例:aws s3 sync s3://mybucket .
答案 1 :(得分:3)
此脚本备份S3存储桶:
#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time
def main():
s3_ID = sys.argv[1]
s3_key = sys.argv[2]
src_bucket_name = sys.argv[3]
num_backup_buckets = sys.argv[4]
connection = S3Connection(s3_ID, s3_key)
delete_oldest_backup_buckets(connection, num_backup_buckets)
backup(connection, src_bucket_name)
def delete_oldest_backup_buckets(connection, num_backup_buckets):
"""Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
buckets = connection.get_all_buckets() # returns a list of bucket objects
num_buckets = len(buckets)
backup_bucket_names = []
for bucket in buckets:
if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
backup_bucket_names.append(bucket.name)
backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())
# The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
if delete <= 0:
return
for i in range(0, delete):
print 'Deleting the backup bucket, ' + backup_bucket_names[i]
connection.delete_bucket(backup_bucket_names[i])
def backup(connection, src_bucket_name):
now = datetime.datetime.now()
# the month and day must be zero-filled
new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
print "Creating new bucket " + new_backup_bucket_name
new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
copy_bucket(src_bucket_name, new_backup_bucket_name, connection)
def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
src_bucket = connection.get_bucket(src_bucket_name);
dst_bucket = connection.get_bucket(dst_bucket_name);
result_marker = ''
while True:
keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)
for k in keys:
print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name
t0 = time.clock()
dst_bucket.copy_key(k.key, src_bucket_name, k.key)
print time.clock() - t0, ' seconds'
if len(keys) < maximum_keys:
print 'Done backing up.'
break
result_marker = keys[maximum_keys - 1].key
if __name__ =='__main__':main()
我在rake任务中使用它(对于Rails应用程序):
desc "Back up a file onto S3"
task :backup do
S3ID = "AKIAJM3FAKEFAKENRWVQ"
S3KEY = "0A5kuzV+F1pbaMjZxHQAZfakedeJd0dfakeNpry"
SRCBUCKET = "primary-mzgd"
NUM_BACKUP_BUCKETS = 2
Dir.chdir("#{Rails.root}/lib/tasks")
system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
答案 2 :(得分:1)
AWS CLI现在支持此功能。
aws s3 cp s3://first-bucket-name s3://second-bucket-name --recursive
答案 3 :(得分:0)
我过去曾尝试这样做,但仍然非常困难,特别是对于大型,多GB,数百万个文件的存储桶。我找到的最好的解决方案是S3S3Mirror,它就是为了这个目的而制作的。
它不像翻转开关那么微不足道,但它仍然比我尝试过的大多数其他DIY解决方案更好。它是多线程的,并且比类似的单线程方法更快地复制文件。
一个建议:在一个单独的EC2实例上进行设置,一旦运行它,只需关闭该机器但将AMI留在那里。然后,当您需要重新运行时,再次启动机器并完成所有设置。这远不如真正的自动化解决方案,但可以管理每月或每周备份。
答案 4 :(得分:0)
最好的方法是能够在数据丢失的情况下将我的存储桶与不同区域的新存储桶同步。
从24 Mar 2015开始,可以使用S3的Cross-Region Replication功能。
其中一个列出的Use-case Scenarios是&#34;合规性要求&#34;,这似乎与您对关键数据的额外保护与数据丢失的使用情况相匹配:
虽然默认情况下,Amazon S3会将您的数据存储在多个地理位置较远的可用区中,但合规性要求可能会要求您将数据存储在更远的距离。跨区域复制允许您在远程AWS区域之间复制数据,以满足这些合规性要求。
有关设置说明,请参阅How to Set Up Cross-Region Replication。