Инкрементальный бекап данных с помощью rsync

относительно недавно появилась интересная задача: делать бэкап только одной папки на сервере, которая мало того что занимала немногоим больше 70 гигабайт, так в ней ещё и было огромное количество мелких файлов. А данные для работы нужны, просто так пожертвовать ими нельзя. Вариант с архивированием отпадает практически сразу. На сервере с 16 Gb оперативки он сжимался 20 часов. Сразу стало очевидно, что дело пахнет инкрементальностью. То есть архивироваться/бекапиться должны не все данные, а только те, которые изменились с момента предыдущего добавочного резервирования. Хотел написать скрипт, да вот как подумал, что разворачивать контент придется ровно в противоположном порядке создания бэкапов, сразу и перехотел.
Недолгие поиски привели меня к тому, что мне нужно: rsync. Как понятно из названия мало того, что это синхронизация (sync) так ещё и удаленная (r). То есть можно стягивать данные с удаленных серверов. А это большой плюс к безопасности, так как утилита умеет использовать ssh.
Работает rsync по принципу клиент-сервер. Тут есть замечательный нюанс: в один момент клиент и сервер могут поменяться местами. Далее попробую объяснить подробнее.
Принцип работы rsync довольно прост. Есть сервер-ресурс (назовем условно SRC) и сервер-назначение (DST).

Usage: rsync [OPTION]… SRC [SRC]… DEST # с папки в папку на одном и том же тазике
or rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST # с папки на удаленный хост
or rsync [OPTION]… [USER@]HOST::SRC [DEST] # с удаленного сервака в локальную папку

Как видим данные можно гонять в обе стороны.
rsync является самодостаточным (он устанавливает сразу и клиент и сервер) и работает на своем порту (по умолчанию 873).
Правильной будет следующая схема реализации создания резервных копий: на машине, куда будем сливать копии поднимаем rsync-сервер. На машине-источнике будет достаточно только клиента. На последней будем запускать rsync что бы он необходимые данные гнал на rsync-сервер. При необходимости просто меняем местами SRC и DST и данные синхронизируются в обратном порядке. Главное в этой ситуации смотреть за rsync-сервером. Что бы по закону Мерфи они одновременно не вышли из строя.
С теорией вроде всё ясно. Переходим к реализации. Для начала займемся конфигурацией rsync-сервера.
Поехали

cd /usr/ports/net/rsync/
make config

Я выбрал только SSH для возможности безопасной передачи данных. Пока что я не использую этот параметр, но все может случиться.

make && make install && make clean && rehash

Забегая наперёд хочу сказать, что это же нужно будет выполнить и втором сервере. rcync-клиент установиться, чего нам будет достаточно.
Пилим конфиги:

cd /usr/local/etc/
ls -la | grep rsync
-r--r--r-- 1 root wheel 477 May 29 10:29 rsyncd.conf
-r--r--r-- 1 root wheel 766 May 29 10:29 rsyncd.conf.sample

Правим rsyncd.conf до подобного состояния

# Set this if you want to stop rsync daemon with rc.d scripts
pid file = /var/run/rsyncd.pid
#Hello
motd file = /etc/new_motd
#Log
log file = /var/log/rsyncd.log
# Edit this file before running rsync daemon!!
uid = nobody
gid = nobody
use chroot = no
max connections = 4
#syslog facility = local5
# Название секции
[Backup]
 # Путь к дириктории
 path = /home/gleb/backup
 # Коментарий 
 comment = Matter Corporate Backup (requires authentication) 
 # Разрешаем запись
 read only = no 
 # Разрешаем просмотр
 list = yes
 # Указываем пользователей, которым будет разрешено устанавливать соединение
 auth users = gleb, smart
 # Указываем путь к файлу с данными для аутентификации
 secrets file = /usr/local/etc/rsyncd.secret

Создаём необходимые файлы:

cat > /etc/new_motd
TradeNarK rsync server
ctrl+D
touch /var/log/rsyncd.log
chmod 0600 /var/log/rsyncd.log
chown root:wheel /var/log/rsyncd.log
cat > /usr/local/etc/rsyncd.secret
gleb:Password
smart:passworD
ctrl+D
chown root:wheel /usr/local/etc/rsyncd.secret
chmod 0600 /usr/local/etc/rsyncd.secret
echo rsyncd_enable=\"YES\" >> /etc/rc.conf
chmod 777 /home/gleb/backup # Для возможности записи в этот каталог
/usr/local/etc/rc.d/rsyncd start
Starting rsyncd.
ps aux | grep rsync
root 21810 0.0 0.1 9528 1288 ?? Ss 6:54PM 0:00.00 /usr/local/bin/rsync --daemon
root 21815 0.0 0.1 9748 1048 0 S+ 6:54PM 0:00.01 grep rsync

Можно сразу и проверить:

rsync localhost::
TradeNarK rsync server
Backup Matter Corporate Backup (requires authentication)

Вроде как работает.
Проверим точнее:

rsync --list-only gleb@localhost::Backup
TradeNarK rsync server
Password: 
drwxrwxr-x 512 2013/06/01 00:00:06 .
-rwxrwxr-x 1309 2013/05/07 00:00:02 drupal-shop.sql
-rwxrwxr-x 1299 2013/05/07 00:00:01 drupal.sql
-rwxrwxr-x 6563 2013/06/06 00:00:04 exim.sql
-rwxrwxr-x 2028 2013/06/06 00:00:05 finance.sql
-rwxrwxr-x 515334 2013/06/06 00:00:05 mysql.sql
-rwxrwxr-x 3014 2013/06/06 00:00:05 proftpd.sql
-rwxrwxr-x 51645 2013/06/06 00:00:06 robik.sql
-rwxrwxr-x 19102 2013/06/06 00:00:06 roundcube.sql
-rwxrwxr-x 50312 2013/06/06 00:00:06 smart.sql
-rwxrwxr-x 858872 2013/06/06 00:00:06 wordpress.sql
-rwxrwxr-x 13564848 2013/06/06 00:00:14 zabbix.sql

На rsync-клиенте пробуем залить все на новоиспеченный сервер:

rsync --update --recursive -v .ssh/ gleb@tradenark.com.ua::Backup
TradeNarK rsync server
Password: 
sending incremental file list
authorized_keys
id_rsa
id_rsa.pub
known_hosts
sent 5156 bytes received 84 bytes 1497.14 bytes/sec
total size is 4883 speedup is 0.93

Ну вот и все. Наш сервер полностью рабочий и может служить хранилищем для удаленного инкрементального защищенного бекапа.
Ещё один момент. Так как у нас сервер не проходной двор и мы его запаролили, то логично что каждый раз при попытке синхронизации запрашивается пароль. Что бы избежать этого(к примеру для постановки задачи в cron) существует опция —password-file=FILE.
Создадим этот файл на клиенте и пропишем в нем ТОЛЬКО пароль для пользователя, под которым хотим производить синхронизацию. Ну и проверим:

rsync --update --recursive --password-file=rsync_password -v .ssh/ gleb@tradenark.com.ua::Backup
TradeNarK rsync server
sending incremental file list
sent 101 bytes received 8 bytes 218.00 bytes/sec
total size is 4883 speedup is 44.80

Есть, все прошло автоматически без запроса пароля
Типа готово. Можно ставить в крон и не париться за актуальность данных. Так же рекомендую изучить все доступные опции rsync-а. Их там на 3 странички A4
До новых записей

Инкрементальный бекап данных с помощью rsync: 3 комментария

  1. Уведомление: Простейший WEB-сервер на FreeBSD | Воронов Глеб | TradeNarK LLC

  2. Уведомление: "Правильный" backup. Несколько реализаций | Воронов Глеб

Добавить комментарий