2012-08-05 23 views
19

Amazon S3 kabında önemli verilerim var. Diğer içeriklerinin haftalık bir yedeğini başka bir bulut servisine veya hatta S3'ün içine yapmak istiyorum. Veri kaybı durumunda, en iyi yol, farklı bir bölgedeki yeni bir kovaya kepçemi senkronize etmekti.Amazon S3 paketini nasıl yedekleyebilir veya senkronize edebilirim?

Bunu nasıl yapabilirim?

+0

s3cmd http://s3tools.org/s3cmd kullanın veya s3 api ile kendi yedekleme aracınızı yazın. – qrtt1

+3

gerçekten yararlı mı? S3'teki veriler gereksizdir. Http://aws.amazon.com/s3/#protecting adresinden: 'Amazon S3'ün standart depolama alanı, iki tesiste eşzamanlı veri kaybını sürdürmek için tasarlanmıştır. ' – ben

+1

Bu yaklaşımın yararlılığı hakkında bir fikir daha eklemek için [S3 SSS] (http://aws.amazon.com/s3/faqs/#How_durable_is_Amazon_S3)): Amazon S3, belirli bir yıl içinde nesnelerin% 99.999999999'luk dayanıklılığını sağlamak için tasarlanmıştır. Bu dayanıklılık seviyesi, nesnelerin ortalama yıllık tahmini% 0.000000001 kaybına karşılık gelir. Örneğin, Amazon S3 ile 10,000 nesne saklarsanız, ortalama olarak her 10.000.000 yılda bir tek bir nesnenin kaybolmasını bekleyebilirsiniz. Buna ek olarak, Amazon S3 iki tesiste eşzamanlı veri kaybını sürdürmek için tasarlanmıştır. – Viccari

cevap

13

Ben yerel senkronizasyonu nerede kullanarak yedekleme tercih yalnızca değişiklikler güncellendi. Bu mükemmel bir yedekleme çözümü değil ama istediğiniz kadar daha sonra periyodik güncellemeleri uygulayabilirsiniz:

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

Eğer s3cmd hiç kullanılmamış ise yükleyip kullanarak yapılandırın:

pip install s3cmd 
s3cmd --configure 

Ayrıca S3 yedekleme olmalıdır 5 $/ay için hizmetler ancak çok parçalı yükleme kullanıyorsanız, yaklaşık 40 GB'lık tek arşiv dosyasını koymanıza izin veren Amazon Glacier'i de kontrol ediyorum. S3 hesap başkalarının eline geçerse

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

hatırla, sen boş bir klasör veya hatalı dosyaları senkronize gibi tüm verilerinizi kaybetmek şans var. Böylece, haftanızın başlangıcını tespit ederek, yedeklemenizi birkaç kez arşivlemek için bir komut dosyası yazmanız daha iyi olur.

Güncelleme 2016/01/17: AWS CLI tabanlı

Python şimdi çok olgun.

kullanın: https://github.com/aws/aws-cli
Örnek: Geçmişte bunu denedim ve özellikle büyük, çok GB, birçok-milyonlarca-of-the dosyaları kova ile hala rahatsız edici zor aws s3 sync s3://mybucket .

+0

Bu 5 $ s3 yedekleme servislerinden bazıları nelerdir? İnsan hatalarına karşı koruma sağlayan bir yedekleme istiyorum. Paylaşılan bir sunucu gibi s3 kullanıyoruz. –

+0

Artık etrafta görünmüyorlarsa, Google Cloud Platform gibi kopyaları saklamak için başka bir bulut hesabına sahip olmanızı öneriyorum. – hurturk

3

Bu komut dosyası, bir S3 kova yedekler:

#!/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() 

I (Rails uygulama için) bir tırmık görev bu kullanın:

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 ürününe sahip olmanızı sağlar Bu cevapta Kimlik ve Anahtar görünmektedir. –

+2

Bunlar sahte. –

0

. Şimdiye kadar bulduğum en iyi çözüm tam olarak bu amaçla yapılmış olan S3S3Mirror idi.

Sadece bir anahtarı çevirmek kadar önemsiz değil, ama hala denediğim diğer birçok DIY çözümden daha iyi. Çok iş parçacıklıdır ve dosyaları benzer tek iş parçacıklı yaklaşımlardan çok daha hızlı kopyalayacaktır.

Bir öneri: Ayrı bir EC2 örneğinde ayarlayın ve çalıştırdıktan sonra, makineyi kapatın, ancak AMI'yi orada bırakın. Ardından, yeniden çalıştırmanız gerektiğinde, makineyi tekrar ateşleyin ve hepiniz ayartınız. Bu, gerçekten otomatik bir çözüm kadar güzel değil, ancak aylık veya haftalık yedeklemeler için yönetilebilir.

0

Veri kaybı olması durumunda, kovalamamın farklı bir bölgede yeni bir kova ile eşitleme becerisine sahip olması en iyi yol olacaktır. 24 Mar 2015 itibariyle

, bu S3 Cross-Region Replication özelliğini kullanarak mümkündür.Amazon S3 depolayan veri genelinde varsayılan olarak, ne kadar

: Listelenen Use-case Scenarios ait

Bir veri kaybına karşı kritik verilerin ilave koruma sizin kullanım senaryosunu maç gibi görünüyor "uyum gereksinimleri" dir Birden fazla coğrafi olarak uzak Erişilebilirlik Bölgeleri, uyumluluk gereksinimleri, verileri daha uzak mesafelerde saklamanızı gerektirebilir. Çapraz bölge çoğaltma, bu uyumluluk gereksinimlerini karşılamak için uzak AWS bölgeleri arasında veri çoğaltmanıza olanak tanır.

kurulum talimatları için How to Set Up Cross-Region Replication bakınız.