文件实时同步对于运维是个很常见的需求。 如集群的机器,须要上传个文件,以前的步骤是每台服务器分别上传。 作文件同步之后,只上传一台,其余机器自动同步。 目前实现实时同步的主流方案有 rsync+inotify、sersync、lsyncd。
rsync + inotify 是最多见的方案。 Inotify 是一个 Linux 内核特性,它监控文件系统,而且及时向专门的应用程序发出相关的事件警告,好比删除、读、写和卸载操做等 本准备试验一下,在网上看到以下评价: 当向监控目录下拷贝复杂层次目录(多层次目录中包含文件),或者向其中拷贝大量文件时,inotify常常会随机性地遗漏某些文件。这些遗漏掉的文件因为未被监控到,全部监控的后续操做都不会执行,例如不会被rsync同步。
这是国人开发的实时同步工具。优势以下: 1.sersync是使用c++编写,并且对linux系统文件系统产生的临时文件和重复的文件操做进行过滤,因此在结合rsync同步的时候,节省了运行时耗和网络资源。所以更快。 2.配置简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用便可。 3.使用多线程进行同步,尤为在同步较大文件时,可以保证多个服务器实时保持同步状态。 4.有出错处理机制,经过失败队列对出错的文件从新同步,若是仍旧失败,则按设定时长对同步失败的文件从新同步。 5. 自带crontab功能,只需在xml配置文件中开启,便可按您的要求,隔一段时间总体同步一次。无需再额外配置crontab功能。
ip | 目录 | 角色 |
---|---|---|
192.168.1.2 | /home/work | 同步机 |
192.168.1.3 | /home/work | 被同步机 |
基于Centos6 ,使用 sersync + rsync 将 192.168.1.2 的 /home/work 目录实时同步到 192.168.1.3 的 /home/work 目录下。php
192.168.1.3 被同步机操做css
yum install rsync -y
vim /etc/rsyncd.conflinux
log file = /var/log/rsyncd.log #日志文件 pidfile = /var/run/rsyncd.pid #pid 文件 lock file = /var/run/rsync.lock #锁文件 secrets file = /etc/rsync.pass #认证文件 max connections = 0 # 链接数限制,0即不限制 [dubbo] # 模块名 path = /home/work # 同步目录 comment = dubbo # 注释,要与模块名一致 uid = root #设置rsync运行权限 gid = root port = 873 use chroot = no read only = no list = no timeout = 600 auth users = xx # 认证用户 hosts allow =192.168.1.2 # 容许同步的机器 hosts deny = 0.0.0.0/32
vim /etc/rsync.passc++
xx:abc123 #对应rsyncd.conf 的 auth users
设置文件权限shell
chmod 600 /etc/rsyncd.conf chmod 600 /etc/rsync.pass
启动express
rsync --daemon
192.168.1.2 同步端操做vim
yum install rsync -y rsync --daemon echo "abc123" > /etc/passwd.txt chmod 600 /etc/passwd.txt
sersync
如下解释下配置文件tomcat
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> #是否开启debug模式,默认未开启 <fileSystem xfs="false"/> # 文件系统是xfs的要开启才能正常工做 <filter start="true"> #是否开启文件过滤,以下几种类型能够根据本身须要进行修改。 <exclude expression="(.*)\.out"></exclude> #过滤.out文件,如tomcat的catalina.out,微服务的nohup.out <exclude expression="(.*)\.gz"></exclude> #过滤.gz文件 <exclude expression="^logs/*"></exclude> #过滤logs目录,如tomcat的logs目录 <exclude expression="^static/*"></exclude> #同上解释 </filter> <inotify> # inotify的选项,默认便可 <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="false"/> <modify start="false"/> </inotify> <sersync> <localpath watch="/home/work/"> # 要同步的目录 <remote ip="192.168.1.3" name="dubbo"/> # 要同步的服务器,及rsyncd.conf 模块名 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # 这里使用的是 rsync daemon 去同步,而不是ssh,因此要指定 passwordfile文件 <commonParams params="-artuz"/> <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.log" timeToExecute="60"/><!--default every 60mins execute once--> # 同步错误日志 <crontab start="true" schedule="600"><!--600mins--> #是否开启全盘同步。 <crontabfilter start="false"> #若是开启了全盘同步,这里也要开启,并设置与上面一致的过滤类型。 <exclude expression="*(.*)\.out"></exclude> <exclude expression="^logs/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head>
执行同步bash
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
监控脚本
vim /home/check_sersync.sh服务器
#!/bin/bash sersync="/usr/local/sersync/sersync2" confxml="/usr/local/sersync/confxml.xml" status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l) if [[ $status -eq 0 ]]; then $sersync -d -r -o $confxml & else exit 0; fi
添加执行权限
chmod +x /home/check_sersync.sh
设置定时任务
crontab -e
每隔两分钟执行一次 */2 * * * * /bin/bash /home/check_sersync.sh > /dev/null 2>&1
Lysncd 其实是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及之后)里的 inotify 触发机制,而后经过rsync去差别同步,达到实时的效果。我认为它最使人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 经过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua自己就是一种配置语言,可读性很是强。lsyncd也有多种工做模式能够选择,本地目录cp,本地目录rsync,远程目录rsyncssh。
这个比sersync设置简单些。
被控制端与如上一致。
同步机设置以下:
yum install lsyncd -y
vim /etc/lsyncd.conf
settings { logfile = "/tmp/lsyncd.log", #日志 statusFile = "/tmp/lsyncd.status", #记录同步的文件和目录 pidfile = "/var/run/lsyncd.pid", statusInterval = 1, #将lsyncd的状态写入上面的statusFile的间隔,默认10秒 nodaemon = false, inotifyMode = "CloseWrite", #指定inotify监控的事件,默认是CloseWrite,还能够是Modify或CloseWrite or Modify maxProcesses = 1, #同步进程的最大个数 maxDelays = 1, #累计到多少所监控的事件激活一次同步,即便后面的delay延迟时间还未到 } sync { default.rsync, source = "/home/work/", delete = true, target = "xx@192.168.1.3::dubbo", # 认证用户,被同步的服务器,同步的模块名 -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", #要同步的文件或目录列表,我测试lsyncd过滤并很差用,不清楚是哪里的问题。 rsync = { binary = "/usr/bin/rsync", archive = true, compress = false, owner = true, perms = true, whole_file = false, password_file = "/etc/passwd.txt" } }
启动即同步
/etc/init.d/lsyncd start
我我的测试