rsync、inotify实现文件实时同步

一、Rsync概述

二、Rsync命令选项及配置文件介绍

三、Rsync的应用模式

四、Inotify简介

五、Inotify-tools工具使用介绍

六、rsync+inotify实现实时同步

一、rsync概述

   rsync是类Unix系统下的数据镜像备份工具,它能很轻松的实现本地镜像与远程同步文件;从软件的命名上就能看得出来――remote sync。

什么是rsync

   Rsync是一个远程数据同步工具,可通过LAN/WAN 快速同步多台主机间的文件。Rsync使用所谓的“rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

   rsync本来是用于替代rcp 的一个工具,目前由rsync.samba.org 维护,所以rsync.conf 文件的格式类似于samba 的主配置文件。Rsync可以通过rshssh 使用,也能以daemon 模式去运行在以daemon方式运行时Rsyncserver会打开一个873 端口,等待客户端去连接。连接时,Rsyncserver会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。

   Rsync 支持大多数的类Unix 系统,无论是LinuxSolaris 还是BSD 上都经过了良好的测试。此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具。

rsync的功能特性:

   可以镜像保存整个目录树和文件系统

   可以增量同步数据,文件传输效率高

   加密传输数据,保证了数据的安全性

   可以使用rcp ssh 等方式来传输文件,当然也可以直接通过Socket连接传输文件

   无须特殊权限即可安装

   支持匿名传输

二、Rsync命令选项及配置文件介绍

1、rsync命令使用格式:

   rsync [选项] 备份源 备份目标

选项:

   -a    #使用归档(archive)模式,保留文件原有属性等同于“-rlptgoD”等多个选项组合

   -v    #显示同步过程的详细信息

   -c    #打开校验开关,强制对文件传输进行校验

   -l    #保留软件链接

   -L    #像对待普通文件一样处理软链接

   -D    #保持设备文件信息

   -W    #拷贝文件不进行增量检测

   -x    #不要跨越文件系统边界

   -e    #指定使用rshssh方式进行同步数据

   -r    #递归模式,包含目录及子目录中所有文件

   -H    #保留硬连接

   -u    #仅进行更新,跳过所有已经存在于DST,并且文件时间晚于要备份的文件(不覆盖更新的文件)

   -t    #保留文件的时间标记

   -z    #在传输过程中进行压缩

   -o    #保留文件的属主(仅超级用户使用)

   -g    #保留文件的属组(仅超级用户使用)

   -p    #保留文件原的权限

   --port=PORT    #指定其他Rsync服务端口

   --delete       #删除目标目录有而源目录中没有的文件

   --progress     #显示传输过程

   --exclude=PATTERN    #指定排除不需要同步的文件模式

   --include=PATTERN    #指定不排除而需要同步的文件模式

   --password-file=FILE #指定密码文件位置

2、rsync主配置文件

注释:

######全局参数
pid file= /var/run/rsync.pid
port = 873
lock file= /var/run/lock.log
log file= /var/log/rsync.log
motd file= /etc/rsync/rsync.motd
######模块参数
[ALLEN]
comment = "Web File"
path = /web
use chroot = no
max connections = 10
readonly = no
write only = yes
list = no
uid = root
gid = root
auth users= rsync
secrets file= /etc/rsync/rsync.pass
strict modes = yes
hosts allow = 172.16.14.1
hosts deny = *
ignore errors = yes
timeout = 120
log format= %t %a %m %f%b

 全局参数:第2~6

PID文件
服务端口
锁文件
日志文件
当客户端连接服务器时的通知消息文件

 模块参数:第8~26

定义服务器要被同步的目录或文件,客户端可以直接指定该名称
描述信息
需要同步的目录
如果此项设置为yes相对安全一些,但在每次传输文件之前要先chroot到path参数指定的目录,要以root权限
最大并发连接
是否只读
是否可写
当客户端请求时是否允许列表形式查看
运行守护进程的uid
运行守护进程的gid
指定用户名列表,用逗号或空格分隔
指定一个包含“用户名:密码”的文件
此项检测密码文件的权限
允许连接的主机,可是为网段如:172.16.0.0/16
不允许连接rsync服务器的主机
数据传输时忽略IO错误
指定超时时间
指定日志格式:%h 远程主机名、%a 远程IP地址、%l 文件长度字符数、%p 该次rsync会话的进程id、%f 文件名、%P 模块路径、%t 当前时间、%u 认证的用户名(匿名用户时是null)、%b 实际传输的字节数;默认格式为:" %o %h [%a] %m (%u) %f %l"


三、rsync 的应用模式

   rsync4 种应用模式,第一种是shell应用模式,也称为本地模式;第二种是远程shell模式,它利用SSH 执行底层连接和加密传输;第三种是查询〈也叫列表〉模式,与ls 命令实现的功能类似;第四种是服务器模式,平时所说的架设rsync 服务器就是指这种模式。下面分别对这4 种模式进行介绍:

第一种模式:本地Shell模式

   本地Shell模式主要是复制一个目录中的文件到另一目录,如:

第二种模式:远程Shell模式

   rsync远程Shell模式可以把本地目录同步到另一台主机系统中,如:

第三种模式:列表模式

   rsyncls命令有相似的功能,如:

第四种模式:服务器模式

   这种模式是基于C/S模式的,在这种模式下,rsync在后台启动了一个守护进程,这个守护进程在rsync服务器端永久运行,用于接收文件传输请求,因此客户可以把文件发送给守护进程,也可以向守护进程请求文件。rsync服务器模式非常适合异地数据备份;我们在后面介绍

四、Inotify简介

rsync的优点与不足

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

inotify简介

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

五、Inotify-tools工具使用介绍

安装完成后,会生成inotifywait和inotifywatch两个命令:

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

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

从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

语法格式:inotifywait [-hcmrq][-e][-t][--format][-timefmt][...]

   -m: 即“--monitor”   表示始终保持事件监听状态。

   -r: 即“--recursive” 表示递归查询目录

   -q: 即“--quiet”     表示打印出监控事件

   -o: 即“--outfile”   输出事情到一个文件而不是标准输出

   -s:  即“--syslog”    输入错误信息到系统日志

   -e: 即“--event”,   通过此参数可以指定要监控的事件,常见的事件有modifydeletecreateclose_write、move、close、unmount和attrib等

   -format: 指定输出格式;常用的格式符如:%w:表示发生事件的目录  %f:表示发生事件的文件  %e:表示发生的事件  %T:使用由-timefmt定义的时间格式

   -timefmt:指定时间格式,用于-format选项中的%T格式

inotifywatch是收集数据的指令,它的相关参数:

语法格式:inotifywatch[-hvzrqf][-e][-t][-a][-d][...]

   -fromfile:从文件中读取需要监控的文件或排除的文件,一个文件一行,排除的文件以"@"开头

   -z:  即“-zero”          输出表格的行和列,即使元素为空

   -r:  即“-recursive”     监视一个目录下的所有子目录

   -t:  即“-timeout”       设置超时时间

   -e:   即“-event”         只监听指定的事件

六、Rsync+Inotify实现实时同步

下面以一个案例的形式来安装配置Rsync+Inotify实时同步数据

源主机:系统 Centos6.4_x86_64    同步文件目录"/data"

目标主机:系统 Centos6.4_x86_64    备份目录"/data"

1、在目标主机上面以rpm方式安装rsync软件并配置,并让rsync以超级守护进程运行

######安装rsync软件并安装超级守护进程软件xinetd
[root@localhost ~]# yum -y install rsync xinetd
######为rsync提供主配置文件,安装好默认没有配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
uid=nobody
gid=nobody
use chroot = no
max connections = 3
strict modes = yes
pid file= /var/run/rsync.pid
log file= /var/log/rsync.log
[data]
path = /data
ignort errors = yes
timeout = 120
readonly= no
write only = yes
hosts allow = 172.16.0.0/16
hosts deny = *
list = no
uid = root
gid = root
auth users= allen
secrets file= /etc/rsync.pass
######为rsync提供密码认证文件
[root@localhost ~]# echo "allen:Data14.3" > /etc/rsync.pass
######修改密码文件权限
[root@localhost ~]# chmod 600 /etc/rsync.pass
######让rsync开机自启动
[root@localhost ~]# chkconfig rsync on
######启动超级守护进程
[root@localhost ~]# service xinetd start
######查看是否为开机启动
[root@localhost ~]# chkconfig --list | grep rsync
    rsync:          on

2、查看进程有没有监控"873/tcp"端口,rsync默认端口为873;如:

3、在源主机上面安装rsync与inotify-tools,不用做任何配置:

[root@localhost ~]# yum -y install rsync inotify-tools

4、编译同步脚本,设置权限并加入到开机启动:

[root@localhost ~]# vim rsync.sh
#!/bin/bash
Host=172.16.14.3
SDIR=/data
DDIR=data
/usr/bin/inotifywait -mrq --timefmt '%d/%m%y %H%M'--format '%T %w %f'-e modify,delete,create,attrib $SDIR  | whileread files
do/usr/bin/rsync -avz --delete--password-file=/root/rsync.pass $SDIR allen@${Host}::$DDIR &> /dev/null
echo "${files} was rsyncd">> /tmp/rsyncd.log 2>&1
echo "+++++++++++++++++++++++++++++++++++++++"
done
#####创建密码文件
[root@localhost ~]# echo "Data14.3"> .rsync.pass
######修改密码文件权限并添加脚本执行权限
[root@localhost ~]# chmod 600.rsync.pass
[root@localhost ~]# chmod +x rsync.sh
######加入开机启动
[root@localhost ~]# echo "/root/rsync.sh">> /etc/rc.d/rc.local

5、执行同步脚本测试是否能成功同步:

这里为了测试看到效果使用"bash -xrsync.sh"执行,如果正常执行脚本同步的话以后台形式运行:“/root/rsync.sh &”

6、在目标主机查看验证:

   至此已经全部完成,如果需要同步到多台主机,类似目标主机的做法即可。如果做的过程中遇到问题可以留言...

你可能感兴趣的:(rsync,inotify,实时同步)