lsyncd

Lsyncd

Официальная страница справочного руководства

Установка и настройка сервиса Lsyncd на Ubuntu 22.04

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

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

# Rocky Linux, CentOS
yum install epel-release
 
# Debian, Ubuntu
apt install lsyncd
mkdir /etc/lsyncd

Разрешаем автозапуск сервиса:

systemctl enable lsyncd

Примеры с конфигурационными файлами, можно найти по адресу /usr/share/doc/lsyncd/examples/

Открываем конфигурационный файл:

# Для CentOS:
/etc/lsyncd.conf
 
# Для Ubuntu:
/etc/lsyncd/lsyncd.conf.lua

И приводим его к виду:

settings {
    logfile = "/var/log/lsyncd.log",
    statusFile = "/var/log/lsyncd.stat",
    statusInterval = 5,
    insist = true,
    nodaemon = false,
}
 
sync {
    default.rsync,
    source="/tmp/source",
    target="/tmp/destination",
}

Где:

  • settings – общие настройки.
    • logfile – путь до файла логов.
    • statusFile – файл, в который заносятся изменения, найденные с помощью inotify.
    • statusInterval – интервал в секундах для обновления statusFile.
    • insist – позволяет продолжить работу сервиса, даже если одна или несколько целевых директорий недоступны.
    • nodaemon – отключаться или нет от вызывающей стороны. Проще говоря, если разрешить, то будет больше информации по его работе. Для боевого режима можно отключить.
  • sync – настройка для синхронизации конкретного ресурса. Для каждого создается своя секция sync.
    • default.rsync – должен использоваться протокол для синхронизации rsync.
    • source – источник, откуда синхронизируем данные.
    • target – куда синхронизируем.

Создадим две подопытные директории:

mkdir /tmp/{source,destination}

И перезапускаем демон:

systemctl restart lsyncd

Создадим файлы в директории источнике /tmp/source, и смотрим как они появляются в /tmp/estination.

В случае, если нужно синхронизировать несколько разных каталогов, конфиг будет выглядеть следующим образом:

sync {
   default.rsync,
   source = "/source",
   target = "/destination",
   delay  = 10,
}
 
sync {
   default.rsync,
   source = "/source2",
   target = "/destination2",
   delay  = 10,
}
 
sync {
   default.rsync,
   source = "/source3",
   target = "/destination3",
   delay  = 10,
}

Если требуется исключить какие-либо файлы из синхронизации, тогда добавляем директиву exclude:

sync {
    default.direct,
    source = "/source",
    target = "/destination1",
    delay = 10,
    exclude = { 'file*' , '*tmp' }
}

Для корректной передачи данных по сети с помощью SSH, нужно настроить возможность беспарольного подключения, затем – сам Lsyncd. Рассмотрим оба процесса по очереди.

На хосте, с которого будем передавать файлы (lsyncd) генерируем ключи:

ssh-keygen -t rsa

И переносим их на целевой хост:

ssh-copy-id username@hostname

И пробуем подключится без пароля.

Снова редактируем конфиг /etc/lsyncd/lsyncd.conf.lua. Приведем блок sync к следующему виду:

sync {
    default.rsyncssh,
    source = "/home/username/source/",
    host = "username@hostname",
    targetdir = "/home/vs/destination/",
    rsync = {
      archive  = true,
      compress = true,
      _extra = {"--omit-dir-times","-e ssh -i /home/username/.ssh/id_rsa"}
    }
}

Где:

  • default.rsyncssh – в качестве протокола будем использовать rsync через ssh.
  • source – указываем источник данных.
  • host – удаленный хост, на который будет идти передача данных.
  • targetdir – каталог на удаленном хосте, в который будет выполняться синхронизация.
  • rsync, _extra – дополнительные ключи запуска rsync. В данном примере запускаем в режиме архивирования.

На целевом компьютере создаем каталог, куда будем синхронизировать данные:

mkdir /tmp/destination

И не забываем, назначить созданной директории владельца, от пользователя которого мы планируем подключиться по ssh:

chown username. /tmp/target

Также, на целевом хосте, должен быть установлен rsync.

Перезапускаем демон, и проверяем удаленную директорию:

systemctl restart lsyncd

Проверить синхронизацию в ручном режиме можно командой:

lsyncd -log Exac -rsync /home/username/source/ username@hostname:/home/username/destination

Можно настроить исключение файлов по маске, которые не нужно передавать в другую директорию. Это делается с помощью директив exclude или excludeFrom в разделе sync, например:

sync {
    ...
    exclude = { '*.bak' , '*.tmp' },
}
 
sync {
    ...
    excludeFrom="/etc/lsyncd.exclude",
}

В первом блоке мы исключим все файлы, которые заканчиваются на .bak или .tmp. Для второго мы будем использовать файл /etc/lsyncd.exclude, в котором перечислим исключения.

/etc/lsyncd.exclude
*.tmp
*.bak
testfile.txt
test/

Стоит обратить внимание, что комментарии в конфигурационном файле ставятся с помощью двух дефисов, например:

sync {
    -- протокол синхронизации
    default.rsyncssh,
    -- источник данных
    source = "/tmp/source",
    -- сервер назначения
    host = "username@host_ip",
    -- каталог назначения
    targetdir = "/tmp/target",
}

Нестандартный порт для подключения по ssh мы можем указать в блоке sync, разделе ssh:

sync {
    default.rsyncssh,
    source = "/home/username/source",
    ...
    ssh = {
        port = 2222
    }
}

При необходимости, можно установить некоторые значения для ограничения или обхода ограничений. Настройки задаются в блоке settings:

settings {
    ...
    statusInterval = 5
    maxDelays = 900,
    maxProcesses = 6,
}

где:

  • statusInterval – как говорилось выше, задает интервал обновления статус-файла в секундах. Чем ниже значение, тем быстрее файлы попадают в очередь для синхронизации.
  • maxDelays – задает количество файлов в очереди, при достижении которого задачи синхронизации будут запускаться ниже таймера задержки.
  • maxProcesses – максимальное количество процессов, которое сможет запустить lsync.

Есть возможность, задать права после синхронизации. Это настраивается в блоке sync, разделе rsync:

sync {
    ...
    rsync = {
        ...
        owner=true,
        chown="nginx:nginx"
        chmod="775"
        perms=true
    }
}

Где:

  • owner – указывает, сохранять ли владельца файла.
  • chown – задает конкретного владельца и группу.
  • chmod – задает права на синхронизированные файлы.
  • perms – указывает, сохранять ли права.

Мы можем использовать директиву binary с абсолютным путем к скрипту внутри функции sync

[...]
sync {
   default.rsync,
   source = "/source",
   target = "/destination_1",
   delay  = 10,
   rsync = {
        binary = "/usr/local/sbin/target1_status.sh"
   }
}

Создадим скрипт, который будет передавать сообщение: Completed sync in destination_1, во временный файл /tmp/file после завершения синхронизации между указанным источником и целью. Это можно использовать для проверки статуса завершения синхронизации каталогов:

target1_status.sh
#!/bin/bash
 
/usr/bin/rsync "$@"
result=$?
(
  if [ $result -eq 0 ]; then
     echo "`date`: Completed sync in target1" >> /tmp/file
  fi
) >/dev/null 2>/dev/null </dev/null
 
exit $result

По умолчанию Lsyncd удаляет файлы на цели, которых нет на источнике, поскольку это является фундаментальной частью идеи синхронизации цели с источником. Однако, некоторым пользователям по разным причинам такой подход не устраивал. Поэтому все реализации по умолчанию принимают delete в качестве дополнительного параметра.

Допустимые значения delete:

  • delete = true – По умолчанию. Lsyncd будет удалять на цели все, чего нет в источнике. При запуске и во время нормальной работы все, что удаляется.
  • delete = false – Lsyncd не будет удалять никаких файлов на целевой машине. Ни при запуске, ни при нормальной работе. (Хотя перезапись возможна)
  • delete = startup – Lsyncd будет удалять файлы на цели при запуске, но не при нормальной работе.
  • delete = running – Lsyncd не будет удалять файлы на цели при запуске, но будет удалять те, которые удаляются во время нормальной работы.
[...]
sync {
    default.direct,
    source = "/source",
    target = "/destination_1",
    delay = 10,
    delete = false
}
  • lsyncd.txt
  • Последнее изменение: 2022/10/11 11:06
  • admin