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