Sibilia octopress blog

notes on memory.

Синхронизация файлов с помощью Lsyncd и Unison

| Comments

Для быстрой синхронизации файлов между двумя серверами, когда изменения могут появиться на любом из них, прекрасно подходит связка из lsyncd и unison.

Lsyncd - это демон который слушает дерево каталогов и выполняет синхронизацию при событии (inotify или fsevents) на нём. Синхронизировать он может с помощью rsync или любым другим способом, который можно прописать у него в настройках в виде скрипта на Lua.

Unison позволяет синхронизировать файлы между серверами (или локально два различных каталога). В отличие от rsync он позволяет синхронизировать файлы одновременно в обе стороны. В качестве транспорта при синхронизации может быть использован ssh. Пример буду приводить для CentOS/RedHat, для .deb систем отличия в мелочах. Начнём с установки:

1
yum install lsyncd unison

Далее правим конфигурационный файл lsyncd: /etc/lsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
settings {
        logfile         = "/mnt/lsynced.lsync.log",
        statusFile      = "/mnt/lsynced.lsync.status",
        statusInterval  = 10,
        maxDelays       = 3,
}

runUnison = [[/usr/bin/unison -retry 5 -owner -group -batch /mnt/lsynced ssh://node2//mnt/lsynced]]

runbash = {
        onCreate = runUnison,
        onDelete = runUnison,
        onModify = runUnison,
        onMove = runUnison,
}

sync {
        runbash,
        maxProcesses = 1,
        delay = 3,
        source = "/mnt/lsynced",
}

На втором сервере меняем имя хоста в строке вызова unison. Проверить можно запустив lsyncd в режиме nodaemon (или без этой опции и читать логи):

1
lsyncd -nodaemon /etc/lsyncd.conf

Если всё отлично завершаем и переходим к настройке запуска lsyncd под corosync. Тут есть два способа: использовать lsb ресурс corosync или написать свой ресурс агент. Я рассмотрю первый вариант. Для второго у меня на github лежит ресурс агент, но я его ещё не до конца протестировал.

Corosync lsyncd LSB ресурс.

Нам понадобится скрипт lsyncd daemon: /etc/init.d/lsyncd. Он должен входить в пакет lsyncd начиная с версии 2.1. Учитывая один момент в нём:

1
2
3
4
5
LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf"

if [ -e /etc/sysconfig/lsyncd ]; then
  . /etc/sysconfig/lsyncd
fi

нам обязательно надо прописать опции запуска в файле /etc/sysconfig/lsyncd:

1
LSYNCD_OPTIONS="-log scarce /etc/lsyncd.conf"

Опция “-log scarce” уменьшает уровень логирования. Теперь осталось добавить lsyncd в конфигурацию corosync:

1
2
crm configure primitive lsyncd-node1 lsb:lsyncd op monitor interval="5" meta target-role="Started"
crm configure location loc-lsyncd-on-node1 lsyncd-node1 inf: node1

На втором сервере делаем соответствующие поправки. Вот в принципе и всё. Данное решение синхронизации хорошо себя показало на высоких нагрузках. Если есть вопросы, я постораюсь помочь.

Comments