什么是lsyncd?
在管理Web服务器或应用程序时,有许多情况需要目录之间的同步。 虽然有许多工具可以帮助你做到这一点,lsyncd是一个强有力的候选人。
本文将讨论如何配置lsyncd以镜像单台机器上目录之间的更改,以及如何在远程主机之间镜像。
对于本指南,我们将使用Ubuntu 12.04 VPS,但任何现代分发应该以类似的方式运行。
如何安装lsyncd
幸运的是,Ubuntu在其默认存储库中包含lsyncd。
我们可以使用以下命令安装lsyncd:
sudo apt-get update sudo apt-get install lsyncd
这将安装lsync,但它不会为您提供默认配置。 我们将在后面的文章中创建一个。
如何查找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
你可以看看这些文本文件来了解配置可以做什么。
我们可以通过打开“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}
上述命令在“/ source / to / copy”目录中创建100个文件。
此外,我们可以创建一个日志目录和一些文件供lsyncd使用:
sudo mkdir /var/log/lsyncd touch /var/log/lsyncd/lsyncd.{log,status}
接下来,我们可以创建lsyncd配置目录:
sudo mkdir /etc/lsyncd
我们将在这个目录中创建一个名为“lsyncd.conf.lua”的配置文件,其中包含nano:
sudo nano /etc/lsyncd/lsyncd.conf.lua
如何使用lsyncd同步两个本地文件夹
我们所做的配置文件将“/ source / to / copy”目录同步到“/ dest”目录。
配置全局部分
一般设置都在“设置”一节中进行配置。 我们的部分将包含几个基本设置:
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 { default.rsync, source = "/source/to/copy", target = "/dest" }
如果要向rsync添加选项以修改其行为,可以通过将“rsyncOpts”变量传递为包含逗号分隔的字符串的数组,每个字符串表示一个rsync选项:
sync { default.rsync, source = "/source/to/copy", target = "/dest", rsyncOpts = {"rsync option1", "rsync option2", "rsync option3"} }
我们现在有足够的配置来测试我们的设置。 保存并关闭文件。
测试本地同步
让我们进入目标目录,并验证此时“/ dest”目录中没有文件:
cd /dest ls
最后一个命令应该不返回任何输出,因为“/ dest”目录应该为空。
我们可以通过发出以下命令启动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
我们可以看到,所有的文件都会立即同步。
如果我们将一些文件添加到源目录,我们将遇到我们在讨论“default.rsync”时提到的20秒延迟:
sudo mkdir /source/to/copy/hello{1..100} ls
我们最初不会看到文件,但在超时后,rsync将同步文件。 通过重新发出“ls”命令再次检查。
如何使用lsyncd配置远程同步
通过对配置文件的一些更改,我们可以配置远程同步。
首先,我们需要能够通过无密码的ssh从原始机器登录镜像机。
如何使用SSH密钥登录远程计算机
如果你还没有这样做, 按照本指南操作。
为root用户创建一个密钥对,因为lsyncd服务将以root身份运行。 然后,可以使用以下命令将密钥文件复制到远程镜像计算机:
sudo su ssh-copy-id remote_mirror_ip_address
您的密钥文件现在应允许您以root用户身份登录远程镜像服务器。
现在尝试,以便测试它的工作原理,并在远程主机上创建目标目录:
ssh remote_mirror_ip_address
我们将创建一个名为“/ remotesync”的目录作为我们的目标目录:
mkdir /remotesync
通过键入“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" }
我们只需在“同步”部分中进行更改即可。
我们将“default.rsync”更改为“default.rsyncssh”以通过ssh启用rsync,我们将“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的文档(链接前面)和LSYNC文档是巨大的资源,这将让你开发更复杂的同步操作。
查看“/ usr / share / doc / lsyncd / examples”目录中的一些其他示例,以获得更多的想法。