rsync+inotify实现在Linux上文件实时同步

jopen 10年前

首先下载好两个工具:

rsync地址: http://rsync.samba.org/download.html

inotify-tools: http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

这次的实验主要有两台机器,172.16.54.114172.16.54.115,我们把115做为源服务器,114做为目标服务器

主要是把115/home/md中的所有数据实时同步到114上的/home/md

1,先关闭防火墙

vi /etc/selinux/config #编辑防火墙配置文件

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq! #保存,退出

setenforce 0 #立即生效

 

2,查看端口是否被占用(直接在命令行输入)及安装

netstat –apn | grep 873

 

安装rsync,在两台服务器上都要进行这个步骤

首先将下载的包解压

tar -xzvf  rsync-3.1.0.tar.gz

解压后进入目录

./configure --prefix=/usr/local/rsync

 

#说明安装在/usr/local/rsync目录中

在这一步之前要安装相对就的gccgcc-c++

make

make install

安装完毕

 

chkconfig rsync on #随系统启动

这个只在114上做

创建rsync配置文件rsync.conf

vi /etc/rsyncd.conf #创建配置文件,添加以下代码

log file = /var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建

pidfile = /var/run/rsyncd.pid  #pid文件的存放位置

lock file = /var/run/rsync.lock  #支持max connections参数的锁文件

secrets file = /etc/rsync.pass  #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件

motd file = /etc/rsyncd.Motd  #rsync启动时欢迎信息页面文件位置(文件内容自定义)

[md] #自定义名称

path = /home/md/ #rsync服务端数据目录路径

comment = md #模块名称

uid = root #设置rsync运行权限为root

gid = root #设置rsync运行权限为root

port=873  #默认端口

use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份

read only = no  #设置rsync服务端文件为读写权限

list = no #不显示rsync服务端资源列表

max connections = 200 #最大连接数

timeout = 600  #设置超时时间

auth users = md #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开

hosts allow = 172.16.54.114  #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

#hosts deny = 218.234.1.254 #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开(这个比较随便,也可以没有)

:wq!  #保存,退出

 

创建用户认证文件

vi /etc/rsync.scrt  #配置文件,添加以下内容

md:123456 #格式为 用户:密码,如果是多个,可以一行一个

:wq!  #保存,退出

chmod 600 /etc/rsyncd.conf  #设置文件所有者读取、写入权限

chmod 600 /etc/rsync.scrt  #设置文件所有者读取、写入权限

 

在此,我们普及一个问题,我们先进入/etc/xinetd.d文件中,可以看到rsync这个文件,说明rsync是由xinetd管理,可以通过xinetd来启动rsync

/etc/init.d/xinetd start  #启动

service xinetd stop   #停止

service xinetd restart #重新启动

------------------------只在114上进行的到此为止--------------------

 

以下只到115上进行

vi /etc/rsync.scrt  #编辑文件,添加以下内容

123456 #密码

:wq! #保存退出

chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可

inotify-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

 

上传inotify-tools-3.14.tar.gz/usr/local/src目录下

cd /usr/local/src

tar zxvf inotify-tools-3.14.tar.gz  #解压

cd inotify-tools-3.14 #进入解压目录

./configure --prefix=/usr/local/inotify  #配置

make  #编译

make install  #安装

3、设置系统环境变量,添加软连接

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh

source /etc/profile.d/inotify.sh  #使设置立即生效

echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf

ln -s /usr/local/inotify/include  /usr/include/inotify

4、修改inotify默认参数(inotify默认内核参数值太小)

查看系统默认参数值

sysctl -a | grep max_queued_events

结果是:fs.inotify.max_queued_events = 16384

sysctl -a | grep max_user_watches

结果是:fs.inotify.max_user_watches = 8192

sysctl -a | grep max_user_instances

结果是:fs.inotify.max_user_instances = 128

修改参数:

sysctl -w fs.inotify.max_queued_events="99999999"

sysctl -w fs.inotify.max_user_watches="99999999"

sysctl -w fs.inotify.max_user_instances="65535"

参数说明:

max_queued_events

inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

max_user_watches

要同步的文件包含多少目录,可以用:find /home/www.osyunwei.com -type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/www.osyunwei.com为同步文件目录)

max_user_instances

每个用户创建inotify实例最大值

 

5、创建脚本,实时触发rsync进行同步

vi /usr/local/inotify/rsync.sh   #编辑,添加以下代码

#!/bin/sh

srcdir=/home/md/

dstdir=buspos

rsyncuser=buspos

rsyncpassdir=/etc/rsync.scrt

dstip="172.16.54.114"

for ip in $dstip

do

rsync -avH --port=873 --progress --delete  $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir  //次数的password-file是服务端的密码文件

done

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srcdir |  while read file

do

for ip in $dstip

do

rsync -avH --port=873 --progress --delete  $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir

echo "  ${file} was rsynced" >> /tmp/rsync.log 2>&1

done

done

 

 

 

chmod +x /usr/local/inotify/rsync.sh   #添加脚本执行权限

 

6、设置脚本开机自动执行

vi /etc/rc.d/rc.local  #编辑,在最后添加一行

sh /usr/local/inotify/rsync.sh & #设置开机自动在后台运行脚本

:wq!  #保存退出

启动脚本

nohup  . /usr/local/inotify/rsync.sh &

 

关闭了窗口也没事,已在后台运行下次开机自动启动

 

 

 

也可以参照此博客:http://dl528888.blog.51cto.com/2382721/771533

还有这个,建议参考这个文档:http://ixdba.blog.51cto.com/2895551/580280/