rsync — стандартный инструмент для резервного копирования и синхронизации файлов в Linux. Алгоритм rsync вычисляет контрольные суммы блоков файла и передаёт только изменённые блоки, а не файлы целиком. Это делает rsync значительно быстрее обычного копирования для больших наборов данных.
Как работает rsync
rsync сравнивает файлы источника и назначения по размеру и времени изменения (быстро) или по MD4-контрольным суммам 700-байтных блоков (точно, через --checksum). Передаётся только разница — delta. Для сжатия при передаче используется флаг -z. Транспорт — SSH по умолчанию, или собственный протокол rsync (порт 873) для rsync-серверов.
Основные флаги
# Синхронизация с удалённым сервером
rsync -avz /local/path/ user@server:/remote/path/
# С удалением устаревших файлов
rsync -avz --delete /local/ user@server:/remote/
# Dry run — показать без выполнения
rsync -avzn /local/ user@server:/remote/
# Исключить файлы
rsync -avz --exclude='*.log' --exclude='cache/' /local/ user@server:/remote/
- -a (archive)
- рекурсивно, сохраняет права, временные метки, symlinks.
- -v (verbose)
- подробный вывод.
- -z (compress)
- сжатие данных при передаче.
- --delete
- удалять в назначении файлы, которых нет в источнике.
Инкрементальные бэкапы через rsync
rsync + hard links — классика инкрементального резервного копирования:
rsync -avz --link-dest=/backups/latest /data/ /backups/$(date +%Y%m%d)/
ln -snf /backups/$(date +%Y%m%d) /backups/latest
Каждый ежедневный бэкап занимает только место для изменений — неизменённые файлы — hard links на предыдущую копию. 30 ежедневных бэкапов занимают чуть больше одного полного.
История
rsync создан Эндрю Тридгеллом (Andrew Tridgell, автором Samba) и Полом Маккерасом (Paul Mackerras) в 1996 году в Australian National University. Алгоритм rsync описан в диссертации Тридгелла 1999 года. rsync daemon поддерживает rsync-протокол (порт 873) для публичных rsync-серверов (зеркала дистрибутивов Linux).
На что обращать внимание
Trailing slash имеет значение: rsync src/ dest/ копирует содержимое src, rsync src dest/ — создаёт src внутри dest. Для бэкапа баз данных rsync не подходит — нужен mysqldump/pg_dump сначала, затем rsync дампа. Порты 22 (SSH) должен быть доступен для удалённой синхронизации. BorgBackup — более современная альтернатива с дедупликацией и шифрованием.
Алгоритм дельта-синхронизации
rsync делит файл на блоки по 512-700 байт и вычисляет контрольные суммы. Если блок на целевом хосте совпадает по сумме — он не передаётся. При изменении 1% файла по сети уходит ~1% данных, а не весь файл. Это критично для бекапов баз данных размером в несколько гигабайт.
Флаг --link-dest создаёт инкрементальные бекапы с hard links: каждый ежедневный снимок занимает только размер изменений, а не полный объём данных. 30 дней бекапов занимают немного больше одного полного снимка.
Типичные команды
Синхронизация папки на удалённый сервер:
rsync -avz --delete /var/www/site/ user@server:/var/www/site/
Флаг -a сохраняет права, владельца и временные метки. --delete удаляет на приёмнике файлы, удалённые на источнике. -z сжимает данные при передаче.
rsync работает поверх SSH по умолчанию. Для внутренней сети можно использовать rsync daemon (порт 873) без шифрования — быстрее, но без аутентификации по ключу. Пара rsync + cron — стандартное решение для ежедневных бекапов на VPS.