Источник
Что такое 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 содержит и другие примеры конфигурационных файлов.