Используемые термины: rsync, Linux, CentOS.
Lsyncd позволяет отслеживать состояние каталога с помощью подсистемы ядра inotify, и при помощи утилиты синхронизации rsync, менять содержимое другого каталога, таким образом, приводя оба каталога к единому виду. Это может использоваться для зеркалирования кластерной системы или создания оперативного бэкапа (не путать с полноценной резервной копией).
В данной инструкции мы рассмотрим процесс установки и настройки Lsyncd на компьютер с Linux CentOS версий 8 и 7. Также мы настроим синхронизацию папок как на локальном компьютере, так и удаленных по сети.
Выполним установку lsyncd на CentOS, а также настроим сервис для синхронизации двух каталогов на локальном компьютере.
Выполняем команды:
yum install epel-release
yum install lsyncd
Разрешаем автозапуск сервиса:
systemctl enable lsyncd
Открываем конфигурационный файл:
vi /etc/lsyncd.conf
Приводим его к виду:
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»,}
* где:
* в данном примере мы синхронизируем два каталога на локальном компьютере. Таким же образом, можно синхронизировать данные и в подмонтированных каталогах, например, по nfs или cifs (smb).
Создадим два тестовых каталога:
mkdir /tmp/source
mkdir /tmp/target
Перезапускаем сервис lsyncd:
systemctl restart lsyncd
Пробуем создать тестовый файл к каталоге-источнике:
touch /tmp/source/testfile
Ждем 5-10 секунд. Проверяем содержимое каталога-цели:
ls /tmp/target/
Мы должны увидеть файл:
Сервис готов к работе.
Для корректной передачи данных по сети с помощью SSH, нужно настроить возможность беспарольного подключения, затем — сам Lsyncd. Рассмотрим оба процесса по очереди.
На компьютере, с которого будем передавать файлы (lsyncd) генерируем ключи:
ssh-keygen -t rsa
… на все запросы просто нажимаем Enter.
Переносим id_rsa.pub на целевой компьютер (куда будем передавать данные с помощью lsyncd):
scp /root/.ssh/id_rsa.pub [email protected]:/home/admins24/.ssh/authorized_keys
* если мы получим ошибку scp: /home/<user>/.ssh/authorized_keys: No such file or directory, необходимо на удаленном компьютере создать каталог .ssh в профиле пользователя, которому мы пытаемся передать ключ. Например, командами, mkdir /home/admins24/.ssh и chown admins24:admins24 /home/admins24/.ssh.* обратите внимание, что мы передаем созданный ключ в каталог пользователя admins24. Это значит, что мы будем подключаться к целевому компьютеру от этого пользователя. Важно, чтобы у последнего были подходящие права для редактирования файлов в целевой папке, в которую мы будем синхронизировать данные.
Пробуем подключиться к удаленному компьютеру:
ssh [email protected]
Мы должны подключиться по SSH без ввода пароля. В противном случае, на целевом компьютере (к которому у нас не получилось подключиться) открываем конфигурационный файл для ssh:
vi /etc/ssh/sshd_config
И приводим опцию AuthorizedKeysFile к следующему значению:
AuthorizedKeysFile .ssh/authorized_keys
Перезапускаем sshd:
systemctl restart sshd
Снова пробуем подключиться по SSH.
Добавляем блок настроек sync:
sync { default.rsyncssh, source = «/tmp/source», host = «[email protected]», targetdir = «/tmp/target», rsync = { _extra = { «-a» } }}
На целевом компьютере создаем каталог, куда будем синхронизировать данные:
И не забываем назначить ему владельца, от пользователя которого мы планируем подключиться по ssh:
chown admins24:admins24 /tmp/target
Также на целевом компьютере необходимо установить rsync.
а) на CentOS:
yum install rsync
б) на Ubuntu:
apt-get install rsync
После на компьютере источнике перезапускаем lsync:
Ждем 5-10 секунд и проверяем на целевом компьютере наличие файла:
Передача по сети работает.
Рассмотрим примеры использования некоторых настроек, которые могут показаться полезными.
Мы можем настроить исключение файлов по маске, которые не нужно передавать в другую директорию. Это делается с помощью опций exclude или excludeFrom в разделе sync, например:
sync { … exclude = { ‘*.bak’ , ‘*.tmp’ },}
sync { … excludeFrom=»/etc/lsyncd.exclude»,}
* в первом блоке мы исключим все файлы, которые заканчиваются на .bak или .tmp. Для второго мы будем использовать файл /etc/lsyncd.exclude, в котором перечислим исключения.
Для второго блока создаем файл с исключениями:
vi /etc/lsyncd.exclude
*.tmp*.baktestfile.txttest/
* в данном примере мы игнорируем файлы, заканчиваются на .bak или .tmp,а также файл testfile.txt и содержимое каталога test.
Стоит обратить внимание, что комментарии в конфигурационном файле ставятся с помощью двух дефисов, например:
sync { — протокол синхронизации default.rsyncssh, — источник данных source = «/tmp/source», — сервер назначения host = «[email protected]», — каталог назначения targetdir = «/tmp/target»,}
Отдельный порт для подключения по ssh мы можем указать в блоке sync, разделе ssh:
sync { default.rsyncssh, source = «/tmp/source», … ssh = { port = 2222 }}
* в этом примере мы указываем использовать порт 2222 для подключения по SSH.
При необходимости, мы можем установить некоторые значения для ограничения или обхода ограничений. Настройки задаются в блоке settings:
settings { … statusInterval = 5 maxDelays = 900, maxProcesses = 6,}
Мы можем задать права после синхронизации. Это настраивается в блоке sync, разделе rsync:
sync { … rsync = { … owner=true, chown=»nginx:nginx» chmod=»775″ perms=true }}
В процессе настройки и эксплуатации системы, мы можем столкнуться с различными проблемами. Опишем решение некоторых из них.
Данную ошибку мы можем увидеть в логе или статусе сервиса 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 status lsyncd
Данную ошибку можно увидеть в статусе сервиса. При этом, сам сервис завершает свою работу. Полный лог имеет, примерно, такой вид:
… 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 не установлена одноименная утилита.
Решение: для установки необходимого пакета выполняем подходящую команду.
На компьютере с lsync перезапускаем сервис:
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies