Подтвердить что ты не робот

Как я могу сделать резервную копию или синхронизировать ведро Amazon S3?

У меня есть критические данные в ведро Amazon S3. Я хочу сделать еженедельную резервную копию своего другого содержимого другому облачному сервису или даже внутри S3. Лучший способ - синхронизировать мой ковш с новым ковшом в другом регионе, в случае потери данных.

Как я могу это сделать?

4b9b3361

Ответ 1

Я предпочитаю делать резервные копии локально с помощью синхронизации, когда обновляются только изменения. Это не идеальное решение для резервного копирования, но вы можете выполнять периодические обновления по мере необходимости:

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

Если вы никогда не использовали s3cmd, установите и настройте его, используя:

pip install s3cmd
s3cmd --configure

Также должны быть службы резервного копирования S3 за 5 долларов США в месяц, но я также проверю ледник Amazon Glacier, который позволит вам добавить файл архива почти 40 ГБ, если вы используете многостраничную загрузку.

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

Помните, что если ваша учетная запись S3 скомпрометирована, у вас есть шанс потерять все ваши данные, поскольку вы синхронизируете пустую папку или искаженные файлы. Итак, лучше написать script для архивирования резервной копии несколько раз, например, путем обнаружения начала недели.

Обновление 01/17/2016:

CLI на основе Python на основе Python очень зрелый.

Пожалуйста, используйте: https://github.com/aws/aws-cli
Пример: aws s3 sync s3://mybucket .

Ответ 2

Этот script выполняет резервное копирование ведра 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

Ответ 3

Я пытался сделать это в прошлом, и это все еще досадно сложно, особенно с большими, многомиллиметровыми, многомиллиметровыми ковшиками. Лучшее решение, которое я когда-либо находил, было S3S3Mirror, которое было сделано именно для этой цели.

Это не так просто, как просто переключение переключателя, но оно все же лучше, чем большинство других решений DIY, которые я пробовал. Он многопоточен и скопирует файлы намного быстрее, чем аналогичные однопоточные подходы.

Одно предложение: настройте его на отдельный экземпляр EC2, и как только вы запустите его, просто закройте эту машину, но оставьте AMI там. Затем, когда вам нужно снова запустить, снова запустите машину, и все будет готово. Это не так хорошо, как действительно автоматизированное решение, но доступно для ежемесячных или еженедельных резервных копий.

Ответ 4

Лучшим способом было бы иметь возможность синхронизировать мой ковш с новым ведром в другой области в случае потери данных.

От 24 марта 2015 г., это возможно с помощью Функция межобластной репликации для S3.

Один из перечисленных сценариев сценариев использования - это "требования соответствия" , которые, по-видимому, соответствуют вашему прецеденту дополнительной защиты критических данные против потери данных:

Хотя по умолчанию Amazon S3 хранит ваши данные в нескольких географически отдаленных зонах доступности, требования соответствия могут диктовать сохранение данных на еще более отдаленных расстояниях. Репликация по нескольким регионам позволяет копировать данные между удаленными областями AWS для удовлетворения этих требований соответствия.

См. Как настроить кросс-региональную репликацию для инструкций по установке.