относительно недавно появилась интересная задача: делать бэкап только одной папки на сервере, которая мало того что занимала немногоим больше 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
До новых записей
Уведомление: Простейший WEB-сервер на FreeBSD | Воронов Глеб | TradeNarK LLC
Уведомление: "Правильный" backup. Несколько реализаций | Воронов Глеб
I must say you have high quality posts here.