К основному содержимому

rsync: синхронизация серверов и резервное копирование

Миграция · 01.02.2025 · 4 мин чтения
Иллюстрация к статье «rsync: синхронизация серверов и резервное копирование»

Что такое rsync

rsync — утилита для эффективной синхронизации файлов между серверами. Передаёт только изменившиеся части файлов, что делает её идеальной для инкрементальных бэкапов и для переноса файлов сайта между хостингами без лишнего расхода трафика.

💡 rsync передаёт только дельту (изменения) между файлами, а не весь файл целиком — это экономит трафик на 90% при бэкапах больших сайтов.

Порядок переноса файлов сайта без простоя

  1. Сделайте первую полную синхронизацию файлов на новый сервер, пока старый сайт продолжает работать.
  2. Повторите синхронизацию ещё раз непосредственно перед переключением — она скопирует только файлы, изменившиеся с первого раза.
  3. Проверьте новый сервер через файл hosts, не трогая DNS домена.
  4. Переключите домен и сразу же запустите финальный rsync с флагом --delete, чтобы убрать файлы, удалённые на старом сервере за время переезда.
  5. Держите старый сервер доступным ещё несколько дней на случай отката.

Реальное время простоя при таком порядке — только на переключение DNS или веб-сервера, обычно от одной до пяти минут, а не часы на копирование всех файлов.

Основные ключи rsync

КлючОписание
-aАрхивный режим (рекурсия + права + метаданные)
-vVerbose — подробный вывод
-zСжатие при передаче
--deleteУдалять файлы на приёмнике, которых нет на источнике
--excludeИсключить файлы/папки
--dry-runТестовый прогон без реальных изменений
--link-destЖёсткие ссылки для инкрементальных бэкапов

Базовая синхронизация между серверами

# Синхронизация папки на удалённый сервер
rsync -avz --delete   /var/www/mysite/   user@backup-server:/backups/mysite/

# С исключениями
rsync -avz --delete   --exclude='wp-content/cache/'   --exclude='*.log'   /var/www/mysite/   user@backup-server:/backups/mysite/

Проверка результата без реальной передачи

Перед первым запуском на реальных данных всегда прогоняйте команду с флагом --dry-run — rsync покажет список файлов, которые будут скопированы или удалены, но ничего не тронет на диске:

rsync -avz --delete --dry-run   /var/www/mysite/   user@backup-server:/backups/mysite/
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H%M)
DEST=/backups/mysite
LATEST=$DEST/latest

rsync -avz --delete   --link-dest=$LATEST   /var/www/mysite/   $DEST/$DATE/

# Обновляем ссылку на последний бэкап
rm -f $LATEST
ln -s $DEST/$DATE $LATEST

--link-dest создаёт жёсткие ссылки на неизменившиеся файлы вместо их копирования — каждый снапшот выглядит как полная копия, но реально занимает место только за изменившиеся файлы.

Сравнение способов переноса файлов через rsync

СценарийКомандаОсобенность
Разовый перенос всех файловrsync -avz источник назначениебез удаления на приёмнике
Зеркалирование (полное совпадение)rsync -avz --delete источник назначениеудаляет лишнее на приёмнике
Ежедневный бэкап с историейrsync -avz --link-dest=предыдущийэкономит место на диске

Типичные ошибки

СообщениеПричина и решение
rsync: connection unexpectedly closedОборвалось SSH-соединение или не хватило памяти на удалённом сервере — повторите с флагом --partial для докачки
Permission denied (publickey)SSH-ключ не добавлен на удалённый сервер — скопируйте его через ssh-copy-id
rsync error: some files/attrs were not transferredНе хватает прав на изменение владельца файлов — запустите с sudo на обеих сторонах или уберите -o -g из архивного режима

Откат при проблемах

  1. Не удаляйте файлы на старом сервере до подтверждения, что новый работает штатно хотя бы сутки.
  2. Если после переключения выявились пропавшие файлы, запустите обратную синхронизацию со старого сервера на новый, без --delete.
  3. Разберитесь с причиной несоответствия (обычно — исключения в --exclude, которые задели нужные файлы) и повторите перенос.

Когда rsync не подходит

--delete удаляет файлы на приёмнике без предупреждения. Всегда используйте --dry-run первый раз. Для баз данных rsync копирует файл СУБД «как есть» и может передать его в несогласованном состоянии, если сервер базы работает во время копирования — для баз нужен mysqldump или pg_dump, а не rsync файлов данных.

Автоматизация через cron

# Ежедневный бэкап в 3 ночи
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Проверка результата

  • Сравните число файлов: find /var/www/mysite | wc -l на источнике и приёмнике должно совпадать.
  • Проверьте контрольную сумму нескольких ключевых файлов: md5sum на обеих сторонах.
  • Откройте сайт через подмену hosts и убедитесь, что все статические файлы загружаются без 404.

Перенос базы данных, который нужно синхронизировать вместе с файлами, описан в статье перенос базы данных MySQL, а общий чек-лист проверки сайта после переезда — в статье проверка после миграции.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке