rsync+inotify安装和配置
说明:
开发者提出要求:要将测试机94上的代码数据拷贝到线上服务器
拷贝数据的方法有很多,比如:scp,cp等,但是像scp,cp这种工具在拷贝的时候会把所有数据都拷一遍,速度比较慢,而rsync在拷贝的时候只是拷贝不同的数据(也就是被改过的数据),所以这里使用rsync来进行线上数据的拷贝
环境:
centos 6.4
步骤:
注意:这里采用的是rpm包安装方式(源码方式,rpm方式都差不多)
1、 服务端配置:
注意:测试机94是服务端,而其他所有的线上服务器为rsync客户端
[root@scj ~]# yum -y install rsync
[root@scj ~]# rpm -ql rsync #查看rsync包安装出了哪些文件
/etc/xinetd.d/rsync #xinetd管理rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.0.6
/usr/share/doc/rsync-3.0.6/COPYING
/usr/share/doc/rsync-3.0.6/NEWS
/usr/share/doc/rsync-3.0.6/OLDNEWS
/usr/share/doc/rsync-3.0.6/README
/usr/share/doc/rsync-3.0.6/support
/usr/share/doc/rsync-3.0.6/support/Makefile
/usr/share/doc/rsync-3.0.6/support/atomic-rsync
/usr/share/doc/rsync-3.0.6/support/cvs2includes
/usr/share/doc/rsync-3.0.6/support/deny-rsync
/usr/share/doc/rsync-3.0.6/support/file-attr-restore
/usr/share/doc/rsync-3.0.6/support/files-to-excludes
/usr/share/doc/rsync-3.0.6/support/git-set-file-times
/usr/share/doc/rsync-3.0.6/support/logfilter
/usr/share/doc/rsync-3.0.6/support/lsh
/usr/share/doc/rsync-3.0.6/support/mnt-excl
/usr/share/doc/rsync-3.0.6/support/munge-symlinks
/usr/share/doc/rsync-3.0.6/support/rrsync
/usr/share/doc/rsync-3.0.6/support/rsyncstats
/usr/share/doc/rsync-3.0.6/support/savetransfer.c
/usr/share/doc/rsync-3.0.6/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
[root@scj ~]# vi /etc/xinetd.d/rsync #修改文件,让xinetd来管理rsync
将disable = yes 改为 disable = no
[root@scj ~]# yum -y install xinetd #安装xinetd,用来管理rsync
[root@scj ~]# vi /etc/rsyncd.conf #创建配置文件,默认是不存在的
uid = root gid = root user chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/run/rsyncd.log [data] path = /data/ ignore errors read only = no list = no hosts allow = 192.168.186.0/255.255.255.0 auth users = scj secrets file = /etc/rsyncd.password
注意:auth users = scj 这一行一定要有,否则任何账号不用密码都可以访问rsync服务端;这样就只有scj这一个账号可以访问了
[root@scj ~]# vi /etc/rsyncd.password #创建密码文件,用户名:密码
scj:scj
[root@scj ~]# chmod 600 /etc/rsyncd.password #密码文件的权限必须是600,否则会有问题
[root@scj ~]# mkdir /data #创建共享目录
[root@scj ~]# chkconfig xinetd on
[root@scj ~]# /etc/init.d/xinetd start #启动rsync
[root@scj ~]# netstat -tlnpa | grep 873 #rsync监听873端口
tcp 0 0 :::873 :::* LISTEN 13613/xinetd
2、 客户端配置:
注意:客户端只需要安装rsync,不需要启动rsync
[root@scj ~]# yum -y install rsync
[root@scj ~]# vi /etc/rsyncd.password #创建密码文件,只需要写密码即可
scj
[root@scj ~]# chmod 600 /etc/rsyncd.password #修改权限
使用:
注意:所有的rsync同步数据的命令都是在rsync客户端执行的,无论任何时候
在随便一台线上服务器进行以下操作:
[root@scj ~]# rsync -avz --password-file=/etc/rsyncd.password scj@xxx.xxx.xxx.94::data /tmp/ceshi/
注解:将服务端94,data模块下/data/目录的数据拷贝到本地的/tmp/ceshi/目录下
-v, --verbose详细模式输出
-a, --archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变
-z, --compress对备份的文件在传输时进行压缩处理
--delete:删除那些DST中存在而在SRC中没有的文件,以源端(可能是客户端或者服务端)为主,保证源端与目的端数据一致
--password-file:不用再交互式输入密码
rsync -avz --password-file=/etc/rsyncd.password /tmp/ceshi/ scj@xxx.xxx.xxx.94::data
注意:有/ 与没有/ 的区别
/tmp/ceshi/: 是将/tmp/ceshi/目录下的数据拷贝过去
/tmp/ceshi:是将/tmp/ceshi/这个目录拷贝过去
在每台线上服务器创建一个同步数据的脚本:
[root@scj ~]#mkdir -p /var/scripts/rsync
[root@scj ~]# cd /var/scripts/rsync
[root@scj rsync]# vi rsync.sh
#!/bin/bash #同步94测试机数据到本地 passwdfile=/etc/rsyncd.password user=scj remoteip=192.168.186.129 dir=/tmp/ceshi/ /usr/bin/rsync -avz --password-file=$passwdfile $user@$remoteip::data $dir
[root@scj rsync]# chmod 755 rsync.sh
附加:
rsync作为拷贝工具的其他用法:
[root@scj ~]# rsync install.log /tmp/ceshi/ #将本地当前目录下的install.log 拷贝到/tmp/ceshi/ 目录下
[root@scj ~]# rsync -avz -e 'ssh -p2222' root@192.168.186.129:/data /tmp/ceshi/ #当以ssh认证进行传输时,若ssh的端口不是22端口,而是2222端口,则用-e指定
##指定密钥文件 rsync -az -e 'ssh -i /home/shic/.ssh/id_rsa' $1 shic@172.17.24.2:$2
inotify:
wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz tar xzvf inotify-tools-3.14.tar.gz cd inotify-tools-3.13 ./configure make make install
[root@10-10-150-230 scripts]# cat inotifyrsync.sh #!/bin/bash host1=10.10.191.224 src=/opt/tomcat7/webapps/ dst1=web2 user=rsync /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib,move --fromfile "/etc/inotify_exclude.list" $src \ | while read files do /usr/bin/rsync -vzrtopg --delete --progress --exclude-from="/etc/rsync_exclude.list" --password-file=/etc/rsync.pas $src $user@$host1::$dst1 echo "${files} was rsynced" >> /data/rsyncd/logs/rsync.log 2>&1 done [root@10-10-150-230 scripts]# cat /etc/inotify_exclude.list @/opt/tomcat7/webapps/ROOT.war @/opt/tomcat7/webapps/ROOT.tar.gz [root@10-10-150-230 scripts]# cat /etc/rsync_exclude.list ROOT.war *.tar.gz
nohup /root/scripts/inotifyrsync.sh &
注释:
inotifywait 有 –fromfile 选项, 可以直接从文件中读入要监控的目录,和排除的目录. 在这里我使用 –fromfile ‘/tmp/inotify-file-list’ 选项 /tmp/inotify-file-list 文件的内容如下: /tmp/inotify-test-dir @/tmp/inotify-test-dir/cache 以@开头的路径代表的是要排除的目录和文件,其他的为要监控的文件 假如:我要递归监控 /tmp/inotify-test-dir 目录下的所有的所有的 .php 文件, 但是排除 /tmp/inotify-test-dir/cache 目录下的所有文件
参考:http://www.51ou.com/browse/linuxjq/30454.html