Rsnapshot, написанный на Perl, базируется на rsync. В рабочей директории программы (назовём так место, куда складываются бэкапы), создается ряд папок с индексом, который при каждом следующем запуске программы увеличивается до указанного в конфигурации значения. Затем устаревшая копия удаляется. Если пройти в любую из созданных папок, то внутри можно найти полную копию резервируемых данных. На это указывает и общий размер папки — он равен сумме всех папок. На самом деле это не так. Программа создает жесткие ссылки между одинаковыми данными в пределах рабочего каталога. Таким образом, последняя актуальная копия является самой «тяжелой», а размер всех остальных составляет разницу в измененных данных.
Умеет делать pre и post-backup операции. Файлы хранятся в первозданном виде — легко восстанавливать. Достаточно удобно организовано конфигурирование. Поддерживает несколько временных уровней резервирования (дневной, недельный, месячный)
1.Установка Rsnapshot (Требует предварительной установки EPEL или RPMForge-репозитария)
1 |
# yum install rsync rsnapshot |
2.Настройка SSH-авторизации по ключам без пароля с удаленным сервером
1 |
# ssh-keygen -t rsa |
1 |
# ssh-copy-id -p 2200 -i .ssh/id_rsa.pub root@server1.mydomain.com |
Проверяем вход по ключам
1 |
# ssh -p 2200 root@server1.mydomain.com |
3.Настройка rsnapshot
1 |
# cp /etc/rsnapshot.conf /etc/rsnapshot.conf~ |
В конфигурационном файле есть важные примечания
1.Разделителем между полями должен быть символ табуляции, а не пробел
2.Каталоги должны оканчиваться слешем (/home/ — корректно, /home – не корректно)
1 |
# cat /etc/rsnapshot.conf | egrep -v '(#|^$)' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
config_version 1.2 #Каталог для хранения бекапов snapshot_root /backup/ cmd_cp /usr/bin/cp cmd_rm /usr/bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger cmd_du /usr/bin/du cmd_rsnapshot_diff /usr/bin/rsnapshot-diff #Закомментировал часовой бекап т.к я выполняю ежедневный #interval hourly 6 #Ежедневный бекап, хранить 7 копий, еженедельный - 4 копии, ежемесячный -3 копии interval daily 7 interval weekly 4 interval monthly 3 verbose 2 loglevel 3 logfile /var/log/rsnapshot lockfile /var/run/rsnapshot.pid rsync_short_args -az rsync_long_args --delete --numeric-ids --relative --delete-excluded # На удаленных серверах используется нестандартный SSH-порт ssh_args -p 2200 backup /etc/ localhost/ backup /home/user/ localhost/ backup /usr/share/cacti/ localhost/ backup /usr/local/nagios/ localhost/ # каталог для исключения из бекапа exclude /home/user/myuser/mydomain/folder/ #Бекап удаленного сервера backup root@server1.mydomain.com:/usr/local/nagios/ server1/ backup root@server1.mydomain.com:/var/www/html/ server1/ backup root@server1.mydomain.com:/usr/share/cacti/ server1/ backup root@server1.mydomain.com:/home/users/ server1/ backup root@server1.mydomain.com:/etc/ server1/ |
Проверка синтаксиса конфигурационного файла /etc/rsnapshot.conf
1 |
# rsnapshot configtest |
1 |
Syntax OK |
Тестовый режим запуска(иммитация запуска без его реального выполнения)
1 |
# rsnapshot -t daily |
1 |
# rsnapshot daily |
1 |
# ls -l /backup/daily.0/ |
1 2 3 |
total 8 drwxr-xr-x 5 root root 4096 Jan 17 23:24 localhost drwxr-xr-x 6 root root 4096 Jan 17 23:27 server1 |
1 |
# ls -l /backup/daily.0/localhost/ |
1 2 3 4 |
total 20 drwxr-xr-x 102 root root 12288 Jan 17 21:44 etc drwxr-xr-x 3 root root 4096 Jan 4 15:20 home drwxr-xr-x 4 root root 4096 Dec 15 14:56 usr |
1 |
# ls -l /backup/daily.0/server1/ |
1 2 3 4 5 |
total 24 drwxr-xr-x 100 root root 12288 Jan 14 00:48 etc drwxr-xr-x 3 root root 4096 Jan 5 19:21 home drwxr-xr-x 4 root root 4096 Dec 17 2013 usr drwxr-xr-x 3 root root 4096 Jan 5 19:33 var |
Лог файл для Rsnapshot
1 |
# tail -f /var/log/rsnapshot |
1 |
[17/Jan/2016:23:27:42] /usr/bin/rsnapshot daily: completed successfully |
1 |
# du -hs /backup/daily.0/* |
1 2 |
357M /backup/daily.0/localhost 344M /backup/daily.0/server1 |
После повторного запуска проверяем размеры бекапов
1 |
# du -hs /backup/* |
1 2 |
701M /backup/daily.0 24M /backup/daily.1 |
1 |
# find /backup/daily.0/ -type f | wc -l |
1 |
28016 |
1 |
# find /backup/daily.1/ -type f | wc -l |
1 |
28010 |
Это достигается благодаря тому, что rsnapshot делает инкрементальные бекапы и создает жесткие ссылки между одинаковыми данными в пределах рабочего каталога.
использует опцию –l при копировании cp daily.0 в daily.1
1 |
--link hard link files instead of copying |
1 |
/usr/bin/cp -al /backup/daily.0 /backup/daily.1 |
Опции команды сp
1 2 3 4 5 |
-a, --archive –аналогично опциям -dR --preserve=all -d - - aналогично опциям -no-dereference --preserve=links - never follow symbolic links in SOURCE -R -, --recursive - copy directories recursively --preserve - preserve the specified attributes -l - hard link files instead of copying |
Запускаем вручную третий раз
1 |
# rsnapshot daily |
1 |
# tail -f /var/log/rsnapshot |
1 2 3 4 5 6 7 8 |
[18/Jan/2016:00:00:58] /usr/bin/rsnapshot daily: started [18/Jan/2016:00:00:58] echo 38747 > /var/run/rsnapshot.pid [18/Jan/2016:00:00:58] mv /backup/daily.1/ /backup/daily.2/ [18/Jan/2016:00:00:58] /usr/bin/cp -al /backup/daily.0 /backup/daily.1 ……………………………………………………………… [18/Jan/2016:00:02:33] touch /backup/daily.0/ [18/Jan/2016:00:02:33] rm -f /var/run/rsnapshot.pid [18/Jan/2016:00:02:33] /usr/bin/rsnapshot daily: completed successfully |
1 |
# du -hs /backup/* |
1 2 3 |
701M /backup/daily.0 26M /backup/daily.1 24M /backup/daily.2 |
4.Настройка создания бекапа по расписанию
1 |
# nano /etc/cron.d/rsnapshot |
1 2 3 4 5 |
MAILTO=my@email #0 */4 * * * root /usr/bin/rsnapshot hourly 30 3 * * * root /usr/bin/rsnapshot daily 0 3 * * 1 root /usr/bin/rsnapshot weekly 30 2 1 * * root /usr/bin/rsnapshot monthly |
5.Настройка Rsnapshot-отчетов на E-Mail
Определяем расположение скрипта для создания отчетов,которые устанавливается вместе с пакетом rsnapshot
1 |
# rpm -ql rsnapshot | grep rsnapreport.pl |
1 |
/usr/share/doc/rsnapshot-1.3.1/utils/rsnapreport.pl |
Копируем этот скрипт в /usr/local/bin/ и делаем его исполняемым
1 |
# cp /usr/share/doc/rsnapshot-1.3.1/utils/rsnapreport.pl /usr/local/bin/ |
1 |
# chmod +x /usr/local/bin/rsnapreport.pl |
Добавлем парметр
1 |
--stats |
в список long аргументов rsync(rsync_long_args)
1 |
# nano /etc/rsnapshot.conf |
1 |
rsync_long_args --stats --delete --numeric-ids --relative --delete-excluded |
Редактируем созданное ранее cron-задание
1 |
# cat /etc/cron.d/rsnapshot |
1 2 3 4 |
#0 */4 * * * root /usr/bin/rsnapshot hourly 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Hourly Backup" my@email 30 3 * * * root /usr/bin/rsnapshot daily 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Daily Backup" my@email 0 3 * * 1 root /usr/bin/rsnapshot weekly 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Weekly Backup" my@email 30 2 1 * * root /usr/bin/rsnapshot monthly 2>&1 | /usr/local/bin/rsnapreport.pl | mail -s "Montly Backup" my@email |
6.Полезные команды rsnapshot
Просмотр размера дискового пространства,занятого бекапами.
1 |
# rsnapshot du |
1 2 3 4 5 6 7 8 |
233M /backup/daily.0/ 24M /backup/daily.1/ 14M /backup/daily.2/ 16M /backup/daily.3/ 6.7M /backup/daily.4/ 6.7M /backup/daily.5/ 9.5M /backupr/daily.6/ 307M total |
1 |
# rsnapshot du localhost |
1 2 3 4 5 6 7 8 |
175M /backupr/daily.0/localhost 16M /backup/daily.1/localhost 15M /backup/daily.2/localhost 21M /backup/daily.3/localhost 26M /backup/daily.4/localhost 23M /backup/daily.5/localhost 25M /backup/daily.6/localhost 298M total |
1 |
# rsnapshot diff daily.0 daily.1 |
1 2 3 4 |
Comparing /backup/daily.1 to /backup/daily.0 Between /backup/daily.1 and /backup/daily.0: 1785 were added, taking 19557611 bytes; 1996 were removed, saving 12466180 bytes; |
1 |
# rsnapshot diff daily.0/localhost daily.1/localhost |
1 2 3 4 |
Comparing /backup/daily.0/localhost to /backup/daily.1/localhost Between /backup/daily.0/localhost and /backup/daily.1/localhost: 1167 were added, taking 10955237 bytes; 956 were removed, saving 18046666 bytes; |
7.Настройка бекапа баз данных
Бекап баз данных с удаленного сервера можно проводить двумя способами
Первый способ
1.На удаленном сервере локально делается бекап баз данных и этот каталог,куда складывается этот бекап, копируется на сервер подобно остальным каталогам.
Второй способ
2.Необходимо разрешить удаленное подключения к MySQL¬серверу с сервера,на котором запускается rsnapshot
В этом случае с rsnapshot-сервер удаленно подключается к MySQL-серверу и снимает с него бекап баз данных через скрипт, указанный в параметре backup_script конфигурационного файла rsnapshot
За пример,можно взять уже поставляемый в комплекте скрипт.
1 |
# rpm -ql rsnapshot | grep backup_mysql.sh |
1 |
/usr/share/doc/rsnapshot-1.3.1/utils/backup_mysql.sh |
1 |
# cp /usr/share/doc/rsnapshot-1.3.1/utils/backup_mysql.sh /usr/local/bin/ |
1 |
# chown root:root /usr/local/bin/backup_mysql.sh |
1 |
# chmod 751 /usr/local/bin/backup_mysql.sh |
Мне удобнее использовать свой скрипт для бекапа побазово, а не всех баз данных в один файл
1 |
# nano /etc/rsnapshot.conf |
1 2 3 4 |
# Для бекапа локальных баз даннях backup_script /usr/local/scripts/backuprsnapshot-databases-local.sh localhost/mysql/ # Для бекапа баз данных c удаленного сервера backup_script /usr/local/scripts/backuprsnapshot-databases-server1.sh server1/mysql/ |
1 |
# chmod 751 /usr/local/scripts/backuprsnapshot-databases-* |
Проверяем синтаксис, запускаем создание бекапа и проверяем логи
1 |
# rsnapshot configtest |
1 |
# rsnapshot daily |
1 |
# tail -f /var/log/rsnapshot |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[18/Jan/2016:17:19:36] mkdir -m 0755 -p /backup/tmp/ [18/Jan/2016:17:19:36] cd /backup/tmp/ [18/Jan/2016:17:19:36] /usr/local/scripts/backuprsnapshot-databases-local.sh [18/Jan/2016:17:19:37] cd /backup/ [18/Jan/2016:17:19:37] sync_if_different("/backup/tmp/", "/backup/daily.0/localhost/mysql/") [18/Jan/2016:17:19:37] /bin/rm -rf /backup/tmp/ [18/Jan/2016:17:28:00] mkdir -m 0755 -p /backup/tmp/ [18/Jan/2016:17:28:00] cd /backup/tmp/ [18/Jan/2016:17:28:00] /usr/local/scripts/backuprsnapshot-databases-server1.sh [18/Jan/2016:17:28:00] cd /backup/ [18/Jan/2016:17:28:00] sync_if_different("/backup/tmp/", "/backup/daily.0/ server1 /mysql/") [18/Jan/2016:17:28:00] /bin/rm -rf /backup/tmp/ |
1 |
# nano /usr/local/scripts/backuprsnapshot-databases-local.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#!/bin/bash #DATE format DATE="$(date +"%Y-%m-%d")" # set mysql login info MUSER="root" MPASS="123" MHOST="localhost" #Log file LOGFILE="/var/log/backup.log" # guess binary names MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" GZIP="$(which gzip)" FIND="$(which find)" TEE="$(which tee)" EGREP="$(which egrep)" # get all db names except service databases DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | $EGREP -v '(information_schema|performance_schema)')" for db in $DBS do FILE=$db-$DATE.sql.gz $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS -EKR --single-transaction $db | $GZIP -c > $FILE if [ ${PIPESTATUS[0]} != "0" ]; then echo "Backup database $db is failed - $DATE" | $TEE -a $LOGFILE fi done echo "Backup databases is done! Databases up to $DATE " | $TEE -a $LOGFILE |
Скрипт для снятия бекапа баз данных с удаленного сервера аналогичен этому за исключением логина/пароля/имени сервера
Для корректного переноса хранилища rsnapshot(например,каталога /backup) на другой сервер с помощью rsync необходимо использовать опцию -H
Например
1 |
# rsync -avzhe "ssh -p2222" -H source_server_name:/backup / |
Источник:
http://www.tecmint.com/rsnapshot-a-file-system-backup-utility-for-linux
https://wiki.centos.org/HowTos/RsnapshotBackups
http://habrahabr.ru/post/143383/
http://habrahabr.ru/company/centosadmin/blog/220555/
https://www.howtoforge.com/installing-rsnapshot-on-centos
https://www.digitalocean.com/community/tutorials/how-to-install-rsnapshot-on-ubuntu-12-04
http://anandarajpandey.com/2015/04/12/rssnapshot-how-to-backup-files-website-to-remote-backup-location/