可在CentOS/RHEL 7中实时同步目录的lsyncd示例

时间:2020-01-09 10:42:32  来源:igfitidea点击:

在此示例中,我将与lsyncd共享一些示例,以在Linux环境中执行实时同步。
使用lsyncd,我们可以在Linux中跨多个目标和目录同步目录和文件。
我使用RHEL/CentOS 7作为源,并使用RHEL/CentOS 8作为目标节点来执行目录和文件的实时同步。

lsyncd概述

  • Lsyncd使用文件系统事件接口(" inotify"或者" fsevents")来监视本地文件和目录的更改。

  • Lsyncd整理这些事件几秒钟,然后生成一个或者多个进程以将更改同步到远程文件系统。

  • 默认的同步方法是rsync。
    因此,Lsyncd是一种轻型的实时镜像解决方案。

  • Lsyncd相对易于安装,并且不需要新的文件系统或者块设备。

  • Lysncd不会影响本地文件系统的性能。

为什么要使用lsyncd?

Lsyncd旨在将缓慢变化的本地目录树同步到远程镜像,对于将数据从安全区域同步到不太安全的区域特别有用。

安装lsyncd

lsyncd不是RHEL/CentOS 7默认存储库的一部分,因此我们必须使用EPEL存储库进行安装。
我们可以使用以下方式安装epel-repo

[root@centos-7 ~]# yum -y install epel-release

接下来,我们可以在源计算机上安装lsyncd rpm。
这里我们的源计算机是在Oracle VirtualBox上运行的RHEL/CentOS 7 Linux节点

[root@centos-7 ~]# yum -y install lsyncd

1.一个可以实时同步目录和文件的线性同步示例

打印版本号

[root@centos-7 ~]# lsyncd --version
Version: 2.2.2

使用rsynclsyncd在本地主机上同步目录

[root@centos-7 ~]# lsyncd -rsync /source//target/
20:35:33 Normal: --- Startup, daemonizing --

其中该进程在后台运行并作为守护程序运行,我们也可以使用lsyncd前端

[root@centos-7 ~]# lsyncd -nodaemon -rsync /source//target/
20:36:36 Normal: --- Startup --
20:36:36 Normal: recursive startup rsync: /source/-> /target/
20:36:36 Normal: Startup of /source/-> /target/finished.
20:37:21 Normal: Calling rsync with filter-list of new/modified files/dirs
/file3
/
20:37:21 Normal: Finished a list after exitcode: 0
^C20:38:30 Normal: --- INT signal, fading --

-nodaemon一起运行时,行为上有所不同。
Lsyncd不会像变成守护程序那样将其工作目录更改为/

在后端使用rsync在主机之间同步文件和目录

[root@centos-7 ~]# lsyncd -nodaemon -rsync /source/centos-8:/target/
20:39:04 Normal: --- Startup --
20:39:04 Normal: recursive startup rsync: /source/-> centos-8:/target/
20:39:04 Normal: Startup of /source/-> centos-8:/target/finished.

使用rsyncssh作为后端跨主机同步文件和目录

[root@centos-7 ~]# lsyncd -nodaemon -rsyncssh /source centos-8 /target/
20:40:48 Normal: --- Startup --
20:40:48 Normal: recursive startup rsync: /source/-> centos-8:/target/
20:40:49 Normal: Startup of "/source/" finished: 0
^C20:40:52 Normal: --- INT signal, fading --

2.为默认设置配置lsyncd配置文件

默认的lsyncd配置文件是/etc/lsyncd.conf
但是,我们还可以在/usr/share/doc/lsyncd */examples下找到一堆示例lsyncd配置文件。
我在设置中使用了非常基本的lsyncd配置

例如在下面的lsyncd配置文件中,

  • 以下代码将指示Lsyncd登录到/var/log/lsyncd/lsyncd.log,

  • 定期更新文件/var/log/lsyncd-status.log及其状态

  • 经过20秒后最短写入状态文件

  • 并且不要作为守护程序分离。

settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true
}

有关支持的指令的更多详细信息,请查看lysyncd的官方页面。

3.使用default.direct同步本地目录和文件

与使用default.rsync相比,default.direct可用于使两个本地目录保持同步,并具有更好的性能。
Default.direct在启动时使用rsync(就像default.rsync一样)来初始将目标目录与源目录同步。

但是,在正常操作中,default.direct使用/bin/cp,/bin/rm和/bin/mv来同步目录。

以下是使用defualt.direct的示例lsyncd配置文件/etc/lsyncd.conf

settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
    default.direct,
    source = "/source",
    target = "/target1",
    delay = 10,
}

重要的提示:

确保提供源目录和目标目录的绝对路径以同步目录

接下来重启lsyncd服务

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd
[root@centos-7 ~]# less /var/log/lsyncd/lsyncd.log

4.使用default.rsync同步本地目录和文件

默认的" rsync"配置将聚合事件最多延迟几秒或者1000个单独的非崩溃事件,以先发生为准。
然后它将生成一个带有所有已更改文件过滤器的" rsync"。
过滤器列表通过管道传输到rsync。

下面是一个使用defualt.rsync来同步目录和文件的lsyncd配置文件示例:

[root@centos-7 ~]# cat /etc/lsyncd.conf
settings {
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "/source",
   target = "/target",
   delay  = 10,
}

其中我们定义了10秒的延迟等待时间来同步目录。
有关受支持指令的更多列表,请检查lsyncd的官方github页面。

验证目录是否在localhost上同步。
这里我们在localhost上有两个目录

[root@centos-7 ~]# mkdir /source /target

因此,我们已经配置了lsyncd来将/source的内容同步到同一节点上的/target目录中。

[root@centos-7 ~]# touch /source/file

几秒钟后,验证/target中的相同内容

[root@centos-7 ~]# ls /target/
file

提示:

同样,如果我们从/source中删除文件,则将从/target中删除该文件。
我们可以控制这种行为,我们将在本文后面进行研究。

从日志文件/var/log/lsyncd/lsyncd.log

Sun Jan 19 16:24:21 2017 Normal: --- Startup --
Sun Jan 19 16:24:21 2017 Normal: recursive startup rsync: /source/-> /target/
Sun Jan 19 16:24:21 2017 Normal: Startup of /source/-> /target/finished.

如果修改了文件,则在/target中更新相同的文件

Sun Jan 19 16:24:35 2017 Normal: Calling rsync with filter-list of new/modified files/dirs
/file
/
Sun Jan 19 16:24:35 2017 Normal: Finished a list after exitcode: 0

5.使用rsync将本地主机上的源文件和目录同步到另一个目标主机

我们可以使用现有的配置文件,只需稍作更改即可在多个Linux主机之间同步目录。
我将CentOS 7用作源节点,将CentOS 8用作目的地。
其中目标应该包含主机名和绝对目标路径

下面是一个示例lsyncd configlsyncd.conf文件。
我们可以配置DNS服务器来解析主机名或者更新/etc/hosts文件。

[root@centos-7 ~]# cat /etc/lsyncd.conf
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "/source",
   target = "centos-8:/target",
   delay  = 10,
}

接下来重启lsyncd服务

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd

当我们重新启动以下服务时,将在/var/log/lsyncd/lsyncd.log中看到日志以启动目录同步

Sun Jan 19 16:19:36 2017 Normal: --- TERM signal, fading --
Sun Jan 19 16:19:36 2017 Normal: --- Startup --
Sun Jan 19 16:19:36 2017 Normal: recursive startup rsync: /source/-> centos-8:/target/
Sun Jan 19 16:19:36 2017 Normal: Startup of /source/-> centos-8:/target/finished.

每次根据延迟值修改文件/目录时,主机之间的目录将自动实时同步:

Sun Jan 19 16:20:09 2017 Normal: Calling rsync with filter-list of new/modified files/dirs
/file
/
Sun Jan 19 16:20:09 2017 Normal: Finished a list after exitcode: 0

6.使用rsyncssh将目录和文件从localhost上的源同步到其他目标主机

此配置与标准rsync配置的不同之处在于,它使用ssh命令在目标主机本地移动文件或者目录,而不是再次删除和传输。
这个配置会生成default.rsync之类的rsync进程,但是还会生成/usr/bin/ssh HOST mv ORIGIN DESTINATION命令。

与default.rsync不同,它不需要统一的目标参数,但需要将主机和targetdir分开。

这是一个示例lsyncd配置文件,我们在sync部分使用了default.rsyncssh而不是default.rsync。

[root@centos-7 ~]# cat /etc/lsyncd.conf
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsyncssh,
   source="/source",
   host="centos-8",
   excludeFrom="/etc/lsyncd.exclude",
   targetdir="/target",
   delay = 10,
}

7.使用lsyncd启用压缩和存档以进行目录镜像

通过使用lsyncd配置文件中突出显示的部分,我们可以在尝试进行文件传输以同步目录时启用压缩和存档。

[root@centos-7 ~]# cat /etc/lsyncd.conf
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "/source",
   target = "/target",
   delay  = 10,
   rsync  = {
     archive  = true,
     compress = true
   }
}

接下来重启lsyncd服务

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd

8.从一个来源同步多个目标和目录

在Linux中,有两种执行lsyncd多目标的方法,可以通过创建单独的同步函数或者使用for循环来实现,如下所示:

方法1:通过创建单独的同步块来同步多个目标

我们可以在lsyncd配置文件/etc/lsyncd.conf中创建单独的sync块,以用于lsyncd多个目标的相应源和目标位置。
对于下面的示例,我有两个同步功能可以在两个不同的目标本地同步目录和文件,而第三个同步功能将在本地主机和目标CentOS 8节点之间复制文件和目录。

[root@centos-7 ~]# vim /etc/lsyncd.conf
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "/source",
   target = "/target1",
   delay  = 10,
}
sync {
   default.rsync,
   source = "/source",
   target = "centos-8:/target",
   delay  = 10,
}
sync {
   default.rsync,
   source = "/source",
   target = "/target2",
   delay  = 10,
}

方法2:使用for循环同步多个目标

另外,对于lsyncd多个目标,也可以使用for循环在一个源和多个目标之间同步目录和文件,而不必创建太多同步功能

settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
targets = {
    'centos-8:/targetdir',
    '/target1',
    '/target2',
}
for _, target in ipairs( targets )
do
    sync{ default.rsync, source='/source', target=target }
end

现在,在为安装程序选择方法1或者2来执行lsync多个目标之后,重新启动lsyncd服务以激活更改

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd

我们可以验证日志/var/log/lsyncd/lsyncd.log以确保lsyncd多个目标正常工作

Sun Jan 19 17:14:17 2017 Normal: Startup of /source/-> /target1/finished.
Sun Jan 19 17:14:17 2017 Normal: Startup of /source/-> /target2/finished.
Sun Jan 19 17:14:56 2017 Normal: Startup of /source/-> centos-8:/target/finished.

9.在rsync操作之前或者之后执行脚本

我们可以在sync函数中使用带有脚本绝对路径的二进制指令来在后期执行脚本。
下面是一个示例lsyncd配置文件/etc/lsyncd.conf

settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
   default.rsync,
   source = "/source",
   target = "/target1",
   delay  = 10,
   rsync = {
        binary = "/tmp/target1_status.sh"
   }
}

其中我们创建了一个示例脚本,一旦提供的源和目标之间的同步完成,它将在临时文件/tmp/file中在target1中回显一条语句Completed sync。
这可用于检查目录同步的退出状态。

[root@centos-7 ~]# cat /tmp/target1_status.sh
#!/bin/bash
/usr/bin/rsync "$@"
result=$?
(
  if [ $result -eq 0 ]; then
     echo "`date`: Completed sync in target1" >> /tmp/file
  fi
) >/dev/null 2>/dev/null </dev/null
exit $result

接下来重启lsyncd服务

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd

从日志/var/log/lsyncd/lsyncd.log验证执行状态

Sun Jan 19 17:49:40 2017 Normal: Startup of /source/-> /target1/finished.

10. lsyncd在执行实时同步时排除文件和目录

为了使文件和目录不被lsyncd同步,可以为sync {}指定两个添加参数:

  • excludeFrom = FILENAME-每行规则从该文件加载排除规则

  • exclude = LIST-从这个字符串列表中加载排除规则

排除规则是按照rsync的排除模式建模的,但要简单一些。
lsyncd支持以下功能:

通常,如果事件的路径名的任何段与文本匹配,则将其排除。
例如。
文件"/bin/foo/bar"匹配规则" foo"。

  • 如果规则以斜杠开头,则仅在路径名的开头进行匹配

  • 如果规则以斜杠结尾,则仅在路径名的末尾进行匹配

  • "?"匹配不是斜杠的任何字符。

  • *匹配零个或者多个非斜杠字符

  • **匹配零个或者多个字符,这可以是斜杠。

在下面的示例中,我排除了文件名中包含文件或者以tmp结尾的任何文件或者目录

[root@centos-7 ~]# vim /etc/lsyncd.conf
settings {
   logfile    = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20,
   nodaemon   = true,
}
sync {
    default.direct,
    source = "/source",
    target = "/target1",
    delay = 10,
    exclude = { 'file*' , '*tmp' }
}

接下来重新启动lsyncd服务

[root@centos-7 ~]# systemctl restart lsyncd

检查服务状态并记录是否有任何错误输出

[root@centos-7 ~]# systemctl status lsyncd

从日志/var/log/lsyncd/lsyncd.log中,我们可以验证排除

Sun Jan 19 18:28:43 2017 Normal: --- Startup --
Sun Jan 19 18:28:43 2017 Normal: recursive startup rsync: /source/-> /target1/excluding
file*
*tmp
Sun Jan 19 18:28:43 2017 Normal: Startup of /source/-> /target1/finished.

提示:

如果我们打算使用rsyncssh,那么某些指令在配置文件中将有所不同,如本文前面所述。

11. lsyncd在同步目录时删除文件

默认情况下,Lsyncd将删除目标上源中不存在的文件,因为这是使目标与源同步的基本概念。
但是,出于各种原因,许多用户为此请求了例外,因此所有默认实现都将delete作为添加参数。

删除的有效值为:

  • delete = true默认值。
    Lsyncd将在目标上删除源中不存在的任何内容。
    在启动时以及在正常操作期间将删除的内容。

  • delete = falseLsyncd不会删除目标上的任何文件。
    既不在启动时也不在正常运行时。
    (但是可能会覆盖)

  • delete ='startup'Lsyncd将在目标启动时删除目标上的文件,但在正常运行时不会删除。

  • delete ='running'Lsyncd在启动时不会删除目标上的文件,但会删除在正常操作中删除的文件。

有关更多信息,请检查lsyncd的官方页面

sync {
    default.direct,
    source = "/source",
    target = "/target1",
    delay = 10,
    delete = false
}