Утилита RSnapshot - это утилита для создания резервных копий на основе инструментов rsync и ssh. Ключевая особенность - использование механизма hard links (жестких ссылок) для создания инкрементальных бэкапов, которые выглядят как полные копии данных.
rsync.daily.0 => daily.1, daily.1 => daily.2 и т.д.).daily.0, используя rsync с опцией --link-dest (или --hard-links), чтобы повторно использовать неизменённые файлы из предыдущего снимка через hard links.Hard link - это ссылка на тот же inode (физическое место на диске). Удаление одного hard link не удаляет данные, пока остаётся хотя бы один.
/backups/
├── hourly.0/ # Самая свежая копия
├── hourly.1/ # На час старше
├── daily.0/ # Вчерашняя копия
├── daily.1/ # Позавчерашняя
└── weekly.0/ # Недельная давность
rsync, который проверен временем./etc, /var и т.п.).Ubuntu/Debian:
sudo apt update sudo apt install rsnapshot
CentOS/RHEL:
sudo yum install epel-release sudo yum install rsnapshot
Расположение: /etc/rsnapshot.conf
# Базовый конфиг rsnapshot config_version 1.2 snapshot_root /storage/backup/ no_create_root 0 cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh ssh_args -o ServerAliveInterval=60 -o ServerAliveCountMax=5 -o StrictHostKeyChecking=accept-new # Исключаемые шаблоны exclude_file /etc/rsnapshot/exclude.txt # Мониторинг, логирование и лок-файл verbose 3 loglevel 3 logfile /storage/backup/rsnapshot.log lockfile /var/run/rsnapshot.pid # Уровни бэкапов (сохранять последние) retain daily 7 retain weekly 4 retain monthly 3 link_dest 1 # Ускорение/надёжность rsync (Debian 12 = rsync 3.2 => можно zstd): rsync_short_args -aHAX rsync_long_args --numeric-ids --delete --delete-excluded\ --partial --partial-dir=.rsync-partial\ --info=stats2 --compress --compress-choice=zstd\ --compress-level=3 --bwlimit=0 --whole-file --inplace exclude_file /etc/rsnapshot.excludes # Бэкап локальных директорий backup /home/ localhost/ backup /etc/ localhost/ backup /var/log/ localhost/ # Бэкап удаленного сервера через SSH backup root@111.xx.xx.10:/var/www/html/ 111.xx.xx.10/var/www/html/ backup root@111.xx.xx.10:/var/workspace/ 111.xx.xx.10/var/workspace/ backup root@111.xx.xx.10:/var/builds/ 111.xx.xx.10/var/builds/ backup root@111.xx.xx.10:/var/templates/ 111.xx.xx.10/var/templates/ backup root@100.xx.xx.10:/etc/ 100.xx.xx.10/etc/ backup root@100.xx.xx.10:/server/ 100.xx.xx.10/server/
Критически важное правило: RSnapshot требует использования ТАБОВ для разделения параметров в конфигурационном файле.
Правильно (табы):
snapshot_root↠/var/backups/ # ← TAB между параметрами retain↠daily↠7 # ← TAB между retain, daily и 7 backup↠/home/↠localhost/ # ← TAB между backup, /home/ и localhost/
Базовые настройки
config_version 1.2 snapshot_root /storage/backup/ no_create_root 0
config_version 1.2 - версия формата конфигурацииsnapshot_root - корневая директория для хранения бэкапов на локальном хранилище 1TBno_create_root 0 - разрешает создание корневой директории, если она не существуетНастройки команд и SSH
cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh ssh_args -o ServerAliveInterval=60 -o ServerAliveCountMax=5 -o StrictHostKeyChecking=accept-new
ssh_args - важные параметры для устойчивого SSH-соединения:ServerAliveInterval=60 - проверка соединения каждые 60 секундServerAliveCountMax=5 - максимальное количество проверок перед разрывомStrictHostKeyChecking=accept-new - при первом подключении к новому серверу - автоматически принимает новый host keyМониторинг и логирование
verbose 2 loglevel 3 logfile /var/log/rsnapshot.log lockfile /var/run/rsnapshot.pid
verbose 2: умеренный вывод в консоль/лог.loglevel 3: подробное логирование (ошибки, предупреждения, информация)./var/log/rsnapshot.log.lockfile предотвращает одновременный запуск нескольких экземпляров.Политика хранения бэкапов
retain daily 7 retain weekly 4 retain monthly 3 link_dest 1
retain daily 7 - хранить 7 последних дневных бэкаповretain weekly 4 - хранить 4 последних недельных бэкаповlink_dest 1 - использование hard links для экономии места (включено)Важно:
weekly(monthly) создаётся не автоматически! Нужно запускатьrsnapshot weeklyотдельно (обычно через cron раз в неделю).
Оптимизированные параметры rsync
rsync_short_args -aHAX rsync_long_args --numeric-ids --delete --delete-excluded\ --partial --partial-dir=.rsync-partial\ --info=stats2 --compress --compress-choice=zstd\ --compress-level=3 --bwlimit=0 --whole-file --inplace
Критически важные флаги:
-aHAX - расширенный архивный режим:
-a - архивный режим-H - сохранение hard links-A - сохранение ACL-X - сохранение расширенных атрибутов--numeric-ids - сохранение числовых ID пользователей/групп
--delete --delete-excluded - удаление файлов в бэкапе, которых нет в источнике
--partial --partial-dir=.rsync-partial - докачка прерванных файлов
--info=stats2,progress2 - детальная статистика и прогресс
--compress - сжатие при передаче (экономия трафика)
--compress-choice=zstd - современный алгоритм сжатия, быстрее zlib, даёт лучшее соотношение скорость/степень сжатия
--compress-level=3 - задаёт уровень сжатия для выбранного алгоритма. Для zstd диапазон уровней: от 1 до 19. Уровень 3 - это оптимальный баланс
--bwlimit=0 - отключает ограничение скорости
--bwlimit=1000 - ограничивает скорость до 1000 Килобит/сек (~125 KB/s)--bwlimit=50000 - ограничивает до 50000 Килобит/сек (~6250 KB/s)--whole-file - передача целых файлов (обычный режим: Файл => Разбиение на блоки => Проверка изменений => Передача измененных блоков)
--inplace - обновлять оригинальный файл на месте (обычный режим: Создать временный файл => Передать данные => Заменить оригинал)
Файл исключений
exclude_file /etc/rsnapshot.excludes
Источники для бэкапирования
backup root@111.xx.xx.10:/var/www/html/ 111.xx.xx.10/var/www/html/ backup root@111.xx.xx.10:/var/workspace/ 111.xx.xx.10/var/workspace/ backup root@111.xx.xx.10:/var/builds/ 111.xx.xx.10/var/builds/ backup root@111.xx.xx.10:/var/templates/ 111.xx.xx.10/var/templates/ backup root@100.xx.xx.10:/etc/ 100.xx.xx.10/etc/ backup root@100.xx.xx.10:/server/ 100.xx.xx.10/server/
/storage/backup/
├── daily.0/
│ ├── 111.xx.xx.10/
│ │ └── var/
│ │ ├── www/
│ │ │ └── html/ <= копия /var/www/html с 111.xx.xx.10
│ │ ├── workspace/ <= копия /var/workspace
│ │ ├── builds/ <= копия /var/builds
│ │ └── templates/ <= копия /var/templates
│ └── 100.xx.xx.10/
│ ├── etc/ <= копия /etc с 100.xx.xx.10
│ └── server/ <= копия /server
│
├── daily.1/
│ ├── ... (и так до daily.6)
│
├── weekly.0/
│ ├── 111.xx.xx.10/
│ │ └── var/
│ │ ├── www/html/
│ │ ├── workspace/
│ │ ├── builds/
│ │ └── templates/
│ └── 100.xx.xx.10/
│ ├── etc/
│ └── server/
│
├── weekly.1/
│ └── ... (и так до weekly.3)
│
└── ... (другие уровни, если есть)
Примерный файл /etc/rsnapshot.excludes (чтобы не ловить "file changed" и "socket ignored"):
/proc/
/sys/
/dev/
/run/
/tmp/
/var/tmp/
/var/run/
**/sessions/
**/cache/
**/tmp/
*.sock
*.pid
*.lock
var/lib/nginx/tmp/
var/cache/nginx/
Тестирование конфигурации:
rsnapshot configtest # если ошибка, то скорее всего она связана # с форматированием (отсутствием табов) # визуально проверьте наличие табов cat -A /etc/rsnapshot.conf
Ручной запуск бэкапа:
rsnapshot hourly # Запуск hourly бэкапа rsnapshot daily # Запуск daily бэкапа rsnapshot weekly # Запуск weekly бэкапа
Автоматизация:
Планирование: systemctl enable --now rsnapshot.timer или cron.
# Добавить в crontab -e # или nano /etc/cron.d/rsnapshot 0 */4 * * * /usr/bin/rsnapshot hourly 30 3 * * * /usr/bin/rsnapshot daily 0 3 * * 1 /usr/bin/rsnapshot weekly
БД лучше снимать отдельно, консистентно:
Percona XtraBackup / MariaBackup (горячий бэкап InnoDB)– работает онлайн, можно «стримить» на бэкап-сервер:
# На бэкап-сервере (pull: запускаем xtrabackup по SSH, льём поток к себе) ssh root@185.xx.xx.10 \ "xtrabackup --backup --stream=xbstream --parallel=4 --target-dir=/dev/null" \ | pv > /storage/backup1TB/gexarus/mysql/$(date +%F)_xtrabackup.xbstream # Подготовка (prepare) уже локально, когда нужно восстанавливать/проверять
Плюс: быстро и консистентно, минус: отдельный формат, нужен prepare.
mysqldump (для умеренных объёмов, чистый SQL)– корректный стрим без временных файлов на источнике:
ssh root@185.xx.xx.10 \ "mysqldump --single-transaction --quick --routines --events --triggers --databases DB1 DB2" \ | pigz -1 > /storage/backup1TB/gexarus/mysql/$(date +%F).sql.gz
Быстро на чтение, легко проверить, но медленнее восстановление больших баз.
Интеграция:
# в исходное место rsync -aHAX --numeric-ids \ /storage/.../daily.1/var/www/html/config.php \ /var/www/html/config.php
rsync -aHAX --numeric-ids \ /storage/.../daily.0/var/workspace/myapp/ \ /var/workspace/myapp/
rsync -aHAX --numeric-ids --delete \ /storage/.../daily.0/ \ /mnt/target/
Примечания•
-aHAX --numeric-ids- права, владельцы (по UID/GID), ACL, xattr, хардлинки.• Не меняйте файлы внутри снимков - копируйте их наружу.• Можно раздавать бэкапы read-only по NFS/Samba, чтобы «конечные» пользователи сами восстанавливали нужные файлы изdaily.N. Это тоже рекомендуют в FAQ. ([rsnapshot.org][1])
RSnapshot - отличное решение для надежного и эффективного резервного копирования с минимальными накладными расходами и простотой управления.