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
Современные компании генерируют и используют огромные объемы данных, от которых напрямую зависит их работа. Как эффективно справляться с аварийными ситуациями и обеспечивать бесперебойную работу IT-инфраструктуры — расскажем в статье.
31 августа, 2024