CentOS搭建lsyncd实时同步——取代rsync+inotify
编辑:狂族晨曦 来源:系统运维,经验杂笔 日期:2018-02-08 阅读: 7,687 次 3 条评论 » 百度已收录
昨天先森发布了“CentOS下inotify+rsync实现文件实时同步”,inotify+rsync实时同步的方案是用shell在后台常驻来实现实时同步,没有守护进程,感觉不是很靠谱,如果脚本突然挂了,实时同步岂不是GG了?所以先森在实现了inotify+rsync后还是再找其他的解决方案。
其实在找到lsyncd之前,先森先找到了sersync这个工具,但是好像这个工具很久没有更新了,所以虽然也有较多好评,但是先森目前还是先研究lsyncd了。
当然,无论是sersync还是lsyncd,其实都是对inotify这个内核中的文件事件监控系统进行了封装,类似inotify-tools,给我们提供的是封装好了的inotify+rsync工具。sersync是用C写的,lsyncd是使用lua语言封装的。
搭建lsyncd实时同步
lsyncd
lsyncd项目也托管在GitHub上面,具体地址是https://github.com/axkibe/lsyncd,一会儿若是要编译安装也需要去这个地方。
上文也说过,lsyncd是使用lua语言封装的,所以初识lsyncd的配置文件时,还是有点不习惯,但是用久应该就还好了。
lsyncd不仅仅是实现两台服务器的同步的,它还能够在一台服务器内对两个文件夹进行同步,这里可以是cp,也可以是rsync。两台或多台服务器间可以是rsync,也可以是rsyncssh。本文主要讲的是两台服务器间的rsync。
lsyncd可以配置inotify检测到文件变动后多少秒才执行同步,也就是时间延迟。也可以配置文件变动个数达到多少个后立即执行同步,无论有没有到达前面的时间延迟的要求,这就是累计触发事件次数。这两个配置可以减少rsync的同步,避免海量文件同步时rsync的频繁发送文件对比列表。
lsyncd安装
lsyncd的安装方式有两种,yum安装和编译安装。
yum安装:
yum安装也有两种方式,一个是阿里云的镜像源,一个是fedoraproject的镜像源。
阿里云:
#CentOS 7 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #CentOS 6 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo #yum 安装 yum install lsyncd -y
fedoraproject:
#只找到CentOS 6的 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install lsyncd -y
编译安装:
1、首先还是去上文提到的GitHub上下载项目,通过下面的下载就是最新的了:
wget https://github.com/axkibe/lsyncd/archive/master.zip
2、下载了软件包,先别急着安装,上文提到了几次,lsyncd是用lua语言封装的,所以还需要安装lua环境。另外lsyncd不是使用的make,而是cmake,所以也需要安装cmake。
yum install -y lua lua-devel asciidoc cmake
3、下载了软件包,装好了环境依赖,下面就是编译安装:
unzip lsyncd-master.zip cd lsyncd-master cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd make && make install
安装好了的lsyncd在/usr/local/lsyncd下。配置文件、日志文件夹等需要我们自己定义与创建。
4、配置文件。先森的配置文件是用于两台服务器间实时同步的,使用的是rsync模式。
lsyncd的配置文件其实有点类似nginx,如nginx的server可以多定义互不冲突一样,lsyncd也可以多个定义。
settings { logfile ="/usr/local/lsyncd/logs/lsyncd.log", statusFile ="/usr/local/lsyncd/logs/lsyncd.status", inotifyMode = "CloseWrite or Modify", maxProcesses = 15, } sync { default.rsync, source = "/web/data/ftp", target = "user@172.17.8.16::datahome", delete="running", exclude = { ".*", ".tmp","*.swp","*.swx" }, delay = 0, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsyncd/rsync.passwd", } }
注释版:
settings { --定义日志文件 logfile ="/usr/local/lsyncd/logs/lsyncd.log", --定义状态文件 statusFile ="/usr/local/lsyncd/logs/lsyncd.status", --指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify --这个就是使用的inotify能监控的事件 inotifyMode = "CloseWrite or Modify", --同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程 maxProcesses = 15, --(这个配置先森没有使用)累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。 --maxDelays=10, } sync { --使用rsync通过daemon方式连接远程rsyncd进程; default.rsync, --同步的源目录,使用绝对路径。 source = "/web/data/ftp", --定义目的地址,对应不同的模式有不同的写法。这里是远程rsync,使用“用户名@ip::模块名”写法。 target = "user@172.17.8.16::datahome", --是否同步删除,除了running选项,还有true、false和startup,这个配置先森不是很明白,大概是true是完全同步删除,false是不允许删除,startup和running要难理解一些\ --先森的理解是,startup是仅在启动时将源目录和目的目录来一次完全同步,lsyncd运行时的源目录的删除文件在目的目录中不做删除操作\ --running是启动时不对源、目的目录进行完全同步,lsyncd运行时源目录删除的文件,目的目录也会被删除。 delete="running", --排除的文件,这里排除了一些隐藏文件,和文件打开是时的临时文件 exclude = { ".*", ".tmp","*.swp","*.swx" }, -- 累计事件,等待rsync同步延时时间,默认15秒。先森配置的是0,也就是实时同步。 delay = 0, rsync = { --本地rsync命令路径 binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, --远程rsyncd的密码 password_file = "/etc/rsyncd/rsync.passwd", } }
5、启动lsyncd
/usr/local/lsyncd/bin/lsyncd -log Exec /usr/local/lsyncd/lsyncd.conf
也可以自己创建一个启动脚本,脚本内容如下,是先森从yum安装的lsyncd拷贝的,一样的可以使用。
只是用之前,需要对lsyncd守护命令与配置文件先做个软连接,免得需要修改启动脚本:
ln -s /usr/local/lsyncd/bin/lsyncd /usr/bin/lsyncd ln -s /usr/local/lsyncd/lsyncd.conf /etc/lsyncd.conf
启动脚本:
#!/bin/bash # # chkconfig: - 85 15 # description: Lightweight inotify based sync daemon # # processname: lsyncd # config: /etc/lsyncd.conf # config: /etc/sysconfig/lsyncd # pidfile: /var/run/lsyncd.pid # Source function library . /etc/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf" if [ -e /etc/sysconfig/lsyncd ]; then . /etc/sysconfig/lsyncd fi RETVAL=0 prog="lsyncd" thelock=/var/lock/subsys/lsyncd start() { [ -f /etc/lsyncd.conf ] || exit 6 echo -n $"Starting $prog: " if [ $UID -ne 0 ]; then RETVAL=1 failure else daemon ${LSYNCD_USER:+--user ${LSYNCD_USER}} /usr/bin/lsyncd $LSYNCD_OPTIONS RETVAL=$? [ $RETVAL -eq 0 ] && touch $thelock fi; echo return $RETVAL } stop() { echo -n $"Stopping $prog: " if [ $UID -ne 0 ]; then RETVAL=1 failure else killproc lsyncd RETVAL=$? [ $RETVAL -eq 0 ] && rm -f $thelock fi; echo return $RETVAL } reload(){ echo -n $"Reloading $prog: " killproc lsyncd -HUP RETVAL=$? echo return $RETVAL } restart(){ stop start } condrestart(){ [ -e $thelock ] && restart return 0 } case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; condrestart) condrestart ;; status) status lsyncd RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" RETVAL=1 esac exit $RETVAL
优化
因为lsyncd其实也是用到了inotify,所以和inotify+rsync方案一样,我们还是需要对服务器的inotify内核配置进行优化。
inotify检查磁盘变动是有队列等值的配置的,inotify默认内核参数值太小,会导致实际检测的时候报错。
查看系统默认参数值
sysctl -a | grep max_queued_events sysctl -a | grep max_user_watches sysctl -a | grep max_user_instances
临时修改
sysctl -w fs.inotify.max_queued_events="99999999" sysctl -w fs.inotify.max_user_watches="99999999" sysctl -w fs.inotify.max_user_instances="65535"
固定修改:vim /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999 fs.inotify.max_user_watches=99999999 fs.inotify.max_user_instances=65535
其他
官方配置文件wiki:
https://axkibe.github.io/lsyncd/manual/config/file/
转载请注明出处来自https://www.capjsj.cn/lsyncd.html
希望能学有所成。
我有两个服务器A和B,上面都启动了lsync和rsync,现在发现一个问题。
我1点启动同步任务,进程OK文件都是正常同步的,但是在2点的时候同步进程死掉,这期间文件发生了变化(文件夹里多了好多的新文件)。然后我3点的时候重启了同步任务,此时在A或者B上文件变化都会同步,但是2~3点进程死掉之间的文件变化,却迟迟不见同步,请问怎么办?
前不久我也刚搞完这个