Rsync для синхронизации данных: настройка и примеры использования


Когда нужно передать данные с одного сервера на другой, важно, чтобы процесс был быстрым и безопасным. В этом поможет программа rsync, позволяющая синхронизировать файлы между машинами и передавать только измененные файлы.
Пользователю не придется каждый раз копировать весь объем данных заново. Это полезно в ситуациях, когда данные обновляются регулярно, но изменения в них минимальны. В статье разберем процесс установки, настройки, сценарии использования и примеры rsync.
Почему rsync?
Remote Synchronization (rsync) – позволяет синхронизировать только измененные файлы, выполнять передачу данных между серверами.
В чём преимущество у rsync?
Rsync имеет следующие преимущества, которые полезны при передаче данных между облачными серверами:
- Rsync синхронизирует только изменённые файлы и папки – реализация протокола RUP (remote update protocol), позволяет увеличить скорость передачи за счёт экономии времени не отправляя файлы и папки без изменений.
- Эффективная проверка checksum и fingerprint блоков не затрачивая много времени.
- Возможность отправки только изменённых данных.
- Возможность сохранения unix-атрибутов прав, групп и владельцев
- Возможность передавать данные безопасно через SSH.
- Настройка rsync сервера с правами доступа и аутентификацией.
В чём отличие rsync от SCP?
SCP - выполняет передачу данных с линейным чтением и записью, передавая данные через сеть.
Rsync - аналогично копирует файлы локально или через сеть Интернет, но использует специальный алгоритм delta-передачи и набор алгоритмов оптимизации, которые делают операцию передачи данных намного быстрее.
Как rsync определяет, какие данные передавать?
Идея заключается в том, что перед началом передачей данных определяем список файлов, которые уже есть и передаём данные серверу откуда будет загрузка, что у нас есть.
- Сервер назначения вызывает findBlocks для вычисления контрольных сумм и fingerprint блоков файлов, которые уже есть и отправляет block_info на сервер, откуда будет выполняться копирование.
- Сервер источник сравнивает список со своим, есть ли новые данные к передаче на основе – имени файлов, их checksum.
- Если есть новые данные, то происходит поиск новых блоков и подготавливается список данных к отправке – сжатие новых данных и измененных блоков.
- Сервер назначения получает новые данные и записывает новые и измененные данные.
Установка rsync
Для демонстрации работы Rsync создадим следующий демонстрационный стенд:
Две ВМ с ОС Ubuntu Server 24 и следующими характеристиками: 1 vCPU, 4 ГБ оперативной памяти и 32 ГБ дискового пространства. ВМ будут находиться в одной сети. На каждой ВМ будет установлен SSH для возможности удаленного подключения. Первая ВМ имеет IP адрес 192.168.100.5 и будет выступать источником данных для копирования. Второй ВМ назначен IP адрес 192.168.100.16 и на неё мы будем отправлять данные.

В нашем случае rsync уже установлен.
Если вы используете rsync на Linux, но хотите обеспечить совместимость, можно рассмотреть варианты использования rsync Windows, например через Cygwin или WSL.
Настройка rsync
Далее переходим к настройке. Сначала отредактируем файл /etc/default/rsync: sudo nano /etc/default/rsync

В нем нам надо найти параметр RSYNC_ENABLE и изменить его значение с false на true.
Сохраняем изменения и закрываем файл. Следующим шагом создадим файл конфигурации в директории /etc: sudo touch /etc/rsyncd.conf
Далее мы заполним его настройками, а пока он нужен для запуска службы.
Включаем службу rsync, добавляем её в автозагрузку и проверяем, что она работает. Для этого выполним соответственно следующие команды:
sudo systemctl start rsync
sudo systemctl enable rsync
sudo systemctl status rsync
В каких случаях появляется ошибка rsync error и rsync failed?
Ошибка rsync error может возникать по разным причинам, но чаще всего это связано с правами доступа, неправильной настройкой сервера, неправильным путем к файлам или недостаточным количеством места на сервере.
Ошибка сопровождается текстовым описанием и кодом, по которому можно определить проблему. Например, ошибка:
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1852)
сообщает, что копирование было выполнено не полностью и некоторые файлы не удалось передать.
«Rsync failed» это общее сообщение от скрипта или программы, которая запускала rsync, свидетельствующее о неудаче — команда завершилась неуспешно, но при этом без уточнений.
Сценарии использования rsync
Для демонстрации работы rsync реализуем следующие сценарии:
- Синхронизация локальных папок
- Синхронизация удаленных папок
- Передача резервной копии базы данных postgresql на удаленный сервер
Во втором сценарии будем синхронизировать папки по следующему сценарию:
- Выполним полное копирование данных с одного сервера на другой
- Выполним инкрементальное копирование: на второй сервер будут отправляться только те данные, которых на нем нет
- 1:1 будет копироваться полностью вся информация с первого сервера на другой, при чем на втором сервере будут удаляться те данные, которых нет на первом сервере.
Синхронизация локальных папок в rsync
В сценарии будем синхронизировать данные на одном сервере.
Откроем файл конфигурации sudo nano /etc/rsyncd.conf и добавим следующие строки:
pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsync.log [share] path = /rsync/share_folder hosts allow = localhost 192.168.100.16 hosts deny = * list = true uid = user01 gid = user01 read only = false
Мы указали следующие параметры:
- pid file — файл, в котором будет храниться номер процесса демона Rsync;
- lock file — файл блокировки для защиты от повторного запуска Rsync;
- log file — журнал сообщений, генерируемых демоном Rsync в процессе работы;
- path — путь до каталога, для которого выполняется синхронизация или копирование;
- hosts allow — хосты, которым явно разрешено подключаться к демону Rsync для передачи файлов. В нашем случае, это localhost и второй сервер
- hosts deny — хосты, которым явно запрещено подключаться к демону Rsync для передачи файлов (в примере выше со всех, кроме разрешенных);
- list — флаг разрешения/запрета чтения каталога;
- uid — пользователь, от имени которого будет выполняться синхронизация для конкретного ресурса;
- gid — группа, от имени которой будет выполняться синхронизация для конкретного ресурса;
- read only — флаг для защиты имеющихся данных от изменения или удаления;
В нашем случае в uid и gid мы указали пользователя, под которым мы работаем в системе. В целом, пользователь может быть любым, главное, чтобы не root.
Теперь создадим указанную в конфигурации директорию, которую будем копировать
sudo mkdir /rsync
sudo mkdir /rsync/share_folderПерезапустим службу
Sudo systemctl restart rsyncТеперь добавим в директорию несколько rsync файлов
sudo touch /rsync/share_folder/file1 sudo touch /rsync/share_folder/file2 sudo touch /rsync/share_folder/file3

И убедимся, что они в директории
ls /rsync/share_folder/
Теперь создадим локальную целевую директорию
mkdir dest_dir
И выполним копирование файлов из /rsync/shared_folder в /home/user01/dest_dir. Для этого выполним команду
rsync -av /rsync/share_folder/ /home/user01/dest_dir

Где:
- a (archive) – архивный режим: сохраняет права, временные метки, символические ссылки и т. д.
- v (verbose) - выводит подробную информацию о процессе копирования.
Проверим директорию dest_dir и убедимся, что файлы переданы:

Как видим, файлы передались и имеют права в соответствии с теми uid и gid, что мы указывали в конфигурационном файле.
Синхронизация удаленных папок в rsync
Теперь выполним копирование файлов на удаленный сервер. Для этого на ВМ rsyncVM02 создадим целевую директорию в домашней папке пользователя, через которого в последствии будем подключаться по SSH
mkdir dest_remote_dir
Теперь перейдем на первую ВМ и выполним копирование данных на удаленный сервер
rsync -avz /rsync/share_folder/ user01@192.168.100.16:dest_remote_folder/

Где к уже известным флагам –a и –v добавился новый: –z – флаг, отвечающий за сжатие данных при передаче.

Как мы видим, файлы успешно передались на удаленный сервер. Проверим директорию dest_remote_dir на rsyncVM02
Файлы находятся в ней. Значит, копирование прошло успешно. Теперь изменим содержимое файла file1 и выполним инкрементальное копирование.
Отредактируем file1 на rsyncvm01
sudo nano /rsync/share_folder/file1

И снова выполним копирование на удаленный сервер
rsync -avz /rsync/share_folder/ user01@192.168.100.16:dest_remote_folder/

И, как мы видим, передался только лишь file1, так как именно он был изменен. На rsyncvm02 проверим содержимое файла file1
cat dest_remote_folder/file1
![]()
И содержимое совпадает с исходным файлом.
Теперь удалим файл file1 на rsyncvm01 и выполним синхронизацию директорий
sudo rm /rsync/share_folder/file1
Синхронизацию выполним при помощи следующей команды:
rsync -av --delete /rsync/share_folder/ user01@192.168.100.16:dest_remote_folder/
Где мы убрали флаг –z, так как нам нет необходимости сжимать данные, а так же добавили флаг —delete, отвечающий за синхронизацию файлов и удаление тех, которых нет на сервере-источнике.
И как мы видим, был удален файл file1. Убедимся в этом, проверив список файлов в целевой директории на сервере rsyncvm02

Синхронизация резервных копий баз 1С удалённым сервером
Теперь реализуем следующий сценарий: на сервере rsyncvm01 установим СУБД PostgreSQL, в ней создадим базу данных, выполним резервное копирование данных и полученную копию отправим на удаленный сервер.
Этот же сценарий можно реализовать и базой данных 1С, которая размещена на СУБД PostgreSQL и работает под управлением Debian/Ubuntu. Для подобных задач удобно использовать копирование rsync как часть автоматизации процессов.
Создание резервной копии СУБД PostgreSQL
Выполним резервное копирование файлов нашей базы данных в testdb_backup.sql при помощи утилиты pg_dump и сохраним его в нашу директорию /rsync/share_folder
Перед этим дадим нашему рабочему пользователю право на запись в директорию
sudo chmod o+w /rsync/share_folder/
И теперь выполним бэкап базы данных
PGPASSWORD=XXXXXXXXXXXX pg_dump -h localhost -U test testdb > /rsync/share_folder/testdb_dump.sql
Синхронизация резервной копии СУБД PostgreSQL с удалённым сервером
Указываем папку, где находятся наши копии, далее указываем сервера и путь, куда будет загружать копии.
rsync -avz /rsync/share_folder/ user01@192.168.100.16:dest_remote_folder/

Как видим, rsync передал файл копии базы данных на удаленный сервер.
Автоматизация резервного копирования баз СУБД на удалённый сервер
Автоматизируем задачу резервного копирования и передачи файла копии на удаленный сервер и для этого создадим bash-скрипт под названием testdb_backup.sh в директории /etc/scripts
sudo mkdir /etc/scripts![]()
sudo nano /etc/scripts/testdb_backup.shВ файле скрипта напишем следующий код:
#!/bin/bash
pathB=/rsync/share_folder/
dbUser=test
database=testdb\
PGPASSWORD=XXXXXXXXXXX pg_dump -h localhost -U $dbUser $database > $pathB/testdb__$(date "+%Y-%m-%d").sql
rsync -avz /rsync/share_folder user01@192.168.100.16:dest_remote_folder/Этот код создает копию базы данных и передает её на удаленный сервер
Между серверами rsyncvm01 и rsyncvm02 настроим SSH авторизацию по ключу. Для этого на rsyncvm01 выполним команду ssh-keygen

Передадим ключ на rsyncvm02:
ssh-copy-id user01@192.168.100.16

Дадим файлу скрипта право на выполнение
sudo chmod +x /etc/scripts/testdb_backup.sh
И в завершении, настроим cron для автоматического выполнения скрипта: копии базы данных будут создаваться раз в сутки в час ночи
crontab -e
0 1 * * * /etc/scripts/testdb_backup.sh
В завершении хочется отметить, что rsync – это мощный инструмент для создания резервных копий. Он включает в себя множество дополнительных опций, будь то сжатие данных при передаче на удаленный сервер или сохранение прав доступа. Также можно передавать ссылки, рекурсивно директории, есть функционал поддержания актуальности резервной копии. В умелых руках он будет хорошим подспорьем сохранности и восстановления данных.
Если вы планируете регулярно синхронизировать данные между серверами или автоматизировать бэкапы, удобнее и безопаснее делать это в облаке. mClouds позволяет развернуть собственный облачный сервер с предустановленной Linux или Windows и уже через несколько минут начать использовать rsync без лишней настройки железа.
Виды и методы резервного копированияЧто такое резервное копирование и зачем оно нужно: разбираем ключевые методы, схемы ротации и способы хранения данных, чтобы защитить их от потерь.
12 февраля, 2025
Резервное копирование в облако: что нужно знать о клауд-бэкапахЛишних резервных копий не бывает. Ведь вам может понадобиться именно та копия, которую вы хотели сделать, но не сделали. Рассказываем о резервном копировании в облако.
19 сентября, 2024
DRaaS (Disaster Recovery): облачный сервис аварийного восстановления данныхСовременные компании генерируют и используют огромные объемы данных, от которых напрямую зависит их работа. Как эффективно справляться с аварийными ситуациями и обеспечивать бесперебойную работу IT-инфраструктуры — расскажем в статье.
31 августа, 2024