Синхронизация локальных и удалённых каталогов при помощи lsyncd

Published by Leave your thoughts

Что такое lsyncd?

При управлении веб-сервером или приложением часто возникает необходимость синхронизировать каталоги. Одним из надёжных решений для выполнения этой задачи является демон lsyncd.

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

Примечание: Данное руководство выполнено на виртуальном выделенном сервере Ubuntu 12.04, но любой современный дистрибутив будет работать таким же образом.

Установка lsyncd

Демон lsyncd можно скачать из официального репозитория Ubuntu.

Чтобы установить lsyncd, используйте команды:

sudo apt-get update
sudo apt-get install lsyncd

Эти команды установят lsyncd. Но демон поставляется без стандартных настроек, потому их необходимо установить самостоятельно.

Примеры конфигурации lsyncd

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

cd /usr/share/doc/lsyncd/examples
ls
lbash.lua  lgforce.lua      lpostcmd.lua  lrsyncssh.lua
lecho.lua  limagemagic.lua  lrsync.lua

Ознакомьтесь с этими текстовыми файлами, чтобы понять, как устроены конфигурации lsyncd.

Более подробные настройки можно найти в файле lrsync.lua:

sudo nano
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings = {
statusFile = "/tmp/lsyncd.stat",
statusIntervall = 1,
}
sync{
default.rsync,
source="src",
target="trg",
}

Строки, которые начинаются с двух тире (—), закомментированы, lsyncd не интерпретирует их.

Конфигурационный файл lsync написан ан языке программирования Lua; узнать больше о Lua можно здесь.

Настройка окружения

Для примера попробуйте синхронизировать два локальных каталога. Создайте их при помощи следующей команды:

sudo mkdir -p /source/to/copy
sudo mkdir /dest

Затем нужно добавить несколько файлов в первый каталог:

cd /source/to/copy
sudo touch file{1..100}

Эти команды создают 100 файлов в каталоге /source/to/copy.

Кроме того, нужно создать лог для lsyncd и несколько файлов в нём:

sudo mkdir /var/log/lsyncd
touch /var/log/lsyncd/lsyncd.{log,status}

Затем нужно создать конфигурационный каталог lsyncd:

sudo mkdir /etc/lsyncd

В этом каталоге создайте конфигурационный файл lsyncd.conf.lua:

sudo nano /etc/lsyncd/lsyncd.conf.lua

Синхронизация локальных каталогов при помощи lsyncd

При помощи только что созданного конфигурационного файла можно синхронизировать каталоги /source/to/copy directory to the /dest.

Основные настройки

Основные настройки находятся в разделе settings; поместите в файл:

settings = {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}

Благодаря этим опциям lsyncd будет использовать созданные ранее файлы.

Настройки синхронизации

Следующий раздел содержит настройки синхронизации. Поскольку в данном случае синхронизация будет выполняться локально, можно использовать команду rsync.

Эти конфигурации определяются при помощи опции default.rsync, которая значит, что демон lsyncd будет ждать 20 секунд или собирать 1000 отдельных событий синхронизации, а затем вызовет rsync для синхронизации изменений.

Согласно мануалу lsyncd вызываемая команда rsync эквивалентна команде:

rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET

Это значит, что rsync работает следующим образом:

  • -l: копирует символическую ссылку
  • -t: копирует время изменения
  • -s: только подстановочные знаки
  • -d: перемещение каталогов без рекурсии

Всё, что нужно сделать, чтобы изменения вступили в силу — указать тип синхронизации, исходный и целевой каталог. Раздел sync должен выглядеть так:

sync {
default.rsync,
source = "/source/to/copy",
target = "/dest"
}

Чтобы изменить поведение rsync при помощи опций, задайте переменной rsyncOpts список этих опций, разделив их запятыми:

sync {
default.rsync,
source = "/source/to/copy",
target = "/dest",
rsyncOpts = {"rsync option1", "rsync option2", "rsync option3"}
}

Теперь файл готов к тестовой синхронизации; сохраните и закройте файл.

Тестовая локальная синхронизация

Откройте целевой каталог и убедитесь, что он пуст (в данном случае это /dest):

cd /dest
ls

Последняя команда не должна вернуть никакого вывода, поскольку каталог пуст.

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

sudo service lsyncd start

Снова выполните команду ls:

ls
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Как видите, демон lsyncd успешно синхронизировал локальные каталоги.

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

sudo mkdir /source/to/copy/hello{1..100}
ls

Затем проверьте целевой каталог при помощи команды ls.

Удалённая синхронизация при помощи lsyncd

Чтобы настроить удалённую синхронизацию, нужно внести несколько изменений в конфигурационный файл.

Для начала нужно иметь возможность подключиться к машине по ssh.

Подключение к удалённой машине с помощью SSH-ключей

Чтобы получить инструкции по созданию SSH-ключей, читайте данное руководство.

Создайте пару ключей для root-пользователя, поскольку lsyncd будет работать как root. Затем скопируйте файл ключа на удалённую машину при помощи команды:

sudo su
ssh-copy-id remote_mirror_ip_address

Теперь файл ключа позволит входить на удалённый сервер как пользователю root.

Убедитесь, что это работает, и создайте на удалённой машине целевой каталог:

ssh remote_mirror_ip_address

Для примера создайте целевой каталог /remotesync:

mkdir /remotesync

Закройте удалённую сессию и локальную root-сессию, дважды введя exit:

exit
exit

Настройка удалённой синхронизации lsyncd

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

sudo nano /etc/lsyncd/lsyncd.conf.lua
settings = {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}
sync {
default.rsync,
source = "/source/to/copy",
target = "/dest"
}

Нужно внести некоторые изменения в раздел sync:

Замените default.rsync на default.rsyncssh, чтобы включить поддержку rsync по ssh; также замените переменную target переменными host и targetdir:

settings = {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status"
}
sync {
default.rsyncssh,
source = "/source/to/copy",
host = "remote_mirror_ip_address",
targetdir = "/remotesync"
}

Сохраните и закройте файл.

Тестирование удалённой синхронизации

Перезапустите сервис lsyncd:

sudo service lsyncd restart

Подключившись к удалённой машине по ssh, можно увидеть изменения в каталоге /remotesync:

sudo su
ssh remote_mirror_ip_address
ls /remotesync

Теперь этот каталог содержит файлы, добавленные в каталог /source/to/copy.

Заключение

Сервис lsyncd — отличный способ синхронизировать файлы между системами и каталогами. Написанный на Lua конфигурационный файл делает этот инструмент ещё более гибким и производительным. Документация Lua и lsyncd содержат инструкции для настройки более сложной синхронизации.

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

Tags: , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>