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

image

Amazon Glacier


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

О чём пост


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

Функционал


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


Цель проекта


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

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


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



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

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

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

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


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




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


  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



Реализация



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


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