Как создать бэкап с помощью rsync?

calendar_month 17 марта 2025 schedule 9 мин. чтения visibility 199 просмотров
person
Valebyte Team
Как создать бэкап с помощью rsync?
Как создать бэкап с помощью rsync?

Как создать бэкап с помощью rsync?

Для создания бэкапа с помощью rsync вам потребуется установить утилиту на сервер, если она еще не установлена, а затем использовать команду rsync с соответствующими опциями, указывающими исходные данные и целевое местоположение для их сохранения. Это может быть как локальный диск, так и удаленный сервер. Автоматизация процесса через cron-задачи и использование продвинутых функций, таких как инкрементальные бэкапы с жесткими ссылками, значительно повышает эффективность и надежность вашей стратегии резервного копирования.

Привет, коллеги! В мире VPS и хостинга, где каждый байт данных на счету, а простой может стоить репутации и денег, вопрос резервного копирования стоит как никогда остро. Мы в Valebyte знаем, насколько важно иметь надежный план восстановления. Сегодня поговорим об одном из самых мощных и гибких инструментов в арсенале любого сисадмина – rsync.

rsync – это не просто утилита для копирования файлов. Это швейцарский нож для синхронизации, который может эффективно переносить данные локально или по сети, минимизируя трафик за счет передачи только измененных частей файлов. Его алгоритм "delta-transfer" позволяет значительно экономить время и пропускную способность, что особенно актуально для больших объемов данных или удаленных серверов. В этой статье мы разберем rsync от азов до продвинутых сценариев, чтобы вы могли строить по-настоящему отказоустойчивые системы.

Почему именно rsync для бэкапов?

Illustration of data being backed up from a server to a secure location, representing data protection and backup.

Когда речь заходит о бэкапах, у нас есть множество вариантов: от простого cp или tar до специализированных решений вроде BorgBackup или Duplicity. Так почему же rsync часто является предпочтительным выбором?

  • Эффективность: Передает только изменения, а не весь файл целиком. Это критично для больших файлов и медленных соединений.
  • Гибкость: Работает как локально, так и удаленно (по SSH).
  • Сохранение атрибутов: Может сохранять права доступа, владельцев, временные метки, символические ссылки и другие метаданные.
  • Инкрементальные бэкапы: С помощью опции --link-dest можно создавать ротируемые инкрементальные бэкапы, которые занимают мало места, но при этом каждая копия выглядит как полный бэкап.
  • Простота: Базовые команды достаточно просты для освоения, а глубокая настройка доступна через множество опций.
  • Надежность: Широко используется и проверен временем.

Шаг 1: Установка rsync

Прежде чем начать, убедитесь, что rsync установлен на вашем сервере (и, если вы делаете удаленный бэкап, то и на целевом сервере). На большинстве современных дистрибутивов Linux он предустановлен. Если нет, установка займет всего минуту.

Для Debian/Ubuntu:

sudo apt update
sudo apt install rsync

Для CentOS/RHEL/Fedora:

sudo yum install rsync # или dnf install rsync для Fedora/RHEL 8+

После установки можете проверить версию:

Нужен надежный сервер для ваших rsync-бэкапов?

Защитите свои данные с помощью мощных и доступных VPS. Идеально подходит для регулярного резервного копирования. — from €4.49/mo.

Начать с VPS →
rsync --version

Шаг 2: Базовая команда rsync для бэкапа

Самая простая команда rsync для создания бэкапа выглядит так:

rsync -avz /path/to/source/ /path/to/destination/

Давайте разберем эти флаги, так как они являются основой для большинства операций с rsync:

  • -a (--archive): Это "режим архивирования". Он эквивалентен комбинации -rlptgoD.
    • -r (--recursive): Рекурсивное копирование директорий. Без него будут скопированы только файлы в исходной директории.
    • -l (--links): Копировать символические ссылки как символические ссылки.
    • -p (--perms): Сохранять права доступа.
    • -t (--times): Сохранять время модификации.
    • -g (--group): Сохранять группу.
    • -o (--owner): Сохранять владельца (требует прав root на целевой машине).
    • -D (--devices --specials): Сохранять файлы устройств и специальные файлы.
  • -v (--verbose): Выводить подробную информацию о процессе. Очень полезно для отладки и понимания, что происходит.
  • -z (--compress): Сжимать данные во время передачи. Это значительно экономит трафик, особенно при передаче текстовых файлов или файлов, которые хорошо сжимаются. Не забудьте, что сжатие происходит "на лету" и требует ресурсов CPU.

Важный нюанс со слэшем: Обратите внимание на слэш в конце исходного пути (/path/to/source/).

  • Если вы используете /path/to/source/ (со слэшем), rsync скопирует содержимое директории source в /path/to/destination/.
  • Если вы используете /path/to/source (без слэша), rsync скопирует саму директорию source (вместе с её содержимым) внутрь /path/to/destination/, создав /path/to/destination/source/.

Пример локального бэкапа:

Допустим, нам нужно забэкапить директорию /var/www/mywebsite в /mnt/backups/daily/:

sudo rsync -avz /var/www/mywebsite/ /mnt/backups/daily/mywebsite_$(date +%Y%m%d)/

Здесь $(date +%Y%m%d) добавит к имени директории текущую дату, создавая уникальный каталог для каждого бэкапа. Это полезно для создания простых ротируемых бэкапов, но не очень эффективно по месту.

Шаг 3: Удаленный бэкап по SSH

Одна из сильных сторон rsync – его способность работать по SSH. Синтаксис немного меняется:

rsync -avz -e "ssh -p 22" /path/to/source/ user@remote_host:/path/to/destination/
  • -e "ssh -p 22": Указывает rsync использовать SSH для соединения. Вы можете указать нестандартный порт (например, -p 2222) или другие опции SSH.
  • user@remote_host:/path/to/destination/: Стандартный синтаксис SSH для удаленного пути.

Для автоматизации удаленных бэкапов настоятельно рекомендуем использовать SSH-ключи вместо паролей. Это безопаснее и позволяет запускать бэкапы без интерактивного ввода.

ssh-keygen -t rsa -b 4096
ssh-copy-id user@remote_host # скопирует ваш публичный ключ на удаленный хост

Шаг 4: Продвинутые стратегии бэкапа с rsync

Теперь давайте перейдем к более интересным и эффективным методам бэкапа.

Инкрементальные бэкапы с жесткими ссылками (--link-dest)

Это одна из killer-фич rsync. Она позволяет создавать последовательность полных бэкапов, которые на самом деле занимают место только для измененных файлов. Работает это так: rsync создает новые файлы только для тех данных, которые изменились с момента последнего бэкапа. Для всех неизмененных файлов он создает жесткие ссылки на их копии в предыдущем бэкапе. В итоге каждый бэкап выглядит как полный, но потребляет место только для дельты.

# Пример для ежедневного бэкапа с ротацией
# Создаем структуру:
# /mnt/backups/latest/ -> символическая ссылка на последний полный бэкап
# /mnt/backups/2023-10-26/
# /mnt/backups/2023-10-25/
# ...

# 1. Определяем пути
SOURCE="/var/www/mywebsite/"
BACKUP_ROOT="/mnt/backups/"
CURRENT_DATE=$(date +%Y-%m-%d)
LATEST_BACKUP="${BACKUP_ROOT}latest" # Символическая ссылка на предыдущий бэкап
TARGET_DIR="${BACKUP_ROOT}${CURRENT_DATE}/"

# 2. Создаем целевую директорию, если ее нет
mkdir -p "${TARGET_DIR}"

# 3. Запускаем rsync
# --delete: удаляет файлы в TARGET_DIR, которых нет в SOURCE (зеркалирование)
# --link-dest: если LATEST_BACKUP существует, rsync создает жесткие ссылки на неизмененные файлы
#               из LATEST_BACKUP вместо их повторного копирования.
if [ -d "${LATEST_BACKUP}" ]; then
    rsync -avz --delete --link-dest="${LATEST_BACKUP}" "${SOURCE}" "${TARGET_DIR}"
else
    # Первый бэкап, без --link-dest
    rsync -avz --delete "${SOURCE}" "${TARGET_DIR}"
fi

# 4. Обновляем символическую ссылку на последний бэкап
rm -f "${LATEST_BACKUP}"
ln -s "${TARGET_DIR}" "${LATEST_BACKUP}"

echo "Бэкап успешно создан в ${TARGET_DIR}"

Этот скрипт создает ежедневные бэкапы, где каждый новый бэкап жестко связан с предыдущим. Удаление старых бэкапов безопасно: файлы, на которые есть ссылки из других бэкапов, не будут удалены с диска, пока на них существуют ссылки. Это очень мощный инструмент для создания ротируемых бэкапов с минимальным расходом места.

Исключение файлов и директорий (--exclude/--exclude-from)

Часто бывают файлы или директории, которые не нужно бэкапить (логи, кеши, временные файлы, директории с загрузками). Для этого используйте --exclude:

rsync -avz --exclude 'cache/*' --exclude 'logs/*.log' /path/to/source/ /path/to/destination/

Для большого количества исключений лучше использовать файл:

# exclude-list.txt
cache/
logs/*.log
tmp/
*.bak

rsync -avz --exclude-from=exclude-list.txt /path/to/source/ /path/to/destination/

Другие полезные флаги:

  • --progress: Показывает прогресс передачи для каждого файла. Полезно для больших файлов или медленных соединений.
  • --stats: Выводит статистику после завершения.
  • --dry-run (-n): Очень, очень важный флаг! Показывает, что rsync будет делать, без фактического выполнения изменений. Всегда используйте его перед первым запуском новой команды rsync, особенно с --delete.
  • --delete: Удаляет файлы в целевой директории, которых нет в исходной. Будьте предельно осторожны! Используйте только если вы хотите сделать точное зеркало.
  • --numeric-ids: Важно при копировании между разными системами, где UID/GID могут не совпадать. Гарантирует, что числовые идентификаторы владельцев и групп сохраняются, а не пытаются быть сопоставлены по именам.
  • --chown=user:group, --chmod=D755,F644: Позволяет изменить владельца/права доступа для скопированных файлов/директорий на целевой машине.
  • --bwlimit=KBPS: Ограничивает пропускную способность в килобайтах в секунду. Полезно, чтобы бэкап не "забивал" весь канал.

Шаг 5: Автоматизация с помощью Cron

Ручной запуск бэкапов – путь к проблемам. Используйте Cron для автоматизации. Лучше всего создать отдельный скрипт для rsync, а затем вызывать его из Cron.

Пример скрипта бэкапа (/usr/local/bin/backup_mywebsite.sh):

#!/bin/bash

# --- Конфигурация ---
SOURCE_DIR="/var/www/mywebsite/"
BACKUP_BASE_DIR="/mnt/backups/mywebsite/"
LOG_FILE="/var/log/backup_mywebsite.log"
DATE_FORMAT=$(date +%Y-%m-%d_%H-%M-%S)
CURRENT_BACKUP_DIR="${BACKUP_BASE_DIR}${DATE_FORMAT}"
LATEST_LINK="${BACKUP_BASE_DIR}latest"
EXCLUDE_FILE="/etc/rsync_exclude_mywebsite.txt" # Список исключений

# --- Создание лога и директории ---
mkdir -p "${CURRENT_BACKUP_DIR}" || { echo "Не удалось создать директорию бэкапа: ${CURRENT_BACKUP_DIR}" | tee -a "${LOG_FILE}"; exit 1; }
echo "--- Запуск бэкапа: ${DATE_FORMAT} ---" | tee -a "${LOG_FILE}"

# --- rsync команда ---
RSYNC_CMD="rsync -avz --delete --stats --progress --numeric-ids"

# Добавляем --link-dest, если существует предыдущий бэкап
if [ -L "${LATEST_LINK}" ] && [ -d "$(readlink -f ${LATEST_LINK})" ]; then
    RSYNC_CMD="${RSYNC_CMD} --link-dest=$(readlink -f ${LATEST_LINK})"
    echo "Используется --link-dest с: $(readlink -f ${LATEST_LINK})" | tee -a "${LOG_FILE}"
fi

# Добавляем исключения
if [ -f "${EXCLUDE_FILE}" ]; then
    RSYNC_CMD="${RSYNC_CMD} --exclude-from=${EXCLUDE_FILE}"
    echo "Используются исключения из: ${EXCLUDE_FILE}" | tee -a "${LOG_FILE}"
fi

# Выполняем rsync
${RSYNC_CMD} "${SOURCE_DIR}" "${CURRENT_BACKUP_DIR}" 2>&1 | tee -a "${LOG_FILE}"
RSYNC_EXIT_CODE=${PIPESTATUS[0]} # Получаем код выхода rsync

if [ ${RSYNC_EXIT_CODE} -eq 0 ]; then
    echo "Бэкап успешно завершен в ${CURRENT_BACKUP_DIR}" | tee -a "${LOG_FILE}"
    # Обновляем символическую ссылку
    rm -f "${LATEST_LINK}"
    ln -s "${CURRENT_BACKUP_DIR}" "${LATEST_LINK}"
else
    echo "Ошибка rsync. Код выхода: ${RSYNC_EXIT_CODE}" | tee -a "${LOG_FILE}"
    # Отправка уведомления об ошибке, если нужно
    # mail -s "Ошибка бэкапа mywebsite" [email protected] < "${LOG_FILE}"
fi

echo "--- Завершение бэкапа: $(date +%Y-%m-%d_%H-%M-%S) ---" | tee -a "${LOG_FILE}"

Сделайте скрипт исполняемым: sudo chmod +x /usr/local/bin/backup_mywebsite.sh

Настройка Cron-задачи:

Откройте таблицу Cron для пользователя root (или пользователя, от имени которого должен запускаться бэкап):

sudo crontab -e

Добавьте строку для ежедневного запуска, например, в 03:00 утра:

0 3 * * * /usr/local/bin/backup_mywebsite.sh >/dev/null 2>&1

>/dev/null 2>&1 перенаправляет весь вывод скрипта в никуда. Если вы хотите получать письма с выводом скрипта (что очень полезно для мониторинга), уберите эту часть или перенаправьте вывод в файл.

Важно: Убедитесь, что пользователь, от имени которого запускается cron-задача, имеет необходимые права на чтение исходных данных и запись в целевую директорию бэкапов.

Шаг 6: Тестирование и верификация

Создание бэкапов бессмысленно, если вы не можете их восстановить или если они повреждены. Всегда тестируйте свой процесс восстановления!

  • --dry-run: Как уже упоминалось, используйте его перед каждым "боевым" запуском новой команды rsync.
  • Проверка целостности: Периодически восстанавливайте часть данных на тестовой машине и проверяйте их работоспособность. Для простой проверки можно использовать diff -qr /path/to/source /path/to/backup, чтобы убедиться, что файлы идентичны.
  • Мониторинг логов: Регулярно проверяйте лог-файл вашего скрипта бэкапа на предмет ошибок.
  • Уведомления: Настройте отправку email-уведомлений в случае сбоя бэкапа.

Выводы

rsync – это невероятно мощный и универсальный инструмент для решения задач резервного копирования и синхронизации. От простых локальных копий до сложных ротируемых инкрементальных бэкапов по SSH, он предоставляет гибкость и эффективность, необходимые в современной инфраструктуре. Освоив его основные опции и продвинутые функции, такие как --link-dest, вы сможете построить надежную и экономичную систему резервного копирования, которая станет вашим спасательным кругом в случае непредвиденных обстоятельств.

Помните: лучший бэкап – это тот, который вы сможете восстановить. Всегда тестируйте свои бэкапы, автоматизируйте процесс и не забывайте про мониторинг. Безопасность ваших данных – это не просто техническая задача, это залог спокойствия и непрерывности работы вашего проекта. Удачи в ваших бэкап-стратегиях!

Масштабируйте свои бэкапы с гибкими облачными инстансами

Для еще большей гибкости и масштабируемости рассмотрите наши облачные инстансы. Идеально для растущих потребностей в хранении.

Исследовать облако →

Share this post:

support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.