Резервное копирование в «Облачное хранилище»

Написал 1 февраля, 2013 в 14:25

Резервное копирование в облачное хранилище

Никакой серьезный проект не может обходиться без выполнения регулярного резервного копирования. Помимо выбора и настройки системы архивирования данных нужно определиться где данные хранить. Причем, желательно не на том же сервере где бэкап делается, а иметь возможность хранить данные в каком-нибудь независимом надежном месте.

Специально для этого отлично подходит наше «облачное хранилище». Хранение 1 Гб данных будет стоить всего 3 рубля в месяц.

С чего начать?

Чтобы начать пользоваться «облачным хранилищем» нужно зарегистрироваться (полная регистрация занимает около 5 минут). Для всех новых учетных записей доступны 10 бонусных рублей, с помощью которых можно полноценно протестировать услугу. Если вы уже являетесь нашим клиентом и хотите протестировать услугу — по запросу через тикет систему вам будет начислено 10 бонусных рублей. Теперь все готово к работе.

В панели управления, в разделе «Облачное хранилище» → «Файлы» находится веб-интерфейс файлового менеджера. Создайте в нем приватный контейнер для хранения бэкапов (доступ к приватному контейнеру возможен только после авторизации — более безопасно при хранении важных данных), например «backups». Для загрузки файлов в хранилище лучше создать дополнительного пользователя, который будет иметь минимальный набор прав — это позволит обезопасить основного пользователя, у которого всегда полные права доступа.

Создание дополнительного пользователя находится во вкладке «Облачное хранилище» → «Настройка доступа». Введите любое имя для пользователя и нажмите «Создать» — появится диалог настройки пользователя.

Диалог настройки пользователя

В настройках пользователя нужно сгенерировать новый пароль. Опция хранения пароля является не обязательной, но тогда, в дальнейшем, пароль будет невозможно подсмотреть в настройках пользователя, а только сгенерировать новый. И обязательно надо отметить галочкой контейнеры, к которым пользователь будет иметь доступ. Не забудьте сохранить настройки нажатием «Сохранить изменения доступа».

Теперь все готово для настройки процесса резервного копирования на сервере.

Простой вариант

Если у вас есть сайт средних размеров с базой данных MySQL, которую вы хотите регулярно бекапить, то достаточно скачать два специально подготовленных скрипта и указать необходимые настройки.

Первое что понадобится, это утилита «supload» —позволяет удобно загружать файлы в хранилище. Устанавливается она следующим образом (предположительно на вашем сервере установлена ОС Debian):

$ wget https://raw.github.com/selectel/supload/master/supload.sh
$ mv supload.sh /usr/local/bin/supload
$ chmod +x /usr/local/bin/supload

Дальше нужно скачать и настроить скрипт для выполнения бекапа:

$ wget https://raw.github.com/selectel/storage/master/utils/sbackup.sh
$ chmod +x sbackup.sh

Откройте скрипт «sbackup.sh» с помощью «вашего любимого текстового редактора» и поменяйте следующие значения:

  • SS_USER — пользователь для авторизации в хранилище (тот дополнительный пользователь который был создан нами ранее);
  • SS_PWD — пароль для пользователя;
  • SS_CONTAINER — имя контейнера в который будут загружаться бэкапы;
  • TARGET_DIR — путь где расположены файлы сайта;
  • BACKUP_DIR — путь на сервере куда временно будут складываться бэкапы;
  • EXCLUDE_LIST — список файлов которые не нужно включать в архив;
  • DB_NAME — имя базы данных MySQL, чтобы бэкапить все имеющиеся базы укажите к качестве значения __ALL__;
  • DB_USER и DB_PWD — пользователь и пароль для подключения к MySQL;
  • EMAIL — email куда будет присылаться отчет о выполнении бекапа (можно указать пустым, чтобы отключить отчет);
  • EMAIL_ONLY_ON_ERROR — если указать yes, то отчет будет отправлен только в случае возникновения проблем/ошибок;
  • DELETE_BACKUPS_AFTER_UPLOAD — если указать yes, то созданные файлы бэкапов будут удалены из временной папки после успешной загрузки в хранилище;
  • STORAGE_EXPIRE — опция позволяет указать сколько дней файл бэкапа должен храниться в хранилище, после чего будет автоматически удален.

Для проверки и выполнения бэкапа скрипт можно запустить вручную:

$ ./sbackup.sh

Результат выполнения будет выведен в консоль.

Результат выполнения будет выведен в консоль

Теперь нужно настроить периодичность выполнения бэкапа, сделать это можно с помощью cron. Для этого просто перемещаем скрипт в специальную директорию:

$ mv sbackup.sh /etc/cron.daily/50_sbackup

После этого cron будет автоматически запускать скрипт архивирования раз в сутки.

Как восстановить данные?

Если так случилось, что нужно получить данные из резервной копии, то сделать это можно следующем способом.

Скорее всего вы загружали файлы бэкапов в приватный контейнер, оттуда сам файл можно легко скачать используя веб-интерфейс файлового менеджера. Но как правило, удобнее скачать файл сразу на сервер или предоставить доступ к нему другому человеку. Это можно сделать при помощи специальных ссылок — это позволит безопасно скачать файл на сервере или передать его кому-то другому не меняя тип контейнера на публичный.

Для этого в веб-интерфейсе файлового менеджера находим нужный файл, справа от него нажимаем на значок операций (выглядит как шестеренка) и выбираем пункт «Открыть доступ»:

Пункт «Открыть доступ»

Для ссылки можно ограничить время действия, количество скачиваний файла и, при желании, еще и задать пароль:

Функционал ссылок

После создания ссылки вы получите ссылку перейдя по которой можно будет скачать файл. Сама ссылка будет храниться в контейнере «links», там же можно еще раз подсмотреть ссылку для скачивания.

После загрузки файла с бэкапом на сервер нужно выполнить распаковку данных:

$ mkdir backup_files
  # распаковка файлов из архива в папку backup_files
$ tar xvf backupname_2013-01-26_08h40m.tar.bz2 -C backup_files/
  # восстановление БД (эта операция может перезатереть текущее состояние базы данных)
$ bzcat mysql_backupname_ALL_2013-01-26_08h40m.bz2 | mysql

Более сложные сценарии резервного копирования

Скрипт «sbackup» обладает достаточно ограниченным функционалом и в ряде случаев его может оказаться недостаточно. Но, его всегда можно модифицировать под свои нужды.

Зачастую на серверах уже используется какая-то система автоматизированных бэкапов, некоторые CMS или системы управления позволяют создавать и настраивать архивирование данных. Можно использовать такие «готовые» системы и «научить» их загружать архивные данные в облачное хранилище. Если в системе предусмотрено выполнение внешних скриптов после завершения архивирования, то это можно использовать чтобы выполнять загрузку данных с помощью утилиты «supload».

Использование «supload»

Supload (GitHub) — утилита, специально созданная, чтобы упростить загрузку файлов в хранилище Селектел. Она написана на bash и использует «стандартные» утилиты, которые установлены практически в любой базовой Linux системе, поэтому будет достаточно скачать скрипт и он сразу будет работать.

Возможности утилиты:

  • загрузка локального файла в хранилище;
  • рекурсивная загрузка всех файлов в указанной папке и подпапках;
  • гарантия загрузки файлов с помощью сверки контрольных сумм;
  • загрузка только изменившихся и новых файлов;
  • настройка авто-удаления файлов в хранилище.

Еще раз про установку:

$ wget https://raw.github.com/selectel/supload/master/supload.sh
$ mv supload.sh /usr/local/bin/supload
$ chmod +x /usr/local/bin/supload

Загрузка одного локального файла «my.doc» в контейнер «files» хранилища (контейнер должен быть создан заранее):

$ supload -u USERNAME -k USERKEY files my.doc

Так же можно загружать и в нужную папку внутри контейнера:

$ supload -u USERNAME -k USERKEY files/docs/ my.doc

При этом перед загрузкой файла вычисляется его контрольная сумма (MD5) и загрузка считается успешной только при совпадении контрольных сумм.

Для загрузки всех файлов из определенной папки нужно использовать опцию -r:

$ supload -u USRNAME -k USERKEY -r files local/docs/

Для каждого загружаемого файла так же будет выполнен контроль по контрольной сумме.

Сверка контрольных сумм дает еще одну дополнительную возможность — если запустить утилиту повторно, то есть данные уже есть в хранилище и контрольные суммы совпадают, загрузка файла пропускается. Это позволяется загружать только новые или изменившиеся файлы.

Хранилище поддерживает автоматическое удаление файлов, «supload» позволяет указать сколько времени нужно хранить файл:

$ supload -u USERNAME -k USERKEY -d 7d files my.doc

Опция -d указывает после какого времени в минутах (m), часах (h) или днях (d) хранилище автоматически выполнит удаление файла. Эта опция действует так же при рекурсивной загрузке файлов. Если файл уже был загружен, то повторный запуск команды не меняет ранее установленный (или вообще не заданный) срок хранения файла.

Это свойство можно интересно использовать — допустим ваша система архивирования складывает файлы с бэкапом в папку /var/backups/site/ и контролирует удаление файлов через определенный период времени. Можно настроить периодический запуск «supload» для загрузки всех файлов с ограничением времени хранения, например:

$ supload -u USERNAME -k USERKEY -d 31d -r backups /var/backups/sites

Тогда каждый новый загруженный файл бэкапа будет храниться в хранилище 31 день, а у ранее загруженных — постепенно будет уменьшатся срок их хранения и они будут автоматически удалены так же через 31 дней с момента их загрузки. Чтобы такая схема правильно работала нужно, чтобы у вашей системы архивирования срок удаления файлов был меньше чем указанный в «supload», иначе старые файлы могут загрузиться заново.

Утилита «supload» хорошо подходит как для ручной загрузки файлов, так и для использования в скриптах систем архивирования. Единственное ограничение — максимальный размер одного загружаемого файла 5 Гб.

Загрузка больших файлов

Для загрузки файлов размером больше 5 Гб в хранилище нужно использовать специальный метод загрузки — загрузка по сегментам. В таком случае файл разбивается на виртуальные части и загружается по отдельности. Скачивание такого файла обратно происходит «прозрачно» как одного целого файла, «склеивание» сегментов происходит незаметно на стороне хранилища.

Python-swiftclient — одна из утилит которая позволяет загружать файлы по сегментам. Выполнить загрузку можно так:

$ swift upload container -S 1073741824 large_file

При этом файл будет «на лету» разбит на сегменты по 1 Гб и загружен в хранилище. Опция -S указывает размер одного сегмента в байтах, максимальный размер сегмента 5 Гб (5368709120 байт).

Константин Капустин, Ведущий разработчик направления Облачное хранилище

Занимаюсь развитием и администрированием услуги Облачное хранилище.