Стратегії резервного копіювання для сегмента AWS S3


93

Я шукаю пораду чи найкращу практику для створення резервної копії відра S3.
Мета резервного копіювання даних із S3 - запобігти втраті даних через наступне:

  1. Випуск S3
  2. проблема, коли я випадково видаляю ці дані з S3

Після деякого розслідування я бачу такі варіанти:

  1. Використовуйте версію http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
  2. Копіюйте з одного сегмента S3 в інший за допомогою AWS SDK
  3. Резервне копіювання на Amazon Glacier http://aws.amazon.com/en/glacier/
  4. Резервне копіювання на робочий сервер, який сам створюється

Який варіант вибрати і наскільки безпечним буде зберігати дані лише на S3? Хочете почути ваші думки.
Кілька корисних посилань:


Будь ласка , прийміть stackoverflow.com/a/40033265/1586965
samthebest

Відповіді:


63

Спочатку розміщено в моєму блозі: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/

Синхронізуйте свій сегмент S3 із сервером EC2 періодично

Цього можна легко досягти за допомогою декількох утиліт командного рядка, які дозволяють синхронізувати віддалений сегмент S3 з локальною файловою системою.

s3cmd
Спочатку s3cmdвиглядав надзвичайно перспективно. Однак, спробувавши його на моєму величезному відрі S3 - його не вдалося масштабувати, помилившись з Segmentation fault. Однак це добре працювало на невеликих відрах. Оскільки це не спрацювало на величезні відра, я вирішив знайти альтернативу.

s4cmd
Новіша багатопотокова альтернатива s3cmd. Виглядав ще більш перспективним, однак, я помітив, що він продовжує повторно завантажувати файли, які вже були в локальній файловій системі. Це не та поведінка, яку я очікував від команди синхронізації. Він повинен перевірити, чи вже існує віддалений файл локально (перевірка розміру / розміру файлу буде акуратним), і пропустити його під час наступного запуску синхронізації в тому ж цільовому каталозі. Я відкрив випуск ( bloomreach / s4cmd / # 46 ), щоб повідомити про цю дивну поведінку. Тим часом я взявся знайти іншу альтернативу.

awscli
А потім я знайшов awscli. Це офіційний інтерфейс командного рядка Amazon для взаємодії з різними хмарними службами, включаючи S3.

AWSCLI

Він надає корисну команду синхронізації, яка швидко та легко завантажує віддалені файли сегмента у вашу локальну файлову систему .

$ aws s3 sync s3: // your-bucket-name / home / ubuntu / s3 / your-bucket-name /

Переваги:

  • Масштабована - підтримує величезні відра S3
  • Багатопотокові - швидше синхронізує файли, використовуючи кілька потоків
  • Розумно - синхронізує лише нові або оновлені файли
  • Швидкий - завдяки багатопотоковій природі та розумному алгоритму синхронізації

Випадкове видалення

Зручно, syncкоманда не видалить файли в цільовій папці (локальна файлова система), якщо вони відсутні в джерелі (сегмент S3), і навпаки. Це ідеально підходить для резервного копіювання S3 - у разі видалення файлів із сегмента, повторна синхронізація не призведе до їх локального видалення. І у випадку, якщо ви видалите локальний файл, він також не буде видалений із вихідного сегмента.

Налаштування awscli на Ubuntu 14.04 LTS

Почнемо з установки awscli. Є кілька способів зробити це, однак, мені було найпростіше встановити його за допомогою apt-get.

$ sudo apt-get install awscli

Конфігурація

Далі нам потрібно налаштувати за awscliдопомогою нашого ідентифікаційного ключа та секретного ключа доступу, який ви повинні отримати від IAM , створивши користувача та прикріпивши політику AmazonS3ReadOnlyAccess . Це також не дозволить вам або будь-кому, хто отримає доступ до цих облікових даних, видаляти файли S3. Не забудьте ввести свій регіон S3, наприклад us-east-1.

$ aws налаштувати

aws налаштувати

Підготовка

Давайте підготуємо локальний каталог резервних копій S3, бажано в /home/ubuntu/s3/{BUCKET_NAME}. Переконайтеся, що замінили {BUCKET_NAME}на справжнє ім’я сегмента

$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}

Початкова синхронізація

Давайте вперше синхронізуємо сегмент за допомогою такої команди:

$ aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /

Припускаючи, що сегмент існує, облікові дані AWS та регіон правильні, а цільова папка дійсна, awscliпочне завантажувати весь сегмент до локальної файлової системи.

Залежно від розміру сегмента та підключення до Інтернету, це може зайняти десь від кількох секунд до годин. Коли це буде зроблено, ми продовжимо і налаштуємо автоматичне завдання cron, щоб постійно оновлювати локальну копію сегмента.

Налаштування завдання Cron

Вперед і створіть sync.shфайл у /home/ubuntu/s3:

$ nano /home/ubuntu/s3/sync.sh

Скопіюйте та вставте наступний код у sync.sh:

#! / bin / sh

# Повторіть поточну дату та час

ехо '-----------------------------'
дата
ехо '-----------------------------'
ехо ''

# Ініціалізація ехо-сценарію
echo 'Синхронізація віддаленого сегмента S3 ...'

# Фактично запустіть команду синхронізації (замініть {BUCKET_NAME} вашим іменем сегмента S3)
/ usr / bin / aws s3 sync s3: // {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /

# Завершення ехо-сценарію
echo 'Синхронізація завершена'

Не забудьте замінити {BUCKET_NAME} вашим іменем сегмента S3, двічі протягом сценарію.

Порада професіонала: Ви повинні використовувати /usr/bin/awsдля посилання на awsдвійковий файл, оскільки crontabвиконує команди в обмеженому середовищі оболонки і не зможе самостійно знайти виконуваний файл.

Далі перевірте chmodсценарій, щоб його можна було виконати crontab.

$ sudo chmod + x /home/ubuntu/s3/sync.sh

Спробуємо запустити сценарій, щоб переконатися, що він насправді працює:

$ /home/ubuntu/s3/sync.sh

Вихід повинен бути подібним до цього:

вихід sync.sh

Далі відредагуємо поточного користувача, crontabвиконавши наступну команду:

$ crontab -e

Якщо ви виконуєте це вперше crontab -e, вам потрібно вибрати бажаний редактор. Я б рекомендував вибрати, nanoоскільки це найпростіше для початківців працювати.

Частота синхронізації

Потрібно сказати, crontabяк часто запускати наш сценарій та де скрипт знаходиться в локальній файловій системі, написавши команду. Формат цієї команди такий:

mh dom mon dow команда

Наступна команда налаштована на те, crontabщоб запускати sync.shсценарій щогодини (вказаний через параметри minute: 0 і hour: *) і передавати вихідні дані сценарію до sync.logфайлу в нашому s3каталозі:

0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log

Ви повинні додати цей рядок унизу crontabфайлу, який редагуєте. Потім продовжуйте і зберігайте файл на диску, натискаючи Ctrl + W, а потім Enter . Після цього ви можете вийти nano, натиснувши Ctrl + X . crontabтепер запускатиме завдання синхронізації щогодини.

Порада професіонала: Ви можете перевірити, чи щогодинне завдання cron успішно виконується /home/ubuntu/s3/sync.log, перевіривши, перевіривши його вміст на дату та час виконання та перевіривши журнали, щоб побачити, які нові файли були синхронізовані.

Все готово! Тепер ваш сегмент S3 буде автоматично синхронізований з вашим сервером EC2 щогодини, і ви повинні бути готові до роботи. Зверніть увагу, що з часом, коли ваш сегмент S3 збільшується, можливо, вам доведеться збільшувати розмір EBS вашого сервера EC2 для розміщення нових файлів. Ви завжди можете збільшити розмір гучності EBS, дотримуючись цього посібника .


Я залишив запитання у вашому щоденнику, але дізнався, чи існує спосіб синхронізації метаданих?
Devology Ltd,

@Devology Ltd, на жаль, я не мав можливості працювати з метаданими об’єкта S3. Після швидкого пошуку в Google не схоже, що awscliпідтримка автоматично синхронізує це в aws s3 syncкоманді. Схоже, вам, можливо, доведеться реалізувати це вручну.
Елад Нава,

Дякую @Ekad Nava - я вдячний вам за підтвердження того, що, на мою думку, було так.
Devology Ltd,

1
Це фантастика @EladNava, дякую за обмін, все ще актуальне в 2020 році!
user1130176

ця відповідь не підходить, коли у вас є мільйони файлів. Це стає дуже дорогим, повільним, а часом і неможливим - через обмеження файлової системи.
Психозой

30

Беручи до уваги відповідне посилання, яке пояснює, що S3 має 99,999999999% міцності, я відкину вашу проблему №1. Серйозно.

Тепер, якщо №2 є дійсним варіантом використання і викликає у вас справжнє занепокоєння, я б точно дотримувався варіантів №1 або №3. Який із них? Це насправді залежить від деяких питань:

  • Вам потрібна будь-яка інша функція управління версіями, чи це лише для уникнення випадкових перезаписів / видалень?
  • Чи доступні додаткові витрати на встановлення версій?
  • Amazon Glacier is optimized for data that is infrequently accessed and for which retrieval times of several hours are suitable. Це нормально для вас?

Якщо ваше використання пам’яті не є справді величезним, я б дотримувався версії відра. Таким чином, вам не знадобиться додатковий код / ​​робочий процес для резервного копіювання даних у льодовик, інші сегменти або навіть будь-який інший сервер (що насправді є поганим вибором IMHO, будь ласка, забудьте про це).


4
@SergeyAlekseev Якщо Glacier - це щось, що буде працювати для вас, дуже швидко встановіть правило життєвого циклу на відрі, яке автоматично архівує ваші файли на льодовик. Вони все одно відображатимуться у відрі (у веб-інтерфейсі), але клас сховища зміниться із стандартного на льодовиковий. Я переміщую оброблені файли з мого основного сегмента в "готовий" сегмент, і на готовому сегменті є правило життєвого циклу, яке архівує все, що перевищує 1 день. Це файли даних, які я, мабуть, більше ніколи не торкнусь, але їх потрібно зберігати для клієнта.
Ден,

28
Я не думаю, що 99,999999999% є достатньою вагомою причиною, щоб бути повноцінним стеком aws для зберігання / резервного копіювання. Я не кажу про те, що залишилось 0,0000000001%, але більше, якщо трапляється щось надзвичайно несподіване, незручно відчувати, що весь ваш бізнес десь лежить. Несподівано, це можуть бути США, які йдуть на війну до певної країни, Amazon повністю зломлюється (пор. Sony) тощо, тощо
Августин Рідінгер,

11
Я підтримаю @AugustinRiedinger з цього приводу: "Випуск S3" може бути, за визначенням, чимось, чого ви не знаєте (наприклад, урядові питання), що може призвести до втрати гіпотез, на яких базуються цифри SLA S3, такі як 99,99 ... Роблячи щось довгострокове, включаючи резервне копіювання даних, диверсифікація є гарною практикою, якщо не є, то це обов’язкова умова
lajarre

2
Я однозначно погоджуюсь з тим, що ваші бали є дійсними. Але виходячи з варіантів, наданих ОП (майже всі з них, включаючи альтернативи проблеми AWS), я не думаю, що "проблема S3" буде настільки широкою, наскільки ви, хлопці, розширюєтесь. Хоча приємно бачити деякі ширші думки.
Viccari

4
Стара відповідь, але я відчуваю, ніби мені потрібно згадати останні (-іш) події. "В той день, коли Amazon зламав мережу", технологічний персонал випадково видалив величезну частину своїх серверів S3. Навіть протягом цих 24 годин проблема полягала в доступності. Не втрата даних. Втрати даних не відбулося абсолютно, навіть з огляду на велику кількість видалених серверів, і їм все одно вдалося досягти успіху в рамках свого SLA
Оберст

14

Ви можете зробити резервну копію даних S3, використовуючи такі методи

  1. Заплануйте процес резервного копіювання за допомогою конвеєра даних AWS, це можна зробити двома способами, зазначеними нижче:

    a. Використання copyАктивність конвеєра даних, за допомогою якого ви можете копіювати з одного сегмента s3 в інший сегмент s3.

    b. За допомогою команд ShellActivity datapipeline та команд "S3distcp" виконувати рекурсивну копію рекурсивних папок s3 з відра в іншу (паралельно).

  2. Використовуйте версії всередині сегмента S3, щоб підтримувати різні версії даних

  3. Використовуйте льодовик для резервного копіювання даних (використовуйте його, коли вам не потрібно швидко відновлювати резервну копію до вихідних сегментів (для повернення даних із льодовика потрібен деякий час, оскільки дані зберігаються у стислому форматі) або коли ви хочете зберегти деякі витрати, уникаючи використання іншого сегмента s3 для резервного копіювання), цей параметр можна легко встановити, використовуючи правило життєвого циклу на сегменті s3, для якого ви хочете зробити резервну копію.

Варіант 1 може надати вам більше безпеки, скажімо, якщо ви випадково видалите оригінальний сегмент s3, а ще одна перевага полягає в тому, що ви можете зберігати резервну копію в папках із датою в іншому сегменті s3, таким чином ви знаєте, які дані були у вас на певну дату, і можете відновити резервне копіювання дати. Все залежить від вашого випадку використання.


@David: Як запропонував Девід у своєму рішенні нижче, може існувати скрипт, який створює резервні копії сегмента s3 щодня або щотижня, Це можна легко досягти моїм першим пунктом (AWS datapipeline - що дає можливість планувати процес резервного копіювання - щодня , щотижня тощо). Я б порекомендував переглянути пошук на aws datapipeline.
Варун

Це демонструє певні обіцянки, оскільки воно не покладається на застарілі підходи, які не є найкращими в тому, щоб максимально використовувати хмару (читайте: crons). Data Pipeline також має автоматизовані спроби і є керованою (безсерверною) службою.
Феліпе Альварес

13

Як щодо використання легкодоступної функції міжрегіональної реплікації на самих сегментах S3? Ось кілька корисних статей про цю функцію


Що робити, якщо видалити файл в одному регіоні не слід реплікація в іншому?
Мікелем

S3 не копіює видалення, перегляньте це посилання docs.aws.amazon.com/AmazonS3/latest/dev/… .
vr devrimbaris

9

Можна подумати, що на сьогоднішній день буде простіший спосіб просто утримувати якісь додаткові резервні копії в різній області.

Усі наведені вище пропозиції насправді не є простими чи елегантними рішеннями. Я насправді не розглядаю льодовик як варіант, оскільки думаю, що це більше архівне рішення, ніж рішення резервного копіювання. Коли я думаю про резервне копіювання, я думаю, що аварійне відновлення від молодшого розробника рекурсивно видаляє сегмент або, можливо, експлойт або помилку у вашому додатку, яка видаляє речі з s3.

Для мене найкращим рішенням буде сценарій, який просто створює резервну копію одного сегмента в інший регіон, один щодня і один раз на тиждень, так що якщо трапиться щось жахливе, ви можете просто переключити регіони. У мене немає такої установки, я розглядав, що просто не здобув це робити, тому що для цього знадобиться трохи зусиль, тому я хотів би використовувати якесь акційне рішення.


Домовились. Цікаво, коли копаєшся у S3 (навіть CRR - вбудована реплікація), є великі діри для аварійного відновлення. Наприклад, ви не можете ніколи відновити сегмент, історії версій файлів, метадані (зокрема, дати останньої зміни) тощо. Усі наявні на даний момент сценарії відновлення є частковими.
Пол Джоветт,

7

Хоча це питання було опубліковано деякий час тому, я вважав важливим згадати захист видалення MFA разом з іншими рішеннями. OP намагається вирішити випадкове видалення даних. Багатофакторна автентифікація (MFA) проявляється тут у двох різних сценаріях -

  1. Постійне видалення об’єктних версій - Увімкніть видалення MFA у версіях сегмента.

  2. Випадкове видалення самого сегмента - Налаштуйте політику сегмента, що забороняє видалення без автентифікації MFA.

У поєднанні з міжрегіональною реплікацією та версіями для зменшення ризику втрати даних та покращення сценаріїв відновлення.

Ось допис у блозі на цю тему з більш детальною інформацією.


0

Якщо, Ми маємо занадто багато даних. Якщо у вас вже є сегмент, тоді перший раз синхронізація займе занадто багато часу. У моєму випадку у мене було 400 Гб. Перший раз це зайняло 3 години. Тому я думаю, що ми можемо зробити репліку хорошим рішенням для резервного копіювання S3 Bucket.


Я збираюся перенести близько 7 ТБ у відро і намагаюся з’ясувати найкращий варіант ... Я думаю, мені потрібно щось краще, ніж синхронізація. Цікаво, чи використання конвеєра для копіювання даних у версію льодовика GCS може забезпечити найкращу загальну безпеку?
Брендон Ватлі

Тут можна вибрати AWS DataSync.
Феліпе Альварес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.