如何在带有lsyncd的VPS上镜像本地和远程目录

在管理Web和应用程序服务器时,有很多次对目录进行镜像很有用。 lsyncd服务可以镜像本地和远程目录,以便将更改从一个位置传播到另一个位置。本指南将cove

什么是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”以通过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”目录中的一些其他示例,以获得更多的想法。

作者:Justin Ellingwood