Backup с rsnapshot на Ubuntu
В статье я настрою backup с двух VPS (там стоит Ubuntu) на локальный комп с Ubuntu. На одной VPS стоит apache, mysql, на второй VPS запущено Node.js приложение и mongodb. Использовать буду rsnapshot, который основан на rsync. rsnapshot позволяет задать периодичность копирования и количество бэкапов (часовых, дневных, недельных, месячных и т.д.). rsnapshot не создает N копий данных на диске, а использует символические ссылки на предыдущие backup (по сути инкрементальный бэкап).
Создаю на VPS пользователей backup
adduser backup
Далее настраиваю авторизацию по ключу по инструкции. Копируем приватный ключ (~/.ssh/id_rsa) на локальном компьютере (куда делаем бэкап) из папки пользователя в папку /root/.ssh
Это делается потому, что rsnapshot будет выполнятся из под root пользователя. Теперь если выполнить следующую команду из под пользователя root, мы должны попасть на сервер без пароля:
ssh backup@yourremotevps1.ru
Настройка rsnapshot
На локальном компьютере, на котором будем хранить бэкапы ставим rsnapshot.
sudo apt-get install rsnapshot
sudo nano /etc/rsnapshot.conf
указываем куда складировать бэкапы:
snapshot_root /home/local_user/backup/
расскоментировать строчку:
cmd_ssh /usr/bin/ssh
Ищем строчки с retain и добавляем
retain daily 7 retain monthly 12
что означает, будем хранить 7 бэкапов daily и 12 бэкапов monthly. Когда будет настраивать cron — вы поймете как оно работает. Пока настраиваем дальше.
Настройка бэкапа осуществляется командой backup <откуда> <куда>:
backup backup@example.com:/home/ example.com/
что означает заходим на сервер example.com под пользователем backup и копируем содержимое каталога /home в локальный подкаталог example.com в корневой каталог snapshot_root (указанный выше в файле).
ВАЖНО: используйте табы, а не пробелы между параметрами.
Приведу параметры конфига для создания бэкапа mysql и копирования каталогов /home/, /var/www, /etc/:
backup backup@yourremotevps1.ru:/home/ yourremotevps1.ru/ backup backup@yourremotevps1.ru:/var/www/ yourremotevps1.ru/ backup backup@yourremotevps1.ru:/etc/ yourremotevps1.ru/
Чтобы сделать backup mysql, на сервере в папке пользователя backup (/home/backup) создаем файл .my.cnf и вставляем туда данные пользователя mysql, который имеет доступ на чтение ко всем нужным базам:
[mysqldump] user=mysqluser password=mysqluserpassword
Теперь выполнив команду на сервере от имени пользователя backup
mysqldump -A > /home/backup/mysql-backup.sql
будем создан файл с полным бэкапом всех бд. Вернемся к конфигу rspanshot. Перед копированием каталогов вызовем команду бэкапа бд:
backup_exec ssh backup@yourremotevps1.ru "mysqldump -A > /home/backup/mysql-backup.sql"
ВАЖНО: перед ssh — таб, после ssh — пробел, после адреса сервера — таб, между кавычками — везде пробелы.
Для второй VPS будет все аналогично.
В итоге конфиг должен получится такого вида:
backup_exec ssh backup@yourremotevps1.ru "mysqldump -A > /home/backup/mysql-backup.sql" backup backup@yourremotevps1.ru:/home/ yourremotevps1.ru/ backup backup@yourremotevps1.ru:/var/www/ yourremotevps1.ru/ backup backup@yourremotevps1.ru:/etc/ yourremotevps1.ru/ backup_exec ssh backup@yourremotevps2.ru "mongodump -o /home/backup/mongo.backup" backup backup@yourremotevps2.ru:/home/ yourremotevps2.ru/ backup backup@yourremotevps2.ru:/etc/ yourremotevps2.ru/
На второй VPS я делаю дамп mongodb, а потом копирую необходимые мне каталоги.
Чтобы проверить конфиг выполняю от root:
rsnapshot configtest
Если возвращает Syntax OK — значит все правильно, если ошибки — читаем, смотрим, проверяем пробелы и табы.
Теперь можно сделать первый бэкап (пока вручную) из под root пользователя
rsnapshot daily
Добавляем в cron раписание запуска бэкапов. Я хочу делать ежедневный бэкап каждую полночь, и месячный каждого 1 числа. Под root’ом выполняем:
crontab -e
и дописываем в конец:
@daily /usr/bin/rsnapshot daily @monthly /usr/bin/rsnapshot monthly