可在CentOS/RHEL 7中实时同步目录的lsyncd示例
在此示例中,我将与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
使用rsync和lsyncd在本地主机上同步目录
[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
}

