Ежедневные бэкапы сайтов с Amazon EC2
24 ноября 2012 г.
•
6 минут чтения
Задача: делать ежедневные бекапы сайтов 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