Linux下触发式文件同步的实现
 阿里云技术支持中心:章阿贵
 
 当大家使用阿里云的SLB的时候就会遇到文件同步的问题,一般我们会选择Rsync进行定期同步,单这样的同步频率和效率对业务影响往往较大,因此这里简单介绍下Linux下触发同步的实现方式以及其他在该特性基础上实现文件防篡改的方式。
 
 一、什么是rsync
 Rsync(remotesynchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 使用所谓的“Rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送个文件的不同部分,而不是每次都整份传送,因此速度相当快。rsync 同时也在拷贝文件时,加--partial可支持断点续传,比cp要好多了,同时也rsync也可以拷贝链接文件,这一点是cp做不到的。
 
 二、什么是inotify
 inotify 是文件系统事件监控机制,作为 dnotify 的有效替代。dnotify 是较早内核支持的文件监控机制。Inotify 是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。
 
 三、配置rsync + inotify触发式同步
 前提条件,linux内核版本高于2.6.13才能支持inotify特性
 由于执行脚本需要输入目标服务器口令,因此我们需要先配置无密码登录
 执行ssh-keygen -t rsa,一路回车生成公钥与密钥
 执行ssh-copy-id -i~/.ssh/id_rsa.pub root@被控端IP 拷贝公钥到被控端
需要输入被控端密码
下载所需的程序:
Inotify-toolshttps://github.com/rvoicilas/inotify-tools/wiki
Rsynchttp://rsync.samba.org/ftp/rsync
安装所需程序:
tarzxvf rsync-3.1.1.tar.gz
cdrsync-3.1.1
./configure–prefix=/usr/local/rsync
make&& make install
tarzxvf inotify-tools-3.14.tar.gz
cdinotify-tools-3.14
./configure
make&& make install
配置同步脚本(以下内容保存为sh文件,例如rsync.sh):
#!/bin/sh
#源目录
src=/home/wwwroot/
#目标目录
des=/home/wwwroot
#目标IP
ip=192.168.1.2
ip2=192.168.1.3
#设置inotifywait可以监视的文件数量
echo 50000000 >/proc/sys/fs/inotify/max_user_watches
#设置inotify实例事件(event)队列可容纳的事件数量
echo 327679 >/proc/sys/fs/inotify/max_queued_events
 
/usr/local/bin/inotifywait -mrq--timefmt '%d/%m/%y %H:%M' --format  '%T%w%f' -e modify,delete,create,attrib ${src} | while read  file
       do
                rsync -avz --delete --progress${src} root@${ip}:${des} &&
                echo "${src} wasrsynced"
                echo"-----------------------------------------------------"
                rsync -avz --delete --progress${src} root@${ip2}:${des} &&
                echo "${src} wasrsynced"
                echo"-----------------------------------------------------"
       done
将脚本添加到随机启动文件/etc/rc.local中,执行nohup sh rsync.sh &即后台执行
脚本相关注释:
   -m 是保持一直监听
   -r 是递归查看目录
   -q 是打印出事件~
   rsync -aHqzt $SRC $DST
   -a 存档模式
   -H 保存硬连接
   -q 制止非错误信息
   -z 压缩文件数据在传输
   -t 维护修改时间
   -delete 删除于多余文件
当要排出同步某个目录时,为rsync添加--exclude=PATTERN参数,注意,路径是相对路径。详细查看man rsync
当要排除都某个目录的事件监控的处理时,为inotifywait添加--exclude或--excludei参数。详细查看man inotifywait
注意:inotifywait可以监视文件的动作有:
        access         文件或目录的内容被读
        modify         文件或目录的内容被写
        attrib          文件或目录的属性被修改
        close_write     文件或目录以可写模式关闭
        close_nowrite   文件或目录以只读模式关闭
        close           文件或目录关闭,不管是什么模式
        open            文件或目录被打开
        moved_to        文件或目录移入监控目录
        moved_from      文件或目录移出监控目录
        move            文件或目录移动
        create           文件或目录创建
        delete          文件或目录在监控目录中删除
        delete_self       文件或目录删除
        unmount         未挂载的文件或目录
四、其他
1、高效触发式同步软件sersync2
下载地址:https://code.google.com/p/sersync/downloads/list
程序包含2个文件:confxml.xml配置文件和sersync2执行程序
配置文件说明:
 修改sshstart="true'以SSH方式传输文件
 <rsync>
     <sshstart="true"/>
 </rsync>
 开启文件过滤
 <filter start="true">
 <excludeexpression="^info/*"></exclude>
 <excludeexpression="(.*)\.gz"></exclude>
 </filter>
 同步源目录和目标目录设置
 <localpath watch="/home/wwwroot">
 <remote ip="192.168.1.2"name="/home/wwwroot"/>
 </localpath>
执行程序:
执行前如果是SSH传输先配置好SSH免密码登陆
./sersync2–d 后台执行
./sersync2–r 先执行一次完整同步
./sersync2–o confxml.xml 指定配置文件
./sersync2–n num 指定线程数,默认10个线程
监控程序:
checksersync.sh
执行后会判断进程中是否有sersync2存在,没有就自动执行
如果有修改过配置文件名称,那么相应监控脚本内也需要修改对应
2、防篡改的实现
通过Inotiry和Rsync我们可以实现文件同步,根据Inotiry的特性我们也可以实现文件的放篡改,方法是将脚本中SCP反向传输即可,例如:
rsync -avz --delete --progressroot@${ip}:${des} ${src} &&
 
实现图例:
WEB服务器检测到行为1执行行为2
防篡改源服务器检测到行为3执行行为2
