До основного вмісту

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, а загальний чек-лист перевірки сайту після переїзду — у статті перевірка після міграції.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці