Страница 1 из 1

Unison: настройка и автоматизация двусторонней синхронизации каталогов на двух серверах

Добавлено: 26 ноя 2023, 00:17
xor

Источник: https://habr.com/ru/companies/vdsina/articles/501426/

Unison: настройка и автоматизация двусторонней синхронизации каталогов на двух серверах
Проблему синхронизации каталогов на двух серверах с операционными системами семейства Linux на борту можно решить проще, если использовать специализированные инструменты. Давайте посмотрим, как это можно сделать с помощью Unison.

Возможно, у вас есть несколько серверов, и перед вами стоит задача синхронизировать определенные каталоги на этих серверах. Например, вам необходимо синхронизировать каталог /data на каждом из этих серверов, чтобы некое приложение имело доступ к актуальной информации. Или, может быть, вам просто нужно периодически выполнять синхронизированное резервное копирование данных одного сервера на другой.

Unison похож на утилиту синхронизации rsync, но в отличие от неё он поддерживает двустороннюю синхронизацию. То есть, он позволяет синхронизировать две копии файлов, обновляя каждую копию в зависимости от произведённых изменений.

При использовании Unison на серверах желательно иметь установленные пакеты типа openssh-server и ssh поскольку из соображений безопасности синхронизацию лучше всего проводить по протоколу SSH. Однако, если вы уверены в безопасности своей сети (например, сервер может использовать аутентификацию по ключу SSH без пароля), можете не заморачиваться.

Что ещё нужно для использования Unison
Я покажу весь процесс на примере двух серверов Ubuntu (оба 18.04). Вы можете установить и использовать Unison c другими дистрибутивами, но тогда вам нужно будет изменить команду установки, иначе Unison может быть установлен из стандартных репозиториев (разумеется, ваш пользователь должен иметь права sudo).

Я буду использовать вот такие сервера:

  • server1 — 192.168.1.6

  • server2 — 192.168.1.19

Как установить Unison
Первое, о чем нужно позаботиться, это установка Unison. Это должно быть сделано на обоих серверах. Зайдите на оба сервера и введите команду:

Код: Выделить всё

sudo apt-get install unison unison-all -y

Дождитесь окончания установки Unison и продолжайте.

Как сгенерировать и скопировать SSH-ключ
Сначала генерируем SSH-ключ только для server1. Для этого используем команду:

Код: Выделить всё

ssh-keygen -t rsa

Когда вас попросят ввести пароль — просто нажмите клавишу ENTER.
Когда ключ будет сгенерирован скопируйте его на server2 с помощью команды:

Код: Выделить всё

ssh-copy-id 192.168.1.19

Как только ключ будет скопирован, можете приступить непосредственно к делу.

Как использовать Unison
Давайте в тестовых целях создадим по одной директории на каждом сервере. Команда для server1:

Код: Выделить всё

sudo mkdir -p /data1

Для server2:

Код: Выделить всё

sudo mkdir -p /data2

Далее на обоих серверах необходимо изменить имя владельца созданного каталога, иначе Unison не сможет ничего записать туда. В качестве владельца укажите пользователя, который будет запускать команду Unison:

Код: Выделить всё

sudo chown -R $USER.$USER /data2

Сделайте то же самое для server1:

Код: Выделить всё

sudo chown -R $USER.$USER /data1

Положим несколько тестовых файлов в /data1:

Код: Выделить всё

touch /data1/{test1,test2,test3}

Синхронизируем наши каталоги с помощью следующей команды (запустив её на server1):

Код: Выделить всё

unison /data1 ssh://192.168.1.19//data2

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

Так что чай попьёте в следующий раз. А пока нажмите клавишу Enter, чтобы запустить процесс. После того, как вы это сделаете, вам будет предложено подтвердить синхронизацию каждого файла. По завершении введите ‘y’, чтобы продолжить.

Поскольку мы синхронизируем только три тестовых файла, это произойдёт очень быстро и вернёт вас в оболочку bash. Чтобы убедиться, что файлы синхронизированы, перейдите на server2 и введите команду:

Код: Выделить всё

ls /data2

Далее система сообщит о том, что в каталоге /data2 лежат наши файлы test1, test2 и test3:

puxvbivby-poqpuch07emsz7kui_01.jpeg

У нас получилось: Unison синхронизировал оба каталога.

Как запускать Unison без необходимости взаимодействия с пользователем
Я думаю, вы не хотите постоянно подтверждать синхронизацию каждого файла каталога каждый раз, когда вы запускаете Unison. Это особенно напрягает, когда вы синхронизируете каталоги с большим количеством файлов. Поэтому нужна автоматизация. Зайдите на server1 и введите команду:

Код: Выделить всё

nano ~/.unison/default.prf

Когда конфигурационный файл откроется для редактирования, добавьте в него две строки:

Код: Выделить всё

auto=true
batch=true

Затем сохраните и закройте файл.
Теперь Unison не будет вас тревожить по мелочам. Но это ещё не всё.

Как создать задание для планировщика Cron
Я думаю, вы вряд ли хотели бы запускать синхронизацию вручную, потому что можете где-то допустить ошибку или, например, не учесть изменение структуры каталогов на серверах. Чтобы настроить автоматизацию, вам нужно создать задание cron для server1.
Давайте создадим скрипт для запуска синхронизации:

Код: Выделить всё

sudo nano /usr/local/bin/unisonsync

В этот файл нужно добавить следующее:

Код: Выделить всё

#!/bin/bash/
unison /data1 ssh://192.168.1.19//data2

Далее нужно выдать скрипту права на исполнение:

Код: Выделить всё

sudo chmod ugo+x /usr/local/bin/unisonsync

Создайте задание для Cron с помощью команды:

Код: Выделить всё

crontab -e

После этого наберите:

Код: Выделить всё

*/5 * * * * /usr/local/bin/unisonsync &> /dev/null

Теперь синхронизация будет автоматически запускаться каждые 5 минут.

Я показал, что Unison позволяет легко синхронизировать каталоги на двух серверах Linux. Можете проверить это сами, добавив файлы в соответствующие тестовые каталоги /data1 и /data2 на обоих серверах. Убедившись, что синхронизация работает, вы можете использовать её в боевом режиме на продакшн-серверах.

Офтопик

Unison есть недостаток который может оказаться существенным в некоторых случаях — он не умеет синхронизировать POSIX ACL в частности и расширенные атрибуты вообще.

Офтопик

Существует проект Syncthing, кроссплатформенный с открытым исходным кодом. Синхронизирует даже когда хосты не видят друг другу напрямую в сети (например, оба за NATом) через промежуточные relay хосты. Трафик, разумеется, зашифрован.

Офтопик

что-бы обойтись без крона, можно закостылить при помощи inotifywait А если используется systemd, так и вовсе штатными средствами systemd.path.