2012-08-05 176 views
19

我在Amazon S3存储桶中有重要数据。我想将其他内容每周备份到另一个云服务,甚至是S3内部。在数据丢失的情况下,最好的方法是将我的存储桶同步到不同区域内的新存储桶。如何备份或同步Amazon S3存储桶?

我该怎么做?

+0

使用s3cmd http://s3tools.org/s3cmd或由s3 api编写自己的备份工具。 – qrtt1 2012-08-05 14:24:48

+3

真的很有用吗? S3中的数据是多余的。来自http://aws.amazon.com/s3/#protecting:“亚马逊S3的标准存储设计旨在维持两个设施中数据的并发丢失。” – ben 2012-08-05 14:28:09

+1

欲了解更多关于此方法实用性的信息(摘自[S3常见问题](http://aws.amazon.com/s3/faqs/#How_durable_is_Amazon_S3)): Amazon S3旨在提供给定年份99.999999999%的持久性对象。这种耐久性水平对应于物体的平均年度预期损失0.000000001%。例如,如果您使用Amazon S3存储10,000个对象,则平均预计每10,000,000年就会丢失一个对象。另外,Amazon S3旨在维持两个设施中的数据同时丢失。 – Viccari 2012-08-05 22:33:46

回答

13

我更喜欢本地备份使用同步功能仅变化已更新。这不是完美的备份解决方案,但是,因为你需要,你可以在以后实施的定期更新:

s3cmd sync --delete-removed s3://your-bucket-name/ /path/to/myfolder/ 

如果你从来没有使用过s3cmd,安装和使用进行配置:

pip install s3cmd 
s3cmd --configure 

也应该有S3备份服务为每月5美元,但我也会检查Amazon Glacier,如果您使用多部分上传,可以让您放置近40 GB的单个存档文件。

http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html#qfacts

请记住,如果您的S3帐户被盗,您有机会失去所有的数据,你会同步一个空文件夹或文件的格式不正确。因此,您最好编写一个脚本来多次归档备份,例如通过检测一周的开始。

更新2016年1月17日:基于AWS CLI

的Python现在已经非常成熟。

请使用:https://github.com/aws/aws-cli
例子:aws s3 sync s3://mybucket .

+0

这些$ 5 s3备份服务有哪些?我想要一个可以防止人为错误的备份。我们使用s3就像共享服务器一样。 – 2014-12-27 20:37:38

+0

他们似乎不在身边,我建议让另一个云帐户(例如Google云端平台)存储重复数据。 – hurturk 2016-01-17 16:37:10

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() 

我用这个在一耙的任务(一个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 
+0

FYI ...您的S3 ID和密钥似乎在这个答案中暴露。 – 2014-04-30 23:33:10

+2

这些都是假的。 – 2014-05-01 19:33:03

0

我试图做到这一点,在过去,它仍然烦人的困难,尤其是在大型,多GB,许多-数百万的档案桶。我找到的最佳解决方案是S3S3Mirror,这是为此目的而制作的。

这不像转换开关一样简单,但它仍然比我尝试过的大多数其他DIY解决方案都要好。它是多线程的,将比类似的单线程方法更快地复制文件。

一个建议:在一个单独的EC2实例上设置它,一旦你运行它,关闭该机器,但离开AMI在那里。然后,当你需要重新运行时,再次启动机器,你就全都准备好了。这远不如真正的自动化解决方案好,但可以管理每月或每周的备份。

0

最好的办法是在发生数据丢失的情况下,将我的存储桶与不同区域中的新存储桶同步。

24 Mar 2015开始,可以使用S3的Cross-Region Replication功能。

一个上市Use-case Scenarios的是“合规性要求”,这似乎是关键数据,防止数据丢失额外的保护你的使用情况相符:亚马逊S3存储数据能够跨

虽然默认多个地理上距离较远的可用区域,合规性要求可能会要求您将数据存储在更远的距离。跨区域复制允许您在远距离AWS区域之间复制数据以满足这些合规要求。

有关设置说明,请参阅How to Set Up Cross-Region Replication

相关问题