CentOS7部署lsyncd+rsync实现服务器文件实时同步
Table of Contents
之前写过一篇使用sersync +rsync进行实时文件同步的文章,如果你不熟悉rsync服务器端的配置,请先把这篇文章看完再来看本文!
另外还有一篇专门讲rysnc命令怎么使用的文章:使用rsync代替scp上传文件到服务器或从服务器下载文件(支持跨越跳板机)。
简述如何同步
假设有A和B两台机,A同步到B,则:
A:安装lsyncd+rsync,并运行lsyncd服务;
B:只需要安装rsync,并运行rsyncd服务;
A中的lsyncd监听到文件变化后,调用A中的rsync向B推送文件,B因为运行有一个rsyncd服务,所以可以接收这个推送,从而完成文件的同步。
另外还可以有C、D、E、F、……,它们都与B相同,只要运行rsyncd服务即可,A上可配置一次性推送向多台机器。
Lsyncd是什么?
Github:之前是axkibe/lsyncd,现在是lsyncd/lsyncd,不过之前的axkibe会跳转到现在的lsyncd。
官方文档:Lsyncd – Live Syncing (Mirror) Daemon
Lsyncd是一个辅助文件同步工具。它通过监听系统的文件变化事件,调用rsync进行同步。注意“辅助”二字,辅助的意思是:同步文件本身并不是由lsyncd来实现,它只负责监测哪些文件改变了,进而调用rsync来完成同步,真正同步文件的是rsync
,如果你不知道什么是rsync,请查看使用sersync +rsync进行实时文件同步中的rsync部分。
Lsyncd的三种同步模式
- default.rsync
- default.rsyncssh
- default.direct
为了方便,我们直接把它们称为rsync、rsyncssh、direct。
1. rsync同步模式
首先,你需要知道rsync的基本用法,以下的rsync命令就可以把文件从本地的“/data/wwwroot”目录推送到远程的“[email protected]::wwwroot/”目录中,运行在“rsync同步模式”的lsyncd正是通过组装类似这样的命令来同步文件的:
rsync -avz --partial --delete /data/wwwroot [email protected]::wwwroot/ --password-file=/etc/rsyncd.password
有人可能会疑惑,既然rsync本身就可以同步,那要lsyncd干嘛?有两个原因:
- 1.实时同步。
- 2.减少rsync扫描文件带来的延时和性能损耗。
直接使用rsync是可以同步没错,但是它却无法知道“什么时候同步”,因为rsync只有执行同步命令的时候,才会去扫描文件判断哪些文件被修改了,但什么时候要执行同步命令呢?rsync没有这功能,某个文件修改了,rsync并不会获得通知说某个文件已经修改了,直接使用rsync,只能建立一个定时任务,每隔一定的时间(比如5分钟,10分钟等等)去执行一次同步,这样虽然能同步,但却“不实时”了。
而lsyncd就可以监听文件的修改,换句话说,某个文件修改了,lsyncd会得到通知(原理是使用linux系统的inotify/fsevents功能),得到通知之后,再去调用rsync把修改的文件进行同步(即组装一句rsync同步语句并执行),达到“实时同步”的效果。
lsyncd调用rsync同步命令的时候,会用rsync的--include-from=FILE
之类的选项来指定要同步哪些文件,这样可以达到“减少rsync扫描文件带来的延时和性能损耗”。
为什么这么说呢?因为如果让rsync自己去查询哪些文件改变了,需要消耗较多的时间和服务器资源,试想一下,在100万个文件中,有一个文件添加了一个英文的句号.
,如果没有lsyncd告诉rsync改变的是这个文件,那rsync就要去扫描100万个文件来找出这个仅仅多了一个.
的文件,虽然rsync的查找效率很高,但这个查找是非常没有必要的,这就是为什么lsyncd能“减少rsync扫描文件带来的延时和性能损耗”。
2. rsyncssh同步模式
明白了rsync同步模式,就不难明白rsyncssh模式,因为rsync本身就是有ssh模式的,lsyncd同样是负责监听哪些文件变化了,然后组装rsync同步命令进行同步。
rsync的ssh模式,主要的好处是用于文件移动的时候。假设我现在有两台机A和B,A中的test目录文件变化会自动同步到B中的test目录,现在A、B的test目录文件如下:
├── dir1
│ ├── aa.txt
│ ├── bb.txt
│ └── cc.txt
└── dir2
└── dd.txt
假设现在把A机的bb.txt和cc.txt从dir1移动到dir2,即变成如下所示的状态:
├── dir1
│ └── aa.txt
└── dir2
├── bb.txt
├── cc.txt
└── dd.txt
假设使用普通的rsync模式,那么rsync会先删除B机中的dir1中的bb.txt和cc.txt,并把A机中的bb.txt和cc.txt文件上传到B机中的dir2目录,达到同步的效果。
但如果你rsync运行在ssh模式,那么它会直接在B机中把dir1中的bb.txt和cc.txt用mv
命令直接移动到dir2目录,A机没有向B机传任何数据,效率显而易见(特别是移动的数据特别多的时候更明显)。
这样看,rsyncssh模式应该是最好的,但它却有一个缺点,就是同步进程只能是单进程(maxProcesses=1),而rsync模式是可以多进程同步的(速度快)。
3. direct同步模式
这个模式用于本地的两个目录之间同步,不用于远程服务器同步。lsyncd同样是监听文件变化事件,然后把变化的文件从源目录同步到目标目录,同步的命令,就是linux系统本身的命令,比如cp
、rm
、mv
,增加了文件用cp拷过去,删除了文件,那边也用rm删除,移动了文件,那边也用mv移动。
安装lsyncd
CentOS用yum、其他的用各自的包管理软件,比如Debian/Ubuntu用apt
,Mac用brew install
等等:
yum -y install lsyncd
因为必须用到rsync,所以我们也要安装rsync(rsync是git的依赖,如果你服务器安装过git那肯定就已经有rsync了,但不管有没有都可以执行一下下边这条命令,因为它不止可以安装,还可以更新rsync):
yum -y install rsync
Lsyncd安装好之后,默认的配置文件在/etc/lsyncd.conf
,另外还有些配置的例子在/usr/share/doc/lsyncd-2.2.2/examples
下:
├── lalarm.lua
├── lbash.lua
├── lecho.lua
├── lftp.lua
├── lgforce.lua
├── limagemagic.lua
├── lpostcmd.lua
├── lrsync.lua
├── lrsyncssh.lua
└── lsayirc.lua
实际上/etc/lsyncd.conf
也可以写成/etc/lsyncd.lua
,因为它本身就是用lua(一种脚本语言)写配置的,所以,在配置里写注释的时候,要使用lua语言的注释符号,即两个横杠--
。事实上,我建议把后缀改成.lua
,因为只有这样,用vim编辑才有语法高亮,不然整片都是灰的,看的很难受。
Lsyncd配置文件详解
前面说过了,配置文件是使用lua语言写的,所以注释要用lua语言的注释符号,即两个横杠--
。
配置文件主要有三部分:
- settings:lsyncd本身的一些设置,比如日志文件路径,同步进程数,是否后台运行等等。
- sync:同步相关的设置,比如从哪同步到哪,要忽略哪些文件,多久同步一次等等
- rsync:这部分是在
sync
里面的,它主要配置rsync本身的一些选项。
以下是两个官方的配置文档:
- 配置Settings:The Configuration File
- 配置sync和rsync:Config Layer 4: Default Config
/etc/lsyncd.conf
中的默认内容没什么价值,可以全部删除,下边我们来讲解配置文件要怎么写。
default.rsync模式配置文件:
-- 由于该配置文件实际上是lua语言的语法,所以写注释要用--,--是lua语言的注释符号
-- Lsyncd本身的配置
settings {
-- 指定日志文件位置
logfile = "/var/log/lsyncd/lsyncd.log",
-- 指定状态文件位置
statusFile = "/var/log/lsyncd/lsyncd.status",
-- inotify事件模式,什么事件才同步,CloseWrite表示文件关闭的时候同步(创建文件,修改文件后保存都会触发CloseWrite事件)
inotifyMode = "CloseWrite",
-- 最大同步进程数(如果是default.rsyncssh模式,则maxProcesses必须设置为1,这就是rsyncssh模式的缺点了,如果是default.rsync模式则可以设置大于1,这样会有多个同步进程,速度更快)
maxProcesses = 8,
-- maxProcesses = 1,
-- 配合下面的delay选项使用,delay单位是秒,当delay时间到了,不管maxDelays设置多少,都会同步,同样,当maxDelays达到了设定值,不管是否到delay时间,都会同步,即两个选项有一个满足即会触发同步,为了实时同步,我们一般设置为1,表示即使只有一个文件改变也同步
maxDelays = 1,
-- 是否以后台的方式运行,注意它是nodaemon,所以是双重否定,如果填false,意思就是“不要不后台运行”(即后台运行),非后台运行一般用于调试,把rsync的verbose也设置为true,这样会把同步的细节输出到控制台,方便调试
nodaemon = false,
}
---- 同步配置default.rsync模式(比如配置从哪同步到哪,要忽略哪些文件,多久同步一次等),可以有多个sync模块,每个模块用于设置一台目标机器
sync {
-- 有default.rsync/default.direct/default.rsyncssh三种模式,我们默认都用default.rsync即可。
default.rsync,
-- 同步源目录(本机某个目录)
source = "/data/wwwroot",
-- 同步目标地址,不同同步模式有不同写法,由于绝大多数情况都采用rsync同步,所以这里写的是rsync的同步地址
target = "[email protected]::wwwroot",
-- 默认true,允许删除目标服务器中的某些文件(即删除“那些在源服务器中不存在的文件”),可选值有: true/false/startup/running,startup就是只在启动lsyncd服务的时候判断目标服务器中有哪些文件在源服务器中没有,然后把这些文件删除,
-- 但启动之后如果目标服务器又新增了文件,这些文件即使在源服务器不存在,也不会被删除;而running与startup正好相反,是在启动的时候不会删除,启动之后会删除,true=running+startup,false相当于running和startup都不做。
-- delete = true,
-- 哪些文件不同步(可用正则))
exclude = {
'.**',
'.git/**',
'*.bak',
'*.tmp',
'runtime/**',
'cache/**'
},
-- 与上边的maxDelays配合,maxDelays是累计事件数(单位:个),delay是时间(单位:秒),这两个只要有一个符合条件就会同步一次,但为了确保实时同步,maxDelays我们一般设置为1,
-- 也就是只要有一个文件变化事件,就会同步一次,而delay是比较大的,默认是15。当然,假如我们把maxDelays设置为100,那可能15秒到了也没有达到100个文件变化,但由于到达时间了,它也会同步。
delay = 15,
-- 当init = false时只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步,如果为true,
-- 则启动后如果源目录与目标目录的文件有差异,就会同步,我们当然要设置为true,默认为true,所以这个设置可以不写,写在这里是为了解释它。
-- 虽然默认是true,但是不能显示指定为true,否则会报错(这是lsyncd 2.2.2的一个bug,按道理不应该报错)
-- init = false,
-- rsync的配置(这是default.rsync模式,如果是default.rsyncssh模式,该模块的配置会有所不同)
rsync = {
-- rsync可执行文件的绝对路径
binary = "/usr/bin/rsync",
-- 密码文件路径(default.rsyncssh模式不需要该项)
password_file = "/etc/rsyncd.password",
-- 打包后再同步(注意,打包不等于压缩,打包即可以压缩也可以不压缩)
archive = true,
-- 压缩后再同步
compress = false,
-- 输出同步信息(由于是后台执行,所以没必要输出,如果非后台执行可以设置为true,非后台执行主要用于调试)
verbose = false,
-- 由于rsync有非常多的选项(请自己rsync --help查看),部分非主要选项可以用_extra的方式指定,双引号引住,逗号分隔(bwlimit中的bw是bandwith,即带宽,整个意思是带宽限制,omit-link-times忽略符号链接的修改时间)
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
解释几个选项:
- target = “[email protected]::wwwroot”,为什么这么写?因为这是rsync的同步地址格式,10.37.129.6是rsync服务器端的ip,xiebruce是服务器端配置的用户名,wwwroot是服务器端的模块名,具体请查看:rsync的使用。
-
password_file = “/etc/rsyncd.password”,rsyncd.password中的内容到底是什么?其实非常简单,就是一个字符串(比如:123456,你也不用写password=123456,就直接写123456即可),是服务器端的密码(rsync服务器端可以配置账号和密码),文件名不是说非得
.password
结尾,因为这就是文本文件,有后缀,没后缀,后缀名是什么都无所谓,整个文件名是什么也无所谓,只要你在配置文件里使用的时候,把绝对路径放进去即可。 /etc/rsyncd.password
文件权限必须是600,并且所有者必须是运行lsyncd的用户,就算运行lsyncd的用户是root,那么/etc/rsyncd.password
文件的所有者也必须是root(虽然它的所有者不是root,lsyncd其实也是有权限读取的,但它就是要求要对应lsyncd的运行用户,否则报错)。rsync = {
模块中的选项可以查看layer4,并页内搜索“Below is a table of options for the”就能看到一个表列出的选项。
exclude
还可以用excludeFrom
来代替,这样就可以在外部文件单独写要排除同步的文件:
excludeFrom = "/etc/lsyncd_exclude.lst",
外部排除同步文件/etc/lsyncd_exclude.lst
的写法:
.svn
Runtime/*
Uploads/*
若某个事件的路径中的某些片段匹配这些文本,那么排除。比如/bin/foo/bar
匹配规则foo
- 如果规则以
/
开始,那么只匹配路径的开始 - 如果规则以
/
结束,那么只匹配路径的结束 ?
匹配任何不是/
的字符*
匹配0或多次非/
字符**
匹配任何字符0或多次。
另外,在/var/log/lsyncd/lsyncd.status
文件中可以看到具体同步了哪些文件。
rsync服务器端配置
文章开头已经说过A、B两台机各自要安装什么,现在A机的操作前面已经讲过了,B机的操作,由于之前写过文章,这里就不再重复,请直接看:rsync的使用。
开放端口
rsync的默认端口是873,如果你是CentOS7的firewalld防火墙,可以用以下方法允许873端口:
firewall-cmd --zone=public --add-port=873/tcp --permanent
firewall-cmd --reload
如果你是本地做实验觉得防火墙麻烦,也可关闭防火墙:
systemctl stop firewalld
启动lsyncd服务
如何启动的官方文档:Invoking。
lsync配置文件写好后,就可以启动它了,由于我们有配置文件,所以启动方式是:
lsyncd -log Exec /etc/lsyncd.conf
-log Exec
表示记录所有进程的日志(因为如果maxProcesses
大于1就会有多个同步进程)
启动后,它只输出了:
21:46:54 Normal: --- Startup, daemonizing ---
查看是否启动成功:
ps aux | grep lsyncd
如何进程正常运行,可以看到:
root 5238 7.7 0.6 13348 3340 ? Ss 21:46 0:15 lsyncd /etc/lsyncd.conf
查看log文件,你会看到已经同步了很多文件:
vim /var/log/lsyncd/lsyncd.log
但其实在CentOS7系统中,我们一般不直接启动,而是用systemctl
命令来启动:
systemctl start lsyncd
查看启动状态:
systemctl status lsyncd
停止:
systemctl stop lsyncd
重启:
systemctl restart lsyncd
设置开机自启动:
systemctl enable lsyncd
default.rsyncssh模式配置文件:
相比rsync,主要修改的有以下几点:
- settings中的maxProcesses必须为1,否则无法启动,并报以下错误:
Error: error preparing /etc/lsyncd.conf: /etc/lsyncd.conf:69: default.rsyncssh must have maxProcesses set to 1.
- rsync中的
password_file
去掉(或注释掉),因为ssh已经不需要用rsync的password来验证了。 - sync添加一个host,格式就是ssh登录的格式(即:[email protected]这样的格式)
- 把target改成targetdir,值的格式就是目标服务器的绝对路径,比如:
/data/wwwroot/
(最后一个斜杠可要可不要,最好要,因为这样一看就知道是目录)。 - host指定的ssh登录用户需要具有targetdir指定的目录的权限,如果启动不了请尝试用root,并且设置该用户免密登录:Linux-使用ssh免密码登录,不配置免密码登录将会无法启动。
- 免密码登录需要注意:假设你A机使用root启动lsyncd(其实基本上都得用root),而你[email protected](B机),那么你必须保证A机能在root用户下
ssh [email protected]
能无密码登录,因为很可能你A机有个用户叫lisi
,并且你在“lisi”用户下能免密登录“ssh [email protected]”,而在root用户下不能免密登录“ssh [email protected]”,那么你一样无法启动,原因是你是在root用户下启动的,你就必须让root能免密登录B机。 - host指定ssh用户,必须与目标文件夹需要的用户相同,比如很多时候,wwwroot网站目录我们都使用
www:www
这样的用户和组,所以你就必须用这个用户来同步,否则同步后创建出来的文件并不是这个权限,权限不对则网站可能会出问题。 - 顺便要提一下的是,该模式下,B,C,D机是不用启动rsynd服务的,因为我们用的ssh模式,B,C,D机已经有sshd服务来接收文件了(sshd服务是最基础的服务,任务正常的服务器都会默认有这个服务运行,否则你都无法使用ssh去登录,也就无法操作它);
- 根据第8点据说,由于不用在B,C,D上编写rsyncd配置文件并启动rsyncd服务,所以ssh模式会简单很多,但带来的问题同样存在,首先就是只能单进程,不过如果同步小文件对这个影响倒不大,主要存在的问题是权限问题:比如nginx一般用www:www用户和组运行,那么证书文件也要属于该用户和组,但是ssh模式同步除非你用www用户来同步才能是这个权限,但实际上一般www用户我们是设置成nologin的,就是不允许登录的,所以就会有这个问题,但是rsync模式就没这个问题,rsync模式可以自己设置用户和组。
-- 由于该配置文件实际上是lua语言的语法,所以写注释要用--,--是lua语言的注释符号
-- Lsyncd本身的配置
settings {
-- 指定日志文件位置
logfile = "/var/log/lsyncd/lsyncd.log",
-- 指定状态文件位置
statusFile = "/var/log/lsyncd/lsyncd.status",
-- inotify事件模式,什么事件才同步,CloseWrite表示文件关闭的时候同步(创建文件,修改文件后再关闭(如vim的:wq)都会触发CloseWrite事件)
inotifyMode = "CloseWrite",
-- 最大同步进程数(default.rsyncssh模式必须设置为1,否则无法启动,default.rsync模式可以设置大于1)
maxProcesses = 1,
-- 配合下面的delay选项使用,delay单位是秒,当delay时间到了,不管maxDelays设置多少,都会同步,同样,当maxDelays达到了设定值,
-- 不管是否到delay时间,都会同步,即两个选项有一个满足即会触发同步,为了实时同>步,我们一般设置为1,表示即使只有一个文件改变也同步
maxDelays = 1,
-- 是否以后台的方式运行,注意它是nodaemon,所以是双重否定,如果填false,意思就是“不要不后台运行”(即后台运行),非后台运行一般用于调试,把rsync的verbose也设置为true,这样会把同步的细节输出到控制台,方便调试
nodaemon = false,
}
-- 同步配置default.rsync模式(比如配置从哪同步到哪,要忽略哪些文件,多久同步一次等),可以有多个sync模块,每个模块用于设置一台目标机器
sync {
-- 有default.rsync/default.direct/default.rsyncssh三种模式,我们默认都用default.rsyncssh方式,因为这种方式其实是最好的。
default.rsyncssh,
-- 同步源目录(本机某个目录)
source = "/data/wwwroot/",
-- 同步目标地址,rsync模式写法
-- target = "[email protected]::wwwroot",
-- 同步目标地址,rsyncssh模式写法
host="10.37.129.6",
targetdir="/data/wwwroot/",
-- 默认true,允许删除目标服务器中的某些文件(即删除“那些在源服务器中不存在的文件”),可选值有: true/false/startup/running,startup就是只在启动lsyncd服务的时候判断目标服务器中有哪些文件在源服务器中没有,然后把这些文件删除,
-- 但启动之后如果目标服务器又新增了文件,这些文件即使在源服务器不存在,也不会被删除;而running与startup正好相反,是在启动的时候不会删除,启动之后会删除,true=running+startup,false相当于running和startup都不做。
-- delete = true,
-- 哪些文件不同步(可用正则))
exclude = {
'.**',
'.git/**',
'*.bak',
'*.tmp',
'runtime/**',
'cache/**'
},
-- 忽略文件路径规则也可用外部配置文件
-- excludeFrom = "/etc/lsyncd_exclude.lst",
-- 与上边的maxDelays配合,maxDelays是累计事件数(单位:个),delay是时间(单位:秒),这两个只要有一个符合条件就会同步一次,但为了确保实时同步,maxDelays我们一般设置为1,也就是只要有一个文件变化事件,
-- 就会同步一次,而delay是比较大的,默认是15。当然,假如我们把maxDelays设置为100,那可能15秒到了也没有达到100个文件变化,但由于到达时间了,它也会同步。
delay = 15,
-- 当init = false时只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步,如果为true,则启动后如果源目录与目标目录的文件有差异,就会同步,我们当然要设置为true,默认为true,所以这个设置可以不写,写在这里是为了解释它。
-- init = false,
-- rsyncssh的配置(这是default.rsyncssh模式,如果是default.rsync模式,该模块的配置会有所不同)
rsync = {
-- rsync可执行文件的绝对路径
binary = "/usr/bin/rsync",
-- 密码文件路径(rsyncssh模式不用该配置,rsync模式才需要该项)
-- password_file = "/etc/rsyncd.password",
-- 打包后再同步(注意,打包不等于压缩,打包即可以压缩也可以不压缩)
archive = true,
-- 压缩后再同步
compress = true,
-- 同步符号链接文件
copy_links = true,
-- 同步符号链接目录
copy_dirlinks = true,
-- 输出同步信息(由于是后台执行,所以没必要输出,如果非后台执行可以设置为true,非后台执行主要用于调试)
verbose = false,
-- 由于rsync有非常多的选项(请自己rsync --help查看),部分非主要选项可以用_extra的方式指定,双引号引住,逗号分隔(bwlimit中的bw是bandwith,即带宽,整个意思是带宽限制,omit-link-times忽略符号链接的修改时间)
_extra = {"--bwlimit=200", "--omit-link-times"},
-- 指定ssh相关参数选项
rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
}
}
其中这一句就是用来通过ssh登录到服务器的:
rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
你平时使用ssh登录服务器,也许用的是ssh [email protected]
,最多再加个-p
指定一下端口,但其实ssh还有很多选项,比如ssh -l xiebruce [email protected]
就表示,我虽然是用root去登录,但用-l
(login的缩写)指定了登录的用户,所以最终会以xiebruce
用户进行登录,而-i
(identify的缩写)则表示指定私钥(身份认证文件),通常是为了免密码登录服务器,原因很简单,这个同步不可能每次让你输入密码,所以需要免密码登录。
而-o
(option的缩写)表示选项,ssh有很多选项,可以用man ssh
查到,而每个选项是什么意思需要用man ssh_config
来查看,“StrictHostKeyChecking”表示严格检查主机的key fingerprint(指纹密钥),当你首次登录一台服务器的时候,它总会有这个提示:
The authenticity of host '10.37.129.7 (10.37.129.7)' can't be established.
ECDSA key fingerprint is SHA256:xcDUp3zNlJvhY4fwfwDH1pgOyc5p8Vsr2OjopanEQBw.
Are you sure you want to continue connecting (yes/no)?
如果你输入no那就不会登录,如果你输入yes,就会登录,并且把这个“key fingerprint”(指纹密钥)添加到你终端的ssh配置目录下的known_hosts
文件中,这个文件的位置,对于Mac/Linux电脑,是在~/.ssh/known_hosts
,Windows的话则是在C:\Users\用户名\
目录下。
同理,现在是rsync登录你的ssh,所以rsync也会存储这样的指纹密钥,如果“StrictHostKeyChecking”设置为yes,就意味着每次都要严格检查密钥(就相当于你用终端登录时,每次都要你输入一遍yes),这样显然是没必要的,所以我们要把它设置为“StrictHostKeyChecking=no”。
default.direct模式:该模式我没有测试
sync {
default.direct,
source = "/home/user/src/",
target = "/home/user/trg/"
}
同时同步到多台机
格式如下,每台目标服务器一个sync模块即可,每个sync模块都像上边说的那样写就行,其实就只是ip不同,其他都一样:
-- Lsyncd本身的配置
settings {
}
-- B服务器配置
sync {
}
-- C服务器配置
sync {
}
-- D服务器配置
sync {
}
全量同步
由于各种原因,lsyncd可能不小心退出了,导致有数据未同步,如果出现这种情况,先重启启动lsyncd,然后用rsync命令先同步一次,这样两边都完全相同了
rsync -avz --partial --delete /data/wwwroot [email protected]::wwwroot/ --password-file=/etc/rsyncd.password
可能的报错
报错1
11月 21 23:11:58 la-pnzhost lsyncd[5699]: 23:11:58 Error: in Lua: /builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659: attempt to call field 'init' (a boolean value)
11月 21 23:11:58 la-pnzhost lsyncd[5699]: 23:11:58 Error: Backtrace 1 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:2659
11月 21 23:11:58 la-pnzhost lsyncd[5699]: 23:11:58 Error: Backtrace 2 :/builddir/build/BUILD/lsyncd-release-2.2.2/lsyncd.lua:4374
这个报错,是由于配置文件中指定了init=true
导致的,init
是初始化的意思,init=true
意思就是说在启动(初始化)后,如果源目录与目标目录文件有差异,则会把源目录有的而目标目录没有的文件同步过去。如果等于false,那就是启动时即使有区别,也不同步,只有启动以后修改的文件,才会同步。
按这个解释,指定init=true
不应该报错呀,而且我们也应该指定为true呀。是的,理论上是这样,但实际上它就是报错了,为什么呢?因为这是lsyncd 2.2.2
的bug!所以我们不要显式指定init=true
,直接不要设置它,它默认就是true,就不会报错。
报错2
Sat Nov 21 22:27:52 2020 Normal: recursive startup rsync: /data/wwwroot/ -> [email protected]::wwwroot/ excluding
.git/**
runtime/**
*.tmp
cache/**
.**
看上去没报错,但就是启动失败,有可能是因为目标服务器的/etc/rsyncd.secrets
文件权限不是600,sudo chmod 600 /etc/rsyncd.secrets
修改为600即可。
报错3
lsyncd Error: Terminating since out of inotify watches
该报错会导致lsyncd服务的进程直接关掉,导致无法同步,错误的原因是由于同步的文件数超过了inotify同时监听的文件数(lsyncd就是靠Linux中的inotify来识别文件变化的)。
解决方法是在/etc/sysctl.conf
文件中添加一行配置
fs.inotify.max_user_watches=999999999
添加后,保存,然后运行:
sysctl -p
它会把/etc/sysctl.conf
文件中的内容打印出来,如果能看到你添加的那一行,说明已经保存成功,现在可以再次启动lsyncd,试试,应该不会报错了。
报错4
@ERROR: auth failed on module wwwroot
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
Sun Sep 5 14:38:40 2021 Error: Temporary or permanent failure on startup of /data/wwwroot/ -> [email protected]::wwwroot/. Terminating since "insist" is not set.
这种报错是由于无法同步到目标机,导致lsyncd无法启动,你要检查一下同步的用户在目标机目录是否有权限,如果没有,那要想办法添加权限。
比如像我们的wwwroot目录,里面的文件所有者和所属组一般都配置为www:www
,而我们现在是用xiebruce用户去同步的,这肯定没有权限,我们需要让xiebruce加入www组,从而具有www组的权限。关于把用户添加到某个组,可以查看:Linux-让用户隶属于多个组/把用户添加到其它组。
另外,还要检查rsync服务器端的rsyncd.conf
里面引用的文件是否存在,权限是否正常,比如/etc/rsyncd.secrets
。
你好,启动后都出现以下这个错误,用的是Centos7最新版,试了两台机器都一样,不知是怎么回事。。
lsyncd -log Exec /etc/lsyncd.conf
Error: failure getting absolute path of [/var/www/html]
Error: Cannot access source directory: /var/www/html
应该是没权限读取你这个目录:/var/www/html,另外,确定目录存在吗?
rsh = “/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no” 你好 这一行是什么意思 ,我现在想在同步完文件 执行某个重启的命令(shell命令) 应该使用什么参数呢?谢谢
这是ssh登录的参数,因为这是rsync通过ssh通道来传输,我已经在那句下边添加了解释了,你直接看文章中的解释吧。
明白了 如果用rsync方式是不用写这个参数的。另外再问一下 我如果只想监控某个目录下的文件是否被修改,如果被修改 便执行某个shell命令 而不是同步 应该怎么操作
这个我不知道,我写这文章也只是我用到了,记下来,并不是专门研究这个的,这个得你自己去查资料了
好 谢谢~