Amazon Glacier: клиент на Perl с многопоточной/multipart закачкой

в 17:48, , рубрики: Amazon Glacier, Amazon Web Services, AWS, perl, бэкапы, Восстановление данных, метки: , , ,

image

Amazon Glacier

Вкратце — Amazon Glacier — это сервис с очень привлекательной ценой сторейджа, созданный для хранения архивов/бэкапов. Но процесс восстановления архивов довольно сложный и/или дорогой. Впрочем, сервис вполне пригоден для secondary backup.
Подробнее про Glacier уже писали на хабре.

О чём пост

Хочу поделиться Open Source клиентом на Perl для синхронизации локальной директории с сервисом Glacier, также расказать о некоторых ньюансах работы с glacier и описать workflow его работы.

Функционал

Итак, mtglacier. Ссылка на GitHub
Особенности программы:

  • Протокол работы с AWS реализуется самостоятельно, не используются сторонние библиотеки. Самостоятельная реализация Amazon Signature Version 4 Signing Process и расчёта Tree Hash
  • Реализован Multipart Upload
  • Многопоточный upload/download/delete архивов
  • Совмещение Многопоточнгого и Multipart аплоада. Т.е. три потока могут закачивать части файла A, ещё два — части файла B, ещё один инициировать upload файла C и т.д.
  • Локальный файл журнала (открываемый на запись только в режиме append). Ведь, чтобы получить листинг файлов с Glacier необходимо выждать 4 часа
  • Возможность сравнения контрольных сумм локальных файлов с журналом
  • При скачивании архивов, возможность ограничить количество файлов, которое будет скачано за раз (нужно из-за особенности биллинга скачивания архивов)

Цель проекта

Реализовать четыре вещи в одной программе (всё это есть по отдельности, но не вместе)

  1. Реализация на Perl — Считаю что язык/технология, на которой сделана программа, тоже важна для конечного пользователя/администратора. Так что лучше иметь выбор из реализаций на разных языках
  2. Обязательно планируется поддержка Amazon S3
  3. Multipart операции+многопоточные операции —
    multipart поможет избежать ситуации, когда вы закачиваете несколько гигабайт на удалённый сервер и вдруг коннект рвётся. Многопоточность ускоряет заргузку, и значительно ускоряет загрузку кучи мелких файлов или удаление большого количества файлов
  4. Собственная реализация протокола — планируется сделать код ре-юзабельным и опубликовать как отдельные модули на CPAN

Как это работает

При синхронизации файлов на сервис, mtglacier создаёт журанал (текстовый файл), в котором записаны все операции upload'а файлов: для каждой операции — имя локального файла, время upload, Tree Hashфайла, полученный archive_id файла.

При восстановлении файлов из Glacier на локальный диск, данные для восстановления берутся из этого журнала (т.к. получить листинг файлов на glacier можно только с задержкой в четыре часа или более).

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

Процедура восстановления файлов двухпроходная:

  1. Создаётся задание на скачивание файлов, присутствующих в журнале, но отсутствующих на локальном диске
  2. После выжидания четырёх часов можно запустить повторную команду на скачивание этих файлов

Предостережения

  • Перед использованием изучите цены на сайте Amazon
  • Изучите FAQ Amazon
  • Нет, правда, обязательно изучите цены
  • Перед тем, как «играться» с Glacier убедитесь, что вы сможете удалить все архивы в конце. Дело в том что удалить архивы и не пустой vault нельзя через Amazon Console
  • При многопоточной работе с glacier нужно выбрать оптимальное количество потоков. Amazon возвращает HTTP 408 Timeout в случае слишком медленной закачки в каждом конкретном потоке (после этого поток mtglacier делает паузу одну секунду и повторит попытку, но не более пяти раз). Так что многопоточная закачка может оказаться медленнее, чем однопоточная
  • Пока — это Beta версия. Не рекомендуется использовать в production

Как пользоваться

  1. Создать Vault в Amazon Console
  2. Создать glacier.cfg (укажите тот же регион, в котором создан vault)
    key=YOURKEY
    secret=YOURSECRET
    region=us-east-1
    

  3. Синхронизировать локальную директорию в Glacier. Используйте параметр concurrency для указания количества потоков

    ./mtglacier.pl sync --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log --concurrency=3
  4. Можно добавить файлы и синхронизировать ещё раз
  5. Проверить целостность файлов (сверяются только с журналом)

    ./mtglacier.pl check-local-hash --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log

  6. Можете удалить некоторые файлы из /data/backup
  7. Создайте задание на восстановление данных. Используйте параметр max-number-of-files для указания количества арховов, которое хотите восстановить. В данный момент не рекомендуется указывать значение больше нескольких десятков (пока не реализована загрузка более одной страницы со списком текущих Jobs)

    ./mtglacier.pl restore --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log --max-number-of-files=10
  8. Подождите 4 часа или более
  9. Восстановите удалённые файлы

    ./mtglacier.pl restore-completed --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log
  10. Если бэкап больше не нужен, удалите все файлы с Glacier

    ./mtglacier.pl purge-vault --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log

Реализация

  • Операции с HTTP/HTTPS реализованы через LWP::UserAgent
  • Взаимодействие с API амазон написано с нуля, единственный используемый модуль Digest::SHA (Core module)
  • Самостоятельная реализация Amazon Tree Hash (это их собственный алгоритм расчёта контрольной суммы, не нашёл похожих среди TTH-алгоритмов, поправьте, если не прав)
  • Многопоточность реализована с помощью fork-процессов
  • Обработка аварийного завершения процессов с помощью сигналов
  • Взаимодействие между процессами — через unnamed pipes
  • Очередь заданий — свои ООП объекты, подобие FSM

Чего пока не хватает

Главное для первой беты было — стабильно работающая (это ведь не альфа) версия, готовая к концу недели, так что много чего пока не хватает.
Обязательно будет:

  • Регулируемый chunk size
  • не-multipart аплоад
  • топик для SNS нотификаций в конфиге
  • интеграция с внешним миром для получения сигнала через SNS нотификации
  • Внутренний рефракторинг
  • Будут опубликованы unit тесты, когда приведу их в порядок
  • Будет ещё один testsuite, возможно серверный эмулятор glacier
  • Конечно же будет production-ready версия (не Beta)

Автор: vsespb

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js