24 ноября 2012 г. Ежедневные бэкапы сайтов с Amazon EC2

Amazon EC2 Backups

Задача: делать ежедневные бекапы сайтов c Amazon EC2 Instance (бекапы MySQL баз и файлов к сайтам) и копировать содержимое на другой комп. Можно реализовать это при помощи bash скриптов.

Создание бэкапов MySQL и создание архива файлов к сайтам

Сделаем это с помощью небольшого скрипта на bash и назовём его backup.sh

#!/bin/bash
#configuration settings
DATABASES=(blog dbsite1 dbsite2)
DATABASE_USER=root
DATABASE_PASS=password
DATABASE_HOST=localhost
WWW_PATH=/var/www
SITES[0]=blog.com
SITES[1]=site1.com
SITES[1]=site2.com
BACKUPS_PATH=/backups
####################################
BACKUPS_MONTH=`date +%Y-%m`
DATE=`date +%Y-%m-%d`
for DATABASE in ${DATABASES[*]}
do
        mysqldump -u$DATABASE_USER -h$DATABASE_HOST -p$DATABASE_PASS $DATABASE > /tmp/$DATABASE.sql
        mysql_backup_filename=$DATABASE'_'$DATE'_mysql.tar.gz'
        cd /tmp
        if [ ! -d "$BACKUPS_PATH" ]; then
            mkdir $BACKUPS_PATH
        fi
        if [ ! -d "$BACKUPS_PATH/$BACKUPS_MONTH" ]; then
                mkdir $BACKUPS_PATH/$BACKUPS_MONTH
        fi
        tar -zcf $BACKUPS_PATH/$BACKUPS_MONTH/$mysql_backup_filename $DATABASE.sql
        rm $DATABASE.sql
done
for SITE in ${SITES[*]}
do
        site_backup_filename=$SITE'_'$DATE'_files.tar.gz'
        cd $WWW_PATH
        if [ ! -d "$BACKUPS_PATH" ]; then
            mkdir $BACKUPS_PATH
        fi
        if [ ! -d "$BACKUPS_PATH/$BACKUPS_MONTH" ]; then
                mkdir $BACKUPS_PATH/$BACKUPS_MONTH
        fi
        tar -zcf $BACKUPS_PATH/$BACKUPS_MONTH/$site_backup_filename $SITE
done

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

DATABASES=(blog dbsite1 dbsite2)

Настройки подключения к базе

DATABASE_USER=root
DATABASE_PASS=password
DATABASE_HOST=localhost

Путь к корню web сервера

WWW_PATH=/var/www

Директории виртуальных хостов (сайтов), которые лежат в /var/www и которые необходимо бэкапить

SITES[0]=blog.com
SITES[1]=site1.com
SITES[1]=site2.com

Куда складывать бэкапы

BACKUPS_PATH=/backups

Удаление старых бэкапов

Бэкапы будут делатся ежедневно и их рано или поздно станет очень много, поэтому хорошо бы хранить только бэкапы за последние 10 дней. Это сделает скрипт backup_cleaner.sh

#!/bin/bash
EXPIRE_DAYS=10
SCAN_DIR=/backups
FILES=`find $SCAN_DIR -type f`
for file in $FILES;
   do
         timestamp=`date -r $file +%Y%m%d`;
         echo "Processing $file file..";
         date1yrs=`date -d "$timestamp" +%Y`;
         date1days=`date -d "$timestamp" +%j`;
         date2yrs=`date +%Y`;
         date2days=`date +%j`;
         diffyr=`expr $date2yrs - $date1yrs`;
         diffyr2days=`expr $diffyr \* 365`;
         diffdays=`expr $date2days - $date1days`;
         DAYS=`expr $diffyr2days + $diffdays`;
         if [ $DAYS -ge $EXPIRE_DAYS ]
           then
                echo "Deleting $file file...";
                rm $file;
         fi
   done

Если нужно хранить бэкапы за больший или меньший промежуток времени, то это можно настроить указав в переменной EXPIRE_DAYS не 10, а к примеру 30

Автоматизация работы скриптов

Ставим скрипты в cron на выполнение по расписанию

15 3 * * * root /path/to/backup.sh
30 3 * * * root /path/to/backup_cleaner.sh

Срипт создающие бэкапы будет выполнятся ежедневно в 3:15, а скрипт удаляющий старые бэкапы будет выполнятся ежедневно в 3:30

Копирование бэкапов с Amazon EC2 Instance

Копируем при помощи rsync, которая позволит синхронизировать файлы не копируя каждый раз всё подряд.

rsync -e "ssh -i /home/username/.ec2/amazon.pem" --progress -zoguhvr --compress-level=9 ec2-user@myamazoninstance.com:/backups/ /storage/Backup/amazon/

Ставим задачу в cron. Синхронизация будет происходить каждый день в 21:15

15 21 * * * username /usr/bin/rsync -e "ssh -i /home/username/.ec2/amazon.pem" --progress -zoguhvr --compress-level=9 ec2-user@myamazoninstance.com:/backups/ /storage/Backup/amazon/

P.S. Данный способ создания бэкапов подходит не только для создания бэкапов с Amazon EC2 Instance. Этот способ аналогичным образом можно использовать, если у вас есть выделенный сервер не на Amazon

Разработка