可在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 = false
Lsyncd不会删除目标上的任何文件。
既不在启动时也不在正常运行时。
(但是可能会覆盖)delete ='startup'
Lsyncd将在目标启动时删除目标上的文件,但在正常运行时不会删除。delete ='running'
Lsyncd在启动时不会删除目标上的文件,但会删除在正常操作中删除的文件。
有关更多信息,请检查lsyncd的官方页面
sync { default.direct, source = "/source", target = "/target1", delay = 10, delete = false }