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

Автор оригинала: Jack Wallen
  • Перевод
  • Tutorial

Getty Images/iStockphoto

Проблему синхронизации каталогов на двух серверах с операционными системами семейства 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:



У нас получилось: 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 на обоих серверах. Убедившись, что синхронизация работает, вы можете использовать её в боевом режиме на продакшн-серверах.



На правах рекламы


VDSina всегда рада предложить надёжные серверы для любых задач. Вам доступен огромный выбор операционных систем для автоматической установки, есть возможность установить любую ОС с собственного образа, а также использовать высокоскоростную локальную сеть между серверами в пределах одной локации.

VDSina.ru хостинг серверов
Серверы в Москве и Амстердаме

Комментарии 6

    0

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

      0
      Мне одному показалось что rsync делает то же самое?
      А lsyncd еще и умеет это делать не по крону, а по событию работы с файлами…
        0

        rsync это делает в одну сторону. Если вы можете гарантировать что изменения всегда выполняются только в одном месте в один временной промежуток — да, можно и rsync.


        Если вы изменили файл a на host-a и файл b на host-b, то всё ещё можно обойтись rsync выполнив его на обоих хостах с флагом -u, но если вы начнёте ещё удалять/переименовывать файлы, или менять содержимое одного файла сразу на обоих хостах — то тут уже начнутся проблемы, которые как раз и призван решать unison, ибо он в теме и знает что где когда было в прошлый раз.

        0
        Существует проект Syncthing, кроссплатформенный с открытым исходным кодом. Синхронизирует даже когда хосты не видят друг другу напрямую в сети (например, оба за NATом) через промежуточные relay хосты. Трафик, разумеется, зашифрован.
          0
          Пробовал в прошлом году оба решения. Скорость синхронизации Syncthing оказалась в несколько раз медленнее. В итоге сварганил init-скрипт для freenas, чтобы unison работал в режиме демона и синхронизировал в режиме реального времени без задания планировщика.
            0
            Ну, как мне кажется, что-бы обойтись без крона, можно закостылить при помощи inotifywait А если используется systemd, так и вовсе штатными средствами systemd.path.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое