使用rsync+inotify-tools+ssh实现文件实时同步

 在某些服务器架构中,会遇到文件同步问题,例如须要作站点镜像备份,同步文件到多个CDN节点等。须要解决的主要有两个问题
1.如何实现文件同步问题? 2.什么时候执行同步操做
    文件同步可使用rsync+ssh,何时自行同步操做呢?可能部分人会想到cron,这个没错,能够实现的,可是确实有点浪费资源,由于 cron并不知道文件是否被修改过,只是不停的周期性的执行,若是文件修改后再执行同步操做,不修改就不执行那应该比较好,其实inotify就能够作 到,只要你的服务器不是古董级别的,就支持inotify,来几句没用的话:
    Inotify 是一个 Linux特性,它监控文件系统,而且及时向专门的应用程序发出相关的事件警告,好比删除、读、写和卸载操做等。Inotify 反应灵敏,用法很是简单,而且比 cron 任务的繁忙轮询高效得多。

web

    假设某服务器架构中有两台web服务器(IP为192.168.1.252和192.168.1.254),一台代码更新发布服务器(IP为192.168.1.251),须要同步的目录是/data/www/,结构图以下:服务器

rsync文件同步

下面介绍一下安装步骤
在代码发布服务器(192.168.1.251)上安装inotify,执行以下命令
tar xzvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
cd ..
在全部服务器上(代码发布服务器和须要同步的服务器)上安装rsync,命令以下:
tar zxvf rsync-3.0.9.tar.gz
cd rsync-3.0.9
./configure
make
make install
#------以上命令在每台服务器上都须要执行---------

在代码发布服务器与须要同步的服务器之间配置ssh key信任,在代码发布服务器上生成公钥和私钥
ssh-keygen -t rsa
直接三次回车
将公钥添加到各个须要更新的主机authorized_keys 文件中,在代码更新服务器上再执行
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.252
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.254
若是有提示 输入yes
按提示输入密码回车
而后两台须要web服务器(192.168.1.252和192.168.1.254 )重启ssh
service sshd restart
在代码发布服务器上以root身份建立inotify_rsync.sh脚本vi /root/inotify_rsync.sh 输入

#!/bin/sh
SRC=/data/www/    #代码发布服务器目录
DST=/data/www/    #目标服务器目录
IP="192.168.1.252 192.168.1.254"    #目标服务器IP,多个以空格隔开
USER=root
/usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)" \
-e create,move,delete,close_write,attrib $SRC | while read files
do
for i in $IP
do
    /usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
    echo $files >>/tmp/rsync.log 2>&1
done
done

相关解释:
/usr/local/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e' --exclude "(.swp|.swx|.svn)" \
-e create,move,delete,close_write,attrib $SRC | while read files

 -m 是保持一直监听
 -r 是递归查看目录
 -q 是打印出事件
 -e create,move,delete,close_write,attrib 是指 “监听 建立 移动 删除 写入 权限” 事件
 
/usr/local/bin/rsync -ahqzt --exclude Runtime --delete $SRC $USER@$i:$DST
 -a 存档模式
 -h 保存硬链接
 -q 制止非错误信息
 -z 压缩文件数据后传输
 -t 维护修改时间
 -delete 删除于多余文件
架构

--exclude 排除同步的文件ssh

 

而后赋予脚本可执行权限
chmod +x /root/inotify_rsync.sh
设置开机自启动 echo "/root/inotify_rsync.sh &" >> /etc/rc.local
执行脚本/root/inotify_rsync.sh &
svn

在代码更新服务器的/data/www/目录中建立文件,测试效果。测试

相关文章
相关标签/搜索