rsync+inotify实现数据实时同步

一、rsync

1rsync介绍

Rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync本来是用以取代rcp的一个工具,它当前由 rsync.samba.org维护。Rsync使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。

Rsync可以搭配rshssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方Rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

2rsync特点

    (1可以镜像保存整个目录树或文件系统;

    (2较高的数据传输效率;

    (3可以借助于ssh实现安全数据传输;

    (3支持匿名传输;

3rsync命令的工作模式:

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

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

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

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

4rsync命令的语法

rsync命令的选项:
    -n: 同步测试,不执行真正的同步过程;
    -v: 详细输出模式
    -q: 静默模式
    -c: checksum,开启校验功能
    -r: 递归复制
    -a: 归档,保留文件的原有属性;
    -p: 保留文件的权限;
    -t: 保留文件的时间戳;
    -l: 保留符号链接
    -g: 保留属组
    -o: 保留属主
    -D:保留设备文件
    -e ssh: 使用ssh作为传输承载;
    -z: 压缩后传输;
    --progress: 显示进度条
    --stats: 显示如何执行压缩和传输


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


二、rsync+inotify实现数据实时同步更新

1rsync+inotify组合的必要性和好处(以下原理内容来源于网络)

1rsync

与传统的cptar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

2inotify

 Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

 

2、实验拓扑图:

wKioL1P8F3vx4s1iAACus2SeEbw213.jpg

注意:做数据的实时同步时,一般是从客户端同步到服务端。

 

3rsync服务端(172.16.140.1)配置

 

rsync没有自己的配置文件,要手动创建rsync的配置文件/etc/rsyncd.conf,该配置文件分为两部分全局配置段和共享配置段,共享配置段可以有多个。

[root@localhost ~]# vim /etc/rsyncd.conf
# Global Settings   #全局配置段
uid = nobody  #以哪个用户的身份获取数据,nobody是最小权限的用户
gid = nobody
use chroot = no  #服务运行时,要不要锁定在家目录下
max connections = 10  #服务器端可允许的最大并发连接数
strict modes = yes  #是否工作在严格模式下
pid file = /var/run/rsyncd.pid  #rsync的pid文件路径
log file = /var/log/rsyncd.log  #rsync的日志文件路径
# Directory to be synced   #共享配置段
[rsync_data]   #同步的共享目录名称,多个共享目录名称不能重名
path = /rsync_mydata  #共享目录的实际路径,要同步的数据存放的位置
ignore errors = yes   #表示在复制文件的过程中,若发生错误,是继续复制(yes)还是终止复制(no)
read only = no  #是否限定客户端以只读的方式从服务端拉取数据。若服务端共享的数据只用于下载,则设为yes。若允许客户端向服务端推送数据,则设为no。
write only = no  #设为no表示只允许客户端往里写数据,不能拉取数据。
hosts allow = 172.16.0.0/16  #允许哪些主机来访问,做白名单的。
hosts deny = *  # 做黑名单的。
list = false  #是否允许用户列出文件列表
uid = root  #以哪个用户的身份来获取数据
gid = root
auth users = hjq  #允许哪些用户来拉取数据,做身份验证
secrets file = /etc/rsyncd.passwd  #存放用户验证的信息


编辑用户验证文件,其中用户名和密码都是明文的,所以该文件的权限要设为600

[root@localhost ~]# vim /etc/rsyncd.passwd 
hjq:hjq
[root@localhost ~]# chmod 600 /etc/rsyncd.passwd


rsync是依赖于超级守护进程xinetd工作的,要把xinetd也启动起来。

[root@localhost ~]# yum -y install xinetd
[root@localhost ~]# chkconfig rsync on
[root@localhost ~]# service xinetd start
[root@localhost ~]# ss -tnl  #rsyncd服务监听于873/tcp端口上

 

4rsync客户端(172.16.40.1)配置

1安装inotify-tools

由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持

wKioL1P8F7HzZD0tAABQYs_Lujw416.jpg

也可以用如下方法判断,内核是否支持inotify。如果有以下三项,表示系统已经默认支持inotify

wKiom1P8FsrjN5RzAAEsXQ23nEY896.jpg

三个参数的简单解析:

   max_queued_evnets:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
   max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限。
   max_user_watches:表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches

 

若查明内核支持inotify,就可以使用yum安装inotify-tools,这里使用的版本是inotify-tools-3.14-1.el6.x86_64

# yum install -y inotify*


wKiom1P8F2KhJrPOAACYO3VytX4596.jpg

inotify-tools安装完成后,会生成inotifywaitinotifywatch两个指令

inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。
inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

 

2inotifywait命令参数解析

参数说明

inotifywait

    语法:
        inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
    参数:
    -h,--help
        输出帮助信息
    @
        排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
    --fromfile 
        从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
    -m, --monitor
        接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
    -d, --daemon
        跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog
    -o, --outfile 
        输出事情到一个文件而不是标准输出。
    -s, --syslog
        输出错误信息到系统日志
    -r, --recursive
        监视一个目录下的所有子目录。
    -q, --quiet
        指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
    --exclude 
        正则匹配需要排除的文件,大小写敏感。
    --excludei 
        正则匹配需要排除的文件,忽略大小写。
    -t , --timeout 
        设置超时时间,如果为0,则无限期地执行下去。
    -e , --event 
        指定监视的事件。

wKiom1P8ZMCixawfAAM-0k1iwP8812.jpg-c, --csv
输出csv格式。
--timefmt 
指定时间格式,用于--format选项中的%T格式。
--format 
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X"分隔
%T 使用由--timefmt定义的时间格式

 

(3)配置inotify

创建一个共享目录,用于存放要同步的数据

# mkdir /inotify_data


提供一个脚本

# vim  /tmp/inotify_rsync.sh
#!/bin/bash
host=172.16.140.1  #rysnc服务端的地址
src=/inotify_data/  #rsync客户端的用于同步数据的目录
dst=rsync_data  #rysnc服务端导出的共享目录名
username=hjq  #rysnc服务端上/etc/rsyncd.passwd这个文件中定义的用户名
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
        do
                /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $src $username@$host::$dst
                echo "${files} was rsynced" >> /var/log/rsync.log 2>&1  #将信息写入日志
        done


rsync客户端提供/etc/rsyncd.passwd密码文件,在rsync客户端中只要提供rsync同步的密码就行了,不用提供用户名。

#vim /etc/rsyncd.passwd
hjq
# chmod 600 /etc/rsyncd.passwd   #密码文件的权限应为600


赋予该脚本执行的权限

# chmod +x /tmp/inotify_rsync.sh


把脚本添加到开机启动的文件中

# echo "/tmp/inotify_rsync.sh"  >>  /etc/rc.d/rc.local


5、实验操作

rsync服务端(172.16.140.1):

wKiom1P8ZVrB_03eAABn_NoII9Y785.jpg

刚开始rsync服务端的/mydata共享目录,没有文件


rsync客户端(172.16.40.1):

运行脚本

wKiom1P8ZXGS7j6JAABrf769XFY083.jpg

复制文件到rsync客户端的共享目录上

wKiom1P8ZYXRVeSTAABnGk35th4410.jpg

wKiom1P8Za_iC3URAAJZPRmthdc625.jpg

rsync服务端(172.16.140.1):

wKioL1P8Zt3z-CBBAACcdmkeqyo426.jpg 

数据成功同步过来了!




你可能感兴趣的:(rsync,inotify,同步数据)