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 часа
- Возможность сравнения контрольных сумм локальных файлов с журналом
- При скачивании архивов, возможность ограничить количество файлов, которое будет скачано за раз (нужно из-за особенности биллинга скачивания архивов)
Цель проекта
Реализовать четыре вещи в одной программе (всё это есть по отдельности, но не вместе)
- Реализация на Perl — Считаю что язык/технология, на которой сделана программа, тоже важна для конечного пользователя/администратора. Так что лучше иметь выбор из реализаций на разных языках
- Обязательно планируется поддержка Amazon S3
- Multipart операции+многопоточные операции —
multipart поможет избежать ситуации, когда вы закачиваете несколько гигабайт на удалённый сервер и вдруг коннект рвётся. Многопоточность ускоряет заргузку, и значительно ускоряет загрузку кучи мелких файлов или удаление большого количества файлов - Собственная реализация протокола — планируется сделать код ре-юзабельным и опубликовать как отдельные модули на CPAN
Как это работает
При синхронизации файлов на сервис, mtglacier создаёт журанал (текстовый файл), в котором записаны все операции upload'а файлов: для каждой операции — имя локального файла, время upload, Tree Hashфайла, полученный archive_id файла.
При восстановлении файлов из Glacier на локальный диск, данные для восстановления берутся из этого журнала (т.к. получить листинг файлов на glacier можно только с задержкой в четыре часа или более).
При удалении файлов из Glacier добавляются записи об удалении в журнал. При повторной синхронизации в Glacier, обрабатываются только те файлы, которых там нет, судя по журналу.
Процедура восстановления файлов двухпроходная:
- Создаётся задание на скачивание файлов, присутствующих в журнале, но отсутствующих на локальном диске
- После выжидания четырёх часов можно запустить повторную команду на скачивание этих файлов
Предостережения
- Перед использованием изучите цены на сайте Amazon
- Изучите FAQ Amazon
- Нет, правда, обязательно изучите цены
- Перед тем, как «играться» с Glacier убедитесь, что вы сможете удалить все архивы в конце. Дело в том что удалить архивы и не пустой vault нельзя через Amazon Console
- При многопоточной работе с glacier нужно выбрать оптимальное количество потоков. Amazon возвращает HTTP 408 Timeout в случае слишком медленной закачки в каждом конкретном потоке (после этого поток mtglacier делает паузу одну секунду и повторит попытку, но не более пяти раз). Так что многопоточная закачка может оказаться медленнее, чем однопоточная
- Пока — это Beta версия. Не рекомендуется использовать в production
Как пользоваться
- Создать Vault в Amazon Console
- Создать glacier.cfg (укажите тот же регион, в котором создан vault)
key=YOURKEY secret=YOURSECRET region=us-east-1
- Синхронизировать локальную директорию в Glacier. Используйте параметр concurrency для указания количества потоков
./mtglacier.pl sync --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log --concurrency=3
- Можно добавить файлы и синхронизировать ещё раз
- Проверить целостность файлов (сверяются только с журналом)
./mtglacier.pl check-local-hash --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log
- Можете удалить некоторые файлы из /data/backup
- Создайте задание на восстановление данных. Используйте параметр 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
- Подождите 4 часа или более
- Восстановите удалённые файлы
./mtglacier.pl restore-completed --config=glacier.cfg --from-dir /data/backup --to-vault=myvault --journal=journal.log
- Если бэкап больше не нужен, удалите все файлы с 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