一、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、在目标主机查看验证:
至此已经全部完成,如果需要同步到多台主机,类似目标主机的做法即可。如果做的过程中遇到问题可以留言...