您的位置:首页 > 其它

rsync、inotify实现文件实时同步

2013-09-01 20:54 549 查看
一、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可以通过rsh 或ssh 使用,也能以daemon 模式去运行在以daemon方式运行时Rsyncserver会打开一个873 端口,等待客户端去连接。连接时,Rsyncserver会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。 Rsync 支持大多数的类Unix 系统,无论是Linux、Solaris 还是BSD 上都经过了良好的测试。此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具。rsync的功能特性: 可以镜像保存整个目录树和文件系统 可以增量同步数据,文件传输效率高 加密传输数据,保证了数据的安全性 可以使用rcp 、ssh 等方式来传输文件,当然也可以直接通过Socket连接传输文件 无须特殊权限即可安装
支持匿名传输二、Rsync命令选项及配置文件介绍
1、rsync命令使用格式: rsync [选项] 备份源 备份目标选项: -a #使用归档(archive)模式,保留文件原有属性等同于“-rlptgoD”等多个选项组合 -v #显示同步过程的详细信息 -c #打开校验开关,强制对文件传输进行校验 -l #保留软件链接 -L #像对待普通文件一样处理软链接 -D #保持设备文件信息 -W #拷贝文件不进行增量检测 -x #不要跨越文件系统边界 -e #指定使用rsh、ssh方式进行同步数据 -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 的应用模式
rsync有4 种应用模式,第一种是shell应用模式,也称为本地模式;第二种是远程shell模式,它利用SSH 执行底层连接和加密传输;第三种是查询〈也叫列表〉模式,与ls 命令实现的功能类似;第四种是服务器模式,平时所说的架设rsync 服务器就是指这种模式。下面分别对这4 种模式进行介绍:第一种模式:本地Shell模式 本地Shell模式主要是复制一个目录中的文件到另一目录,如:

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

第三种模式:列表模式 rsync与ls命令有相似的功能,如:

第四种模式:服务器模式 这种模式是基于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”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_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