Резервное копирование Parallels Plesk на Amazon S3

В MUSTdigital существует необходимость хостить сайты некоторых клиентов у себя. В качестве контрольной панели управления хостингом мы используем Plesk и до недавнего времени мы довольствовались встроенной системой резервного копирования на собственный же сервер, однако со временем стало понятно, что это как-то глуповато. Опыт показывает, что необходимо хранить бэкапы глубиной как минимум 2 недели, а забивать для этих целей половину дискового пространства сервера совсем не хочется — да и смысла нет, если сервер умрет, то бэкапы пойдут на дно вместе с ним. Решение очевидно — Amazon S3. Насколько я могу судить, это самое дешевое, стабильное и надежное хранилище данных на настоящий момент.

Мои исходные данные

ОС: CentOS 6.3
Версия Panel: 11.5.30
Руки: кривые
Знания системного администрирования: примерно на нуле

Подготовка

Про регистрацию в Amazon Web Servises, получение доступа к S3, установку и настройку s3cmd уже написано немало, и повторяться я не хочу. На хабрахабре опубликована хорошая статья: habrahabr.ru/post/90244/, и я отправляю вас к ней, а точнее к пунктам с первого по шестой.

Бэкап Plesk

Собственно бэкап будет состоять из двух этапов. Первый — это создание бэкапа встроенной системой резервного копирования. Второй — подготовка архива и загрузка созданного бэкапа с помощью s3cmd в пространство Amazon S3. С помощью менеджера резервного копирования я настроил Plesk на ежедневное создание бэкапов и установил максимальное число копий в одну. Больше не понадобится.
Затем я создал срипт s3cmd.sh следующего содержания:

#!/bin/sh
echo "Daily backup started at `date`" > /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
echo "Creating archives..." >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
mkdir /usr/backup/backup_`date "+%Y-%m-%d"`/
/usr/local/psa/admin/bin/plesk_agent_manager export-dump-as-file -v --split=512M --dump-file-name /var/lib/psa/dumps/backup_info_*.xml --output-file=/usr/backup/backup_`date "+%Y-%m-%d"`/backup_`date "+%Y-%m-%d"`.tar >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
echo "Creating archives finished at `date`" >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
echo "Uploading files to S3..." >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
/usr/bin/s3cmd --config=/root/.s3cfg put /usr/backup/backup_`date "+%Y-%m-%d"`/backup* s3://mustpmbackup/backup_`date "+%Y-%m-%d"`/ >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
/usr/bin/s3cmd --config=/root/.s3cfg put /var/lib/psa/dumps/mysql.daily.dump.0.gz s3://mustpmbackup/backup_`date "+%Y-%m-%d"`/ >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
echo "Uploading files finished at `date`" >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
echo "Deleting old files..." >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log
find /usr/backup/backup_* -mtime +31 -exec rm {} \;
find /usr/backup/log/s3backup_* -mtime +31 -exec rm {} \;
echo "Backup finished at `date`" >> /usr/backup/log/s3backup_`date "+%Y-%m-%d"`.log

Этот скрипт сначала создает архив из файла backup_info_*.xml и помещает его в папку /usr/backup/. Название файла каждый день разное, поэтому нужно использовать паттерн. Префикс по умолчанию — backup_, но в настройках резервного копирования вы можете написать любой другой. Кроме того, настройка -s разбивает архив на части (по умолчанию — размером до 2 гигабайт, в моем вариант я разбиваю на 512 мб). Это необходимо в связи с тем, что размер файла в S3 не может превышать 5 Гб.
Не уверен, что требуется запускать команду sleep, честно говоря, но так как в администрировании linux я полный ноль, как уже говорилось выше, решил на всякий случай дать серверу время =) После этого скрипт загружает готовый архив в отдельную папку в бакете — каждый раз в новую. Вслед за архивом летит и отдельный бекап MySQL. Скрипт я кинул в папку root. Обратите внимание, что если вы создаете файл скрипта в MacOS или Windows, нужно следить за тем, чтобы на концах строк не было лишних символов. К примеру, файл можно сохранять в кодировке UTF-8 без BOM.
Последняя команда находит файлы бекапов старше 31 дня и удаляет их.

Теперь остается только добавить его в cron (10 4 * * * sh /root/s3cmd.sh) и радоваться жизни. Установить время хранения бэкапов можно непосредственно в Amazon S3 — в настройках Lifecycle.

Немножко о том, зачем написана эта статеечка. Выглядит всё просто и быстро, но лично я потратил на изучение, настройку и наладку всего этого вопроса часов 8, что, на мой взгляд, просто непозволительно для столь простой операции. Поэтому надеюсь, что эта статья сэкономит кому-нибудь время =)

Добавить комментарий