2012-08-05 80 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

相關問題