20 октября 2021

🛠 Как использовать rsync для резервного копирования файлов ваших VDS

Телеграм @Andrey_Totshin
Рассмотрим кейс резервного копирования файлов между сервером Prod и сервером Backup. В качестве инструмента будем использовать популярную бесплатную утилиту rsync.
🛠 Как использовать rsync для резервного копирования файлов ваших VDS
Синхронизация, мощный инструмент для системных администраторов. Синхронизация состояния файлов между двумя или более серверами, одна из повседневных задач системных администраторов.

Утилита rsync позволяет производить синхронизацию директорий по ssh и поддерживает следующие методы:

  • Sync method (синхронизация только изменений указанной директории).
  • Snapshot (создание полной копии указанной директории).

В статье разберем оба метода, а также автоматизируем комплексный backup по расписанию.

Что нам понадобится:

  • Сервер с OS Ubuntu 20.04 LTS – Prod.
  • Сервер с OS Ubuntu 20.04 LTS – Backup.
Серверы для тестов предоставлены компанией Selectel.

Заходим по ssh на сервер Prod:

        ssh root@Prod-IP
    

Поскольку утилита rsync работает через ssh, необходимо сгенерировать ключ:

        ssh-keygen -t rsa -b 4096 -v

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA250q8TsT/X5pM+KE2n1Biz3Sre/p425I5wnRSI root@Gauss
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|             .   |
|          E o *  |
|        S ...B.+.|
|       . + *+.ooB|
|        + +oB=o=+|
|         o +*=+Oo|
|            +*OBX|
+----[SHA256]-----+


    

Затем копируем сгенерированный ключ на сервер Backup:

        ssh-copy-id root@Backup-IP


    

Копирование ключа делается один раз и позволяет не вводить пароль при соединении по SSH. Зайдем на бэкап-сервер с помощью ssh:

        ssh root@Backup-IP
    

Видим что мы зашли на сервер и у нас не спросили пароль :) Так как мы на сервере Backup сервере предлагаю создать директорию backup. Сюда будем сохранять резервные копии файлов с сервера Prod. Возвращаемся обратно на Prod сервер.

        cd /root | mkdir backup
exit

    

Метод Sync (инкрементальное сохранение изменений)

При таком методе сохраняются только изменения в целевой директории. Утилита rsync мониторит директорию и если произошли следующие события отправляет изменения на сервер Backup.
  • Если были добавлены новые файлы.
  • Если были произведены изменения в файлах контролируемой директории.
  • Если было удаление файлов в контролируемой директории.

На сервере Prod создадим директорию и в ней файлы, которые будет мониторить утилита rsync:

        cd var
mkdir www
cd www
touch 1.html index.html hello.html


    

Мы перешли в var и там создали директорию www с файлами 1.html, index.html, hello.html.

Почти готово :) Запускаем rsync в режиме синхронизации изменений:

        rsync -azvP --delete /var/www/ root@Backup-IP:/root/backup/

sending incremental file list
./
1.html
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=2/4)
hello.html
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=1/4)
index.html
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=0/4)

sent 222 bytes  received 76 bytes  198.67 bytes/sec

    

Видим что была отправка файлов на сервер Backup. Теперь внесем изменения. Удалим файл hello.html и создадим новый файл 2.html:

        rm -r hello.html
touch 2.html


    

Повторно запустим rsync:

        rsync -azvP --delete /var/www/ root@Backup-IP:/root/backup/




    
        sending incremental file list

deleting hello.html

./

2.html

              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/4)

sent 150 bytes  received 52 bytes  134.67 bytes/sec

total size is 0  speedup is 0.00


    

Видим что rsync удалил в папке backup файл hello.html и скопировал туда файл 2.html. Предлагаю создать исполняемый файл, в дальнейшем он нам понадобится для автоматизации бекапа:

        nano sync.sh


    
        #!/bin/sh

rsync -azvP --delete /var/www/ root@Backup-IP:/root/backup/


    

Теперь нет необходимости запоминать длинную команду rsync, а достаточно запустить sync.sh (не забудьте сделать его исполняемым с помощью команды chmod):

        sh sync.sh
    

Метод Snapshot (создание полной копии указанной директории)

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

  • Делаем инкрементный backup каждый день утром в 09:30.
  • Делаем полный backup (Snapshot) еженедельно в понедельник 10:30.

Snapshot кладем в предварительно созданную директорию snapshot на сервере Backup. Создаем snapshot.sh:

        nano snapshot.sh


    
        !/bin/sh

DATE=$(date +%Y-%m-%d-t-%H-%M-%S)

rsync -arvt -t /var/www/ root@5.188.118.203:/root/backup/snapshot/$DATE

    

Запускаем:

        sh snapshot.sh


    
        sending incremental file list
created directory /root/backup/snapshot/2021-09-01-t-16-44-29
./
1.html
2.html
index.html
snapshot.sh
sync.sh

sent 577 bytes  received 180 bytes  1,514.00 bytes/sec
total size is 213  speedup is 0.28


    

Из вывода результата исполнения snapshot.sh видим, что была сделана и отправлена полная копия сохраняемой директории в backup с именем текущей даты и времени.

Автоматизируем задачу копирования файлов

Автоматизируем наш backup. Мы не зря создавали исполняемые файлы sync.sh и snapshot.sh. Теперь нужно создать в планировщике Cron задание:

        crontab -e


    
        # Ежедневное копирование изменений в 09:30
30 9 * * * /root/sync.sh

# Еженедельное копирование полной копии в Понедельник 10:30
30 10 * * 1 /root/snapshot.sh


    

Готово! В планировщике два задания которые будут с помощью утилиты rsync копировать ежедневные изменении и раз в неделю делать полную копию.

***
Чтобы ускорить работу системы, выберите провайдера инфраструктуры, который наилучшим образом соответствует требованиям вашего ресурса: объем накопителя, процессор и количество ядер, объем оперативки и ежемесячного трафика, наличие резервного копирования, быстрая техническая поддержка. Мы тестировали серверы, любезно предоставленные компанией Selectel.

Для резервного копирования с одного рабочего сервера отдельная физическая машина может показаться избыточной, если проект не особенно крупный. Такая конфигурация скорее подойдет для нескольких серверов на проде (или одного, если он обслуживает большой проект). Selectel предлагает серверы, оснащенные 4-768 ГБ ОЗУ, 2-72 ядрами ЦП, а также с возможностью подключить графический ускоритель и выбрать в качестве сервера даже Raspberry Pi 4 (4/64 ГБ) и Mac mini для iOS-разработчиков.

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ