如何使用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”目录中的一些其他示例以获得更多想法。

贾斯汀·艾林伍德