您的位置:首页 > 运维架构 > Linux

rsync+inotify实现数据同步传输

2015-12-08 00:00 537 查看
rsync简介:
rsync:remote sync,是一款快速增量备份备份工具,能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输。rsync中一项与其他大部分类似程序或协议中所未见的重要特性是镜像对每个目标只需要一次发送。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。还能通过脚本或crontab计划任务这执行自动备份。

特点:
可以镜像保存整个目录树或文件系统;
较高的数据传输效率;
可以借助于ssh实现安全数据传输;
支持匿名传输;

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: 显示如何执行压缩和传输


rsync同步数据时,需要扫描全部数据计算出增量部分,而后再同步增量数据,如果需要备份数据非常庞大,这样的扫描会非常耗时,使其变得低效;虽然可以通过crontab计划任务实现定期同步,但是也达不到实时同步的要求。此时可以利用inotify来解决此应用瓶颈。

inotify:是linux的内核特性,linux内核从2.6.13版本起引入该特性。通过inotify可以监控linux文件系统中添加、修改、、移动、重命名、删除等各种事件,利用这个内核接口,由于notify是内核功能,因此需要使用时,通过第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。

实例:rsync+inotify实现数据同步传输
实验环境:
rsync服务器:
IP:192.169.1.10
操作系统:CentOS6.7 x86_64

客户端:
IP:192.168.1.11
操作系统:CentOS6.7 x86_64

说明:客户端部署inotify-tools,监控指定目录的文件同步至服务器;

实验过程:
rsync服务器模式配置;
安装rsync和守护进程:
# yum install rsync xinetd


启用rsync:
# vim /etc/xinetd.d/rsync
> disable = no


为rsync提供配置文件:
默认没有配置文件,配置文件分两段,全局配置段1个,共享配置段多个;
# vim /etc/rsyncd.conf
> # Global Settings    :全局配置段;
> uid = nobody    :运行rsync用户;
> gid = nobody    :运行rsync组;
> use chroot = no    :关闭chroot;
> max connections = 10    :最大并发连接数;
> strict modes = yes    :开启严格模式;
> pid file = /var/run/rsyncd.pid    :pid文件位置;
> log file = /var/log/rsyncd.log    :日志文件位置;
>
> # Directory to be synced   :共享配置段;
> [data]    :共享文件名;
> path = /data    :共享文件路径;
> ignore errors = yes    :忽略错误;
> read only = no    :不允许读;
> write only = no    :不允许写;
> hosts allow = 192.168.1.0/24   :白名单;
> hosts deny = *    :黑名单
> list = false    :不允许列出文件;
> uid = root    :运行rsync的用户,覆盖全局配置;
> gid = roo t    :运行rsync的组,覆盖全局配置;
> auth users = chencer    :用户认证;
> secrets file = /etc/rsyncd.passwd    :用户认证文件;


提供用户认证文件:用户为以逗号分隔的在rsyncd.passwd中存在用户名的列表,此文件不能允许其它用户有访问权限,且密码不能超过8个字符;
# vim /etc/rsyncd.passwd
> chencer:chencer
# chmod 600 /etc/rsyncd.passwd


启动服务:
# chkconfig rsync on
# service xinetd start
# ss -tnl | grep 873




监听于873/tcp端口;

客户端配置;
提供认证文件:仅需要密码;
# echo "chencer" > /etc/rsync.passwd
# chmod 600 /etc/rsync.passwd


测试同步:
Access via 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 --password-file=/etc/rsync.passwd chencer@192.168.1.10::data/data
# rsync --password-file=/etc/rsync.passwdrsync://chencer@192.168.1.10/data /data
# rsync --password-file=/etc/rsync.passwd /datachencer@192.168.1.10::data
# rsync --password-file=/etc/rsync.passwd /datarsync://chencer@192.168.1.10/data


安装inotify-tools:inotify-tools来自于epel源;
# yum install inotify-tools
# rpm -ql inotify-tools





inotifywait命令用法:
# inotifywait [options] file...
@file:排除指定文件;
常用选项:
-m:始终保持事件监听状态;
-r:递归查询目录;
-q:打印监控事件;
-e:指定监控的事件;
modify:更改文件;
attrib:文件属性改变,权限、时间戳等;
move:文件移动到监控目录或移出监控目录;
create:创建文件;
delete:删除文件;
--timefmt:指定时间格式;
--format:指定时间输出格式;


提供rsync脚本:
# vim rsync.sh
> #!/bin/bash
> SRC=/data
> DEST=data
> HOST=192.168.1.10
> USER=chencer
> inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f %e' -e modify,attrib,move,create,delete $SRC | while read files
> do
>     rsync -azq --delete--password-file=/etc/rsync.passwd $SRC $USER@$HOST::$DEST &> /dev/null
> done
# chmod +x rsync.sh


设置开机启动:
# echo "/root/rsync.sh &" >> /etc/rc.d/rc.local

同步测试:
在服务器上创建目录:




查看服务器:



同步成功。

结语:
至此rsync+inotify实现数据同步传输配置完成;以上为本人学习整理内容,试验中如有遗漏和失误,欢迎各路大神来喷。

本文出自 “小马的学习记录” 博客,请务必保留此出处http://masachencer.blog.51cto.com/8683770/1692388
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  rsync linux inotify