Сообщить об ошибке.

Создание резервных копий на основе rsync и ssh

Содержание:

Что такое RSnapshot?

Утилита RSnapshot - это утилита для создания резервных копий на основе инструментов rsync и ssh. Ключевая особенность - использование механизма hard links (жестких ссылок) для создания инкрементальных бэкапов, которые выглядят как полные копии данных.

Основные характеристики

  • Бесплатный и с открытым исходным кодом
  • Кросс-платформенный (Linux, Unix, macOS)
  • Экономия места благодаря hard links
  • Простота использования и конфигурации
  • Шифрование через SSH
  • Вращение резервных копий по времени

Где применяется?

  1. Резервное копирование серверов
  2. Бэкапы рабочих станций
  3. Создание точек восстановления для веб-сайтов
  4. Резервирование конфигурационных файлов
  5. Архивация данных в малом и среднем бизнесе

Как работает RSnapshot?

  1. Первый бэкап: rsnapshot делает полную копию данных через rsync.
  2. Следующий бэкап:
    • Сначала переименовывает предыдущие снимки (например, daily.0 => daily.1, daily.1 => daily.2 и т.д.).
    • Затем создаёт новый daily.0, используя rsync с опцией --link-dest (или --hard-links), чтобы повторно использовать неизменённые файлы из предыдущего снимка через hard links.
  3. Таким образом, каждый снимок - это полная файловая структура, но физически дублируются только изменённые файлы.
  4. Реализует схему ротации "скользящего окна"

Hard link - это ссылка на тот же inode (физическое место на диске). Удаление одного hard link не удаляет данные, пока остаётся хотя бы один.

Пример структуры каталогов:

/backups/
├── hourly.0/    # Самая свежая копия
├── hourly.1/    # На час старше
├── daily.0/     # Вчерашняя копия
├── daily.1/     # Позавчерашняя
└── weekly.0/    # Недельная давность

Преимущества RSnapshot

  • Экономия места: инкрементальные бэкапы без дублирования одинаковых данных.
  • Простота восстановления: каждый снимок - это полноценная копия, можно просто копировать файлы.
  • Надёжность: основан на rsync, который проверен временем.
  • Гибкость: поддержка локальных и удалённых (через SSH) источников.
  • Поддержка расписаний: daily/weekly/monthly и т.д.
  • Инкрементальные копии с минимальной нагрузкой
  • Открытый исходный код, легко настраивается.

Недостатки RSnapshot

  • Требует файловой системы с поддержкой hard links (ext4, XFS - да; FAT32, exFAT - нет).
  • Не подходит для очень больших файлов с частыми изменениями (например, активные базы данных без предварительного дампа - может нарушить целостность).
  • Нет встроенной проверки целостности (нужно доп. скрипты).
  • Нет шифрования на стороне хранилища (только при передаче)
  • Требует root или прав на чтение всех файлов (особенно при бэкапе /etc, /var и т.п.).

Установка RSnapshot

Ubuntu/Debian:

sudo apt update
sudo apt install rsnapshot

CentOS/RHEL:

sudo yum install epel-release
sudo yum install rsnapshot

Базовый конфигурационный файл 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

Критически важное правило: 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 - корневая директория для хранения бэкапов на локальном хранилище 1TB
  • no_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)
│
└── ... (другие уровни, если есть)

Дополнительные файлы конфигурации RSnapshot

Примерный файл /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

Тестирование конфигурации:

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

Базы данных MySQL/MariaDB - надёжно и без staging

БД лучше снимать отдельно, консистентно:

  1. 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.

  2. 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
    

    Быстро на чтение, легко проверить, но медленнее восстановление больших баз.

Интеграция:

  • в rsnapshot добавляют отдельный systemd-таймер/cron на блок БД;

Восстановить один файл

# в исходное место
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/

Восстановить "как было" на пустой диск/систему (из live/rescue)

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

  1. Регулярно проверяйте логи и целостность бэкапов
  2. Тестируйте восстановление на тестовой системе
  3. Мониторьте место на диске
  4. Используйте exclude для временных файлов
  5. Настройте оповещения о проблемах
  6. Храните конфиг в системе контроля версий

RSnapshot - отличное решение для надежного и эффективного резервного копирования с минимальными накладными расходами и простотой управления.