Установка и настройка сервиса Lsyncd на Linux
Используемые термины: rsync, Linux, CentOS, Ubuntu.
Lsyncd позволяет отслеживать состояние каталога с помощью подсистемы ядра inotify, и при помощи утилиты синхронизации rsync, менять содержимое другого каталога, таким образом, приводя оба каталога к единому виду. Это может использоваться для зеркалирования кластерной системы или создания оперативного бэкапа (не путать с полноценной резервной копией).
В данной инструкции нами будет рассмотрен процесс установки и настройки Lsyncd на компьютер с Linux CentOS версий 8 и 7, а также Ubuntu. Мы настроим синхронизацию папок как на локальном компьютере, так и удаленных по сети.
Установка и настройка тестовой синхронизации
Синхронизация по сети с использованием SSH
Примеры использования дополнительных настроек
Исключений
Использование комментарий
Указание порта SSH
Настройка ограничений
Установка прав
Работа в режиме кластера active-active
Возможные ошибки
Установка и тестовый запуск
Выполним установку lsyncd на Linux, а также настроим сервис для синхронизации двух каталогов на локальном компьютере.
Установка
В зависимости от типа операционной системы, наши действия будут отличаться.
а) RPM (Rocky Linux, CentOS):
yum install epel-release
yum install lsyncd
б) DEB (Debian, Ubuntu):
apt update
apt install lsyncd
mkdir /etc/lsyncd
Установка завершена.
Разрешаем автозапуск сервиса:
systemctl enable lsyncd
Настройка и запуск
Открываем конфигурационный файл.
а) Для CentOS:
vi /etc/lsyncd.conf
б) Для Ubuntu:
mkdir -p /etc/lsyncd
vi /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/target",
}
* где:
- settings — общие настройки.
- logfile — путь до файла логов.
- statusFile — файл, в который заносятся изменения, найденные с помощью inotify.
- statusInterval — интервал в секундах для обновления statusFile.
- insist — позволяет продолжить работу сервиса, даже если одна или несколько целевых директорий недоступны.
- nodaemon — отключаться или нет от вызывающей стороны. Проще говоря, если разрешить, то будет больше информации по его работе. Для боевого режима можно отключить.
- sync — настройка для синхронизации конкретного ресурса. Для каждого создается своя секция sync.
- default.rsync — должен использоваться протокол для синхронизации rsync.
- source — источник, откуда синхронизируем данные.
- target — куда синхронизируем.
* в данном примере мы синхронизируем два каталога на локальном компьютере. Таким же образом, можно синхронизировать данные и в подмонтированных каталогах, например, по nfs или cifs (smb).
Создадим два тестовых каталога:
mkdir /tmp/source
mkdir /tmp/target
Перезапускаем сервис lsyncd:
systemctl restart lsyncd
Пробуем создать тестовый файл к каталоге-источнике:
touch /tmp/source/testfile
Ждем 5-10 секунд. Проверяем содержимое каталога-цели:
ls /tmp/target/
Мы должны увидеть файл:
testfile
Сервис готов к работе.
Синхронизация по сети (SSH)
Для корректной передачи данных по сети с помощью SSH, нужно настроить возможность беспарольного подключения, затем — сам Lsyncd. Рассмотрим оба процесса по очереди.
SSH без пароля (по сертификату)
На компьютере, с которого будем передавать файлы (lsyncd) генерируем ключи:
ssh-keygen -t ed25519
... на все запросы просто нажимаем Enter.
Переносим id_rsa.pub на целевой компьютер (куда будем передавать данные с помощью lsyncd):
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.15
* обратите внимание, что мы передаем созданный ключ в каталог пользователя root. Это значит, что мы будем подключаться к целевому компьютеру от этого пользователя. Важно, чтобы у последнего были подходящие права для редактирования файлов в целевой папке, в которую мы будем синхронизировать данные.
Если порт для подключения по SSH отличается от стандартного, применяем команду с ключом -p:
ssh-copy-id -p 2222 -i /root/.ssh/id_ed25519.pub root@192.168.1.15
Пробуем подключиться к удаленному компьютеру:
ssh root@192.168.1.15
Мы должны подключиться по SSH без ввода пароля. В противном случае, на целевом компьютере (к которому у нас не получилось подключиться) открываем конфигурационный файл для ssh:
vi /etc/ssh/sshd_config
И приводим опцию AuthorizedKeysFile к следующему значению:
AuthorizedKeysFile .ssh/authorized_keys
Перезапускаем sshd:
systemctl restart sshd
Снова пробуем подключиться по SSH.
Настройка Lsyncd для синхронизации по сети
Открываем конфигурационный файл.
а) Для CentOS:
vi /etc/lsyncd.conf
б) Для Ubuntu:
vi /etc/lsyncd/lsyncd.conf.lua
Добавляем блок настроек sync:
sync {
default.rsyncssh,
source = "/tmp/source",
host = "root@192.168.1.15",
targetdir = "/tmp/target",
rsync = {
_extra = { "-a" }
}
}
* где:
- default.rsyncssh — в качестве протокола будем использовать rsync через ssh.
- source — указываем источник данных.
- host — удаленный компьютер, на который будет идти передача данных. До знака @ указывается пользователь, под которым будет идти подключение.
- targetdir — каталог на удаленном хосте, в который будет выполняться синхронизация.
- rsync, _extra — дополнительные ключи запуска rsync. В нашем примере запускаем в режиме архивирования.
На целевом компьютере создаем каталог, куда будем синхронизировать данные:
mkdir /tmp/target
И не забываем назначить ему владельца, от пользователя которого мы планируем подключиться по ssh:
chown root:root /tmp/target
Также на целевом компьютере необходимо установить rsync.
а) на CentOS:
yum install rsync
б) на Ubuntu:
apt install rsync
После на компьютере источнике перезапускаем lsync:
systemctl restart lsyncd
Ждем 5-10 секунд и проверяем на целевом компьютере наличие файла:
ls /tmp/target/
Мы должны увидеть файл:
testfile
Передача по сети работает.
Полезные опции
Рассмотрим примеры использования некоторых настроек, которые могут показаться полезными.
Исключения
Мы можем настроить исключение файлов по маске, которые не нужно передавать в другую директорию. Это делается с помощью опций exclude или excludeFrom в разделе sync, например:
sync {
...
exclude = { '*.bak' , '*.tmp' },
}
sync {
...
excludeFrom="/etc/lsyncd.exclude",
}
* в первом блоке мы исключим все файлы, которые заканчиваются на .bak или .tmp. Для второго мы будем использовать файл /etc/lsyncd.exclude, в котором перечислим исключения.
Для второго блока создаем файл с исключениями:
vi /etc/lsyncd.exclude
*.tmp
*.bak
testfile.txt
test/
* в данном примере мы игнорируем файлы, заканчиваются на .bak или .tmp,а также файл testfile.txt и содержимое каталога test.
Комментарии
Стоит обратить внимание, что комментарии в конфигурационном файле ставятся с помощью двух дефисов, например:
sync {
-- протокол синхронизации
default.rsyncssh,
-- источник данных
source = "/tmp/source",
-- сервер назначения
host = "root@192.168.1.15",
-- каталог назначения
targetdir = "/tmp/target",
}
Порт SSH
Отдельный порт для подключения по ssh мы можем указать в блоке sync, разделе ssh:
sync {
default.rsyncssh,
source = "/tmp/source",
...
ssh = {
port = 2222
}
}
* в этом примере мы указываем использовать порт 2222 для подключения по SSH.
Ограничения
При необходимости, мы можем установить некоторые значения для ограничения или обхода ограничений. Настройки задаются в блоке 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 — говорит, сохранять ли права.
Задержки при старте (кластер active-active)
При настройке нескольких нод, которые должны синхронизировать файлы друг на друга, может возникнуть проблема, когда одна из нод поднимается после выключения — она может удалить все файлы, которые успели создаться на другой ноде. То есть, при старте lsyncd, он считает, что информация на его комьпютере самая актуальная, и нужно привести ее в соответствие на других серверах.
Проблему решаем такими опциями:
sync {
...
delete = 'running',
--delay = 20,
rsync = {
...
update = true,
}
}
* где:
- delete — позволяет задать поведение, при каких условиях нужно удалять файлы, которых нет в источнике. Можно использовать следующие значения:
- true — удалять файлы всегда. Данное значение используется по умолчанию.
- false — никогда не удалять файлы.
- startup — удалять файлы только при старте lsyncd.
- running — удалять файлы только во время работы lsyncd.
- delay — задержка синхронизации в секундах. Пока не пройдет данное количество времени, синхронизация не начнется.
- rsync, update — пропускать файлы, которые существуют в месте назначения и имеют более новое время изменения, чем исходный файл.
Возможные ошибки
В процессе настройки и эксплуатации системы, мы можем столкнуться с различными проблемами. Опишем решение некоторых из них.
1. Consider increasing /proc/sys/fs/inotify/max_user_watches
Данную ошибку мы можем увидеть в логе или статусе сервиса lsyncd. При этом, сама служба останавливается с ошибкой.
Причина: для оптимизации нагрузки, ядро Linux не позволяет сильно нагружать подсистему inotify. Но если мы указываем каталог синхронизации с большим количеством файлов, это приведет к тому, что мы упремся в установленный лимит.
Решение: необходимо увеличить предел наблюдения за ядром inotify. Для этого создаем файл настройки ядра:
vi /etc/sysctl.d/10-max_user_watches.conf
fs.inotify.max_user_watches = 524288
Применяем настройки:
sysctl -p /etc/sysctl.d/10-max_user_watches.conf
Перезапускаем сервис:
systemctl restart lsyncd
И проверяем его состояние:
systemctl status lsyncd
2. bash: rsync: command not found
Данную ошибку можно увидеть в статусе сервиса. При этом, сам сервис завершает свою работу. Полный лог имеет, примерно, такой вид:
... lsyncd[20316]: bash: rsync: command not found
... lsyncd[20316]: rsync: connection unexpectedly closed (0 bytes received so far) [sender]
... lsyncd[20316]: rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.3]
Причина: на компьютере, с которым мы устанавливаем соединение по rsync не установлена одноименная утилита.
Решение: для установки необходимого пакета выполняем подходящую команду.
а) на CentOS:
yum install rsync
б) на Ubuntu:
apt install rsync
На компьютере с lsync перезапускаем сервис:
systemctl restart lsyncd