rsync + inotify简介

inotify是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要。在单独使用rsync同步时,每次同步它会把全部的文件读取一遍,而inotify+rsync同步是触发式同步。

 

 Rsync是一个远程同步工具,融合了cp,和scpRsync 使用所谓的“ Rsync 演算法 ”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsyncserver 的机器也叫backupserver ,一个 Rsyncserver 可同时备份多个 client 的数据;也可以多个 Rsync server 备份一个client 的数据。特点:1、可以镜像保存整个目录树或文件系统;2、较高的数据传输效率;3、可以借助于ssh实现安全数据传输;4、支持匿名传输;

 

rsync命令的工作模式:

              第一种模式:shell模式,也称作本地模式;

              第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;

              第三种模式:列表模式,仅列出源中的内容,-nv

              第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求

rsync命令的选项:

              -n: 同步测试,不执行真正的同步过程;

              -v: 详细输出模式

              -q: 静默模式

              -c: checksum,开启校验功能

              -r: 递归复制

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;

 

              -a: 归档,保留文件的原有属性;

              -p: 保留文件的权限;

              -t: 保留文件的时间戳;

              -l: 保留符号链接

              -g: 保留属组

              -o: 保留属主

              -D:保留设备文件

               -e ssh: 使用ssh作为传输承载;

              -z: 压缩后传输;

               --progress: 显示进度条

              --stats: 显示如何执行压缩和传输

Accessvia rsync daemon(语法格式):

        Pull拉取文件: rsync [OPTION...] [USER@]HOST::SRC...[DEST]

                     rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

         Push推送文件: rsync [OPTION...] SRC...[USER@]HOST::DEST

                     rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

rsync服务模式例:在172.16.31.31 当服务器,172.16.31.30,当客户端,在服务器上创建/data 目录,rsync自己监听,因为是瞬时守护进程,要借助于超级守护进程。

1,在服务器端安装超级守护进程

        #yum installxinetd  

       #chkconfig   rsync on 

安装完后,会在/etc/xinetd.d/目录下生成一个rsync文件

2,编辑rsync文件

      disable= yes  改为 no           启用rsync服务

 

 

3、为rsync提供配置文件

                     /etc/rsyncd.conf

 

                     配置文件分两段:

                     全局配置段:1

                     共享配置段:多个                

                            [SHARE_NAME]

 

                     配置示例:

                     #Global Settings                       //全局定义段,只能有一个。

                     uid= nobody

                     gid= nobody

                     usechroot = no                            // rsync时是否支持chroot

                     maxconnections = 10                 //最大连接次数

                     strictmodes = yes                      //启用严格模式

                     pidfile = /var/run/rsyncd.pid

                     logfile = /var/log/rsyncd.log

 

                     #Directory to be synced             //定义同步的目录,可以有多个

                     [tools]                    

                     path= /data                                

                     ignoreerrors = yes                      //传输数据时是否忽略错误

                     readonly = no

                     writeonly = no

                     hostsallow = 172.16.0.0/16         //允许哪些主机通过,也就是白名单

                     hostsdeny = *                   

                     

            list= false                                //允许不允许列出文件

                      uid = root                               //指定此共享使用那个用户身份运行

                      gid = root                              //  指定此共享使用那个用户组身份运行

           

3、启动服务

                     #service xinetd start

 

                     监听于873/tcp

 

测试
    rsync /etc/fstab   172.16.31.31::tools

    rsync -a /etc/pam.d   172.16.31.31::tools    //推送目录

        rsync -a/etc/pam.d  /   172.16.31.31::tools   //推送文件

 

       rsync -a172.16.31.31::tools ./                  //拉取目录

       rsync -a172.16.31.31::tools/centos.repo ./           //拉取文件

 

也可以基于用户认证配置,在[tools]最后添加

auth users = USER1, USER2   指定可以通过rsync同步的用户

 secrets file =/etc/rsyncd.passwd      指定验证用户的文件

然后创建密码文件/etc/rsyncd.passwd

                     username:password

 

                     此文件不能允许其它用户有访问权限,且密码不能超过8个字符;

                            chmod 666 etc/rsyncd.passwd

用法 rsync tom@172.16.31.31::tools/./

 

 

 

INOTUFY

不过这样做有缺陷,在传数据的过程中,会出现断电,数据中断什么的,所以这时候类外一个技术inotify,弥补了这个缺陷

inotify: 在服务器端,可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,即会通知客户端来拉取  

编译安装

           #tar xf inotify-tools-3.14.tar.gz 
                    #cdinotify-tools-3.14 
                   #./conifgure 
                    #make&& make install   

           #cd /usr/local/bin

                    #ls

                     inotifywait  inotifywatch    生成这两个文件

           #yum install inotify-tools

inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。 

inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息

 

inotifywait相关参数   
       -m --monitor,表示始终保持事件监听状态。 
       -r --recursive,表示递归查询目录。 
       -q --quiet,表示打印出监控事件。 
       -e --event,通过此参数可以指定要监控的事件

 

 

实验内容:2个客户端,一个rsync + inotify服务器

serveice1  ip  172.16.31.31

serveice1  ip  172.16.31.32

服务器端   ip  172.16.31.30

 

安装Rsync服务端S1

#yum -y install xinetdrsync

2  rsync服务提供配置文件

uid = nobody

gid = nobody

use chroot = no

max connections = 5

timeout = 600

pid file = /var/run/rsyncd.pid

log file = /var/log/rsyncd.log

[s1]

path = /s1/data

ignore errors = yes

read only = no

write only = no

hosts allow = 172.16.31.30

hosts deny = *

list = yes

uid = root

gid = root

auth users = s1user

secrets file = /etc/s1.passwd



3  创建目录

 # mkdir /s1/data

 #vim /etc/s1.passwd

   s1user:user

 #chmod 600 /etc/ftp.passwd

 

4  配置Rsync服务端(172.16.31.30

#Global Settings

uid = nobody

gid = nobody

use chroot = no

max connections = 5

timeout = 600

pid file = /var/run/rsyncd.pid

log file = /var/log/rsyncd.log

[s2]

path = /s2/data

ignore errors = yes

read only = no

write only = no

hosts allow = 172.16.31.32

hosts deny = *

list = yes

uid = root

gid = root

auth users = s2user

secrets file = /etc/s2.passwd

5 创建目录 

 # mkdir /s2/data

 #vim /etc/s2.passwd

   s2user:user

 #chmod 600 /etc/s2.passwd

6  设置 (172.16.31.32)rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名  

#echo "s1user" > /etc/web.passwd

#echo "s2user" > /etc/ftp.passwd

#chomd 600 /etc/s1.passwd

#chmod 600 /etc/s2.passwd

 

rsync客户端(172.16.31.30)编写rsync脚本

#!/bin/bash

src=/var/web/

des1=s2

des2=s1

host1=172.16.31.32

host2=172.16.31.31

user1=s2

user2=s1

/usr/bin/inotifywait -mrq--timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -emodify,delete,create,attrib $src | while read file DATETIME DIR; 

do

/usr/bin/rsync -vzrtopg --delete --progress $src$user1@$host1::$des1 --password-file=/etc/s2.passwd

/usr/bin/rsync -vzrtopg --delete --progress $src$user2@$host2::$des2 --password-file=/etc/s1.passwd

echo "${files} was rsynced" >> /var/log/rsync.log2>&1

done

 接着,将这个脚本命名为rsync.sh,放到/var/web目录下,然后给定可执行权限,放到后台运行: 

  #chmod 755/var/web/rsync.sh