Дифференциальный бекап VDS/VPS и MySql средствами rsync

Задача - иметь локальный бекап настроенного web-сервера (Ubuntu): ежедневный за последние 7 дней, еженедельный  за 4 недели и ежемесячный за 6 месяцев. Мы будем использовать rsync, это позволит нам копировать только добавленные и изменившиеся данные. Нам нужно настроить SSH авторизацию по ключам между серверами, написать скрипт бекапа и засунуть его в крон. Задача в общем-то тривиальная.
Начнем с настройки авторизации по ключам. Допустим, на локальном компьютере, где будут храниться бекапы, у нас есть пользователь user. От имени этого пользователя мы будем подключаться к удаленному серверу. Нам нужно сгенерировать ключи под этим пользователем на локальном компьютере и перенести полученный открытый ключ на удаленный сервер. После этого мы сможем логиниться под пользователем user на удаленном сервере без пароля.

Итак, на локальном компьютере выполняем:
ssh-keygen -t rsa -b 2048
В результате мы получим два файла:
  • /home/user/.ssh/id_rsa - закрытый ключ, его храним только локально
  • /home/user/.ssh/id_rsa.pub - открытый ключ, его мы разместим на удаленном сервере
Не забываем выставить права 700 для директории .ssh и 600 к файлу закрытого ключа id_dsa.

Теперь идем на удаленный сервер. Проверяем включена ли авторизация по ключам:
в файле /etc/ssh/sshd_config нужно найти и раскоменировать строчки:
PubkeyAuthentication yes
AuthorizedKeysFile     %h/.ssh/authorized_keys
Далее перезапускаем службу:
service sshd restart
Теперь копируем содержимое локального файла /home/user/.ssh/id_rsa.pub в файл на удаленном сервере: /home/[имя-пользователя]/.ssh/authorized_keys или в /root/.ssh/authorized_keys (в зависимости от того, под каким пользователем вы хотите авторизоваться). После этого проверяем подключение например так ssh root@server-ip и подтверждаем доверие "фингерпринту".

C доступом разобрались. Теперь создадим список папок, которые не нуждаются в копировании. Помимо нескольких системных директорий, нам не нужно копировать папку с базами MySql. Базы мы будем бекапить перед копированием.
nano /opt/Backup/server_exclude.data
dev/
proc/
sys/
var/lib/mysql/
Также нам понадобится несколько папок для ежедневных, еженедельных и ежемесячных бекапов, в моем случае это папки daily, weekly и monthly. В каждой из этих папок создадим папку current для последнего полного бекапа и папку increment только с изменениями за определенный день. Код скрипта:
#!/bin/sh
# указываем папку для хранения копий
syst_dir=/opt/Backup/server-name

# Делаем бекап баз в корень
echo "mysqldump --all-databases --events --single-transaction --hex-blob --routines --triggers -umysql-user -p\"mysql-password\" > /db_dump.sql" | ssh root@server-ip
# Удаляем старую копию базы
echo "rm -f '/db_dump.sql.gz'" | ssh root@server-ip
# Архивируем новую
echo "gzip /db_dump.sql" | ssh root@server-ip

# Делаем ежедневную копию с удаленного сервера
rsync -av --delete-after --exclude-from=/opt/Backup/server_exclude.data root@server-ip:/ ${syst_dir}/daily/current/ --backup --backup-dir=${syst_dir}/daily/increment/`date +%Y-%m-%$`/

# Чистим папки с инкрементными архивами старше 7-ти дней
/usr/bin/find ${syst_dir}/daily/increment/ -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;

# Делаем еженедельную копию по понедельникам
if [ $(date +%u) = 1 ]; then
  rsync -av --delete-after ${syst_dir}/daily/current/ ${syst_dir}/weekly/current/ --backup --backup-dir=${syst_dir}/weekly/increment/`date +%Y-%m-%d`/
# удаляем копии старше 30 дней
  /usr/bin/find ${syst_dir}/weekly/increment/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
fi

# Делаем ежемесячную копию 1 числа каждого месяца
if [ $(date +%d) = 01 ]; then
  rsync -av --delete-after ${syst_dir}/daily/current/ ${syst_dir}/monthly/current/ --backup --backup-dir=${syst_dir}/monthly/increment/`date +%Y-%m-%d`/
# удаляем копии старше 182 дней
  /usr/bin/find ${syst_dir}/monthly/increment/ -maxdepth 1 -type d -mtime +182 -exec rm -rf {} \;
fi
Один раз запускаем файл вручную, чтобы подтвердить доверие и прописываем его запуск в крон раз в день.
Восстановление системы из копии описано в этой статье.

Комментариев нет:

Отправить комментарий