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

Thank you for reading this post, don't forget to subscribe!

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

Установка и тестовый запуск

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

Установка

Выпол­ня­ем команды:

yum install epel-release

yum install lsyncd

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

systemctl enable lsyncd

Настройка и запуск

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

vi /etc/lsyncd.conf

При­во­дим его к виду:

[codesyntax lang="php"]

[/codesyntax]

* где:

  • 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 rsa

… на все запро­сы про­сто нажи­ма­ем Enter.

Пере­но­сим id_rsa.pub на целе­вой ком­пью­тер (куда будем пере­да­вать дан­ные с помо­щью lsyncd):

scp /root/.ssh/id_rsa.pub mid@192.168.1.15:/home/mid/.ssh/authorized_keys

* если мы полу­чим ошиб­ку scp: /home/<user>/.ssh/authorized_keys: No such file or directory, необ­хо­ди­мо на уда­лен­ном ком­пью­те­ре создать ката­лог .ssh в про­фи­ле поль­зо­ва­те­ля, кото­ро­му мы пыта­ем­ся пере­дать ключ. Напри­мер, коман­да­ми, mkdir /home/mid/.ssh и chown mid:mid /home/mid/.ssh.
* обра­ти­те вни­ма­ние, что мы пере­да­ем создан­ный ключ в ката­лог поль­зо­ва­те­ля mid. Это зна­чит, что мы будем под­клю­чать­ся к целе­во­му ком­пью­те­ру от это­го поль­зо­ва­те­ля. Важ­но, что­бы у послед­не­го были под­хо­дя­щие пра­ва для редак­ти­ро­ва­ния фай­лов в целе­вой пап­ке, в кото­рую мы будем син­хро­ни­зи­ро­вать данные.

Про­бу­ем под­клю­чить­ся к уда­лен­но­му компьютеру:

ssh mid@192.168.1.15

Мы долж­ны под­клю­чить­ся по SSH без вво­да паро­ля. В про­тив­ном слу­чае, на целе­вом ком­пью­те­ре (к кото­ро­му у нас не полу­чи­лось под­клю­чить­ся) откры­ва­ем кон­фи­гу­ра­ци­он­ный файл для ssh:

vi /etc/ssh/sshd_config

И при­во­дим опцию AuthorizedKeysFile к сле­ду­ю­ще­му значению:

AuthorizedKeysFile     .ssh/authorized_keys

Пере­за­пус­ка­ем sshd:

systemctl restart sshd

Сно­ва про­бу­ем под­клю­чить­ся по SSH.

Настройка Lsyncd для синхронизации по сети

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

vi /etc/lsyncd.conf

Добав­ля­ем блок настро­ек sync:

[codesyntax lang="php"]

[/codesyntax]

* где:

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

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

mkdir /tmp/target

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

chown mid:mid /tmp/target

Так­же на целе­вом ком­пью­те­ре необ­хо­ди­мо уста­но­вить rsync.

а) на CentOS:

yum install rsync

б) на Ubuntu:

apt-get install rsync

После на ком­пью­те­ре источ­ни­ке пере­за­пус­ка­ем lsync:

systemctl restart lsyncd

Ждем 5-10 секунд и про­ве­ря­ем на целе­вом ком­пью­те­ре нали­чие файла:

ls /tmp/target/

Мы долж­ны уви­деть файл:

testfile

Пере­да­ча по сети работает.

Полезные опции

Рас­смот­рим при­ме­ры исполь­зо­ва­ния неко­то­рых настро­ек, кото­рые могут пока­зать­ся полезными.

Исключения

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

[codesyntax lang="php"]

[/codesyntax]

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

Для вто­ро­го бло­ка созда­ем файл с исключениями:

vi /etc/lsyncd.exclude

*.tmp
*.bak
testfile.txt
test/

* в дан­ном при­ме­ре мы игно­ри­ру­ем фай­лы, закан­чи­ва­ют­ся на .bak или .tmp,а так­же файл testfile.txt и содер­жи­мое ката­ло­га test.

Комментарии

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

[codesyntax lang="php"]

[/codesyntax]

Порт SSH

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

[codesyntax lang="php"]

[/codesyntax]

* в этом при­ме­ре мы ука­зы­ва­ем исполь­зо­вать порт 2222 для под­клю­че­ния по SSH.

Ограничения

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

[codesyntax lang="php"]

[/codesyntax]

* где:

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

Установка прав

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

[codesyntax lang="php"]

[/codesyntax]

* где:

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

Возможные ошибки

В про­цес­се настрой­ки и экс­плу­а­та­ции систе­мы, мы можем столк­нуть­ся с раз­лич­ны­ми про­бле­ма­ми. Опи­шем реше­ние неко­то­рых из них.

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-get install rsync

На ком­пью­те­ре с lsync пере­за­пус­ка­ем сервис:

systemctl restart lsyncd