如何使用lsyncd在VPS上镜像本地和远程目录
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 密钥登录远程计算机
如果您还没有这样做,请按照本指南使用 lsyncd 在您的机器上 生成 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”以启用 rsync over 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 文档(之前链接)和 lsync 文档 是很好的资源,可以让您开发更复杂的同步操作。
查看“/usr/share/doc/lsyncd/examples”目录中的一些其他示例以获得更多想法。