rsync+inotify实现数据的实时同步

rsync简介

rsync(remote sync)是一款数据镜像备份工具,支持本地复制和远程同步。它的基本用法与scp相似,但是它们的同步方式有所区别,rsync在同步之前会检查源目录和目标目录之间是否存在不同之处,如果有,仅复制不同的数据(目标目录中没有的文件),源目录和目标目录中都有的,则会通过提取文件的特征码进行比对(比较内容是否相同,scp会直接覆盖),内容不相同的则进行覆盖,内容相同的不进行同步。所以rsync的效率要比scp或cp高很多。


rsync的特点:

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

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

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

4、支持匿名传输;


rsync命令的常用选项:

-n          #同步测试,不执行真正的同步过程;

-v          #详细输出模式

-q          #静默模式

-c           #checksum,开启校验功能

-a           #归档模式(类似-rlptgoD,-r递归复制 ,-l保留符号链接,-p保留文件的权限,-t保留文件的时间戳,-g保留属组,-o保留属主,-D保留设备文件),保留文件的原有属性;

-e ssh     #使用ssh作为传输承载;

-z            #压缩后传输;

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

--exclude=pattern     #不同步那些被pattern(正则表达式或文件名)匹配到的文件

--exclude-from=file   #不同步那些被pattern匹配到的文件,将pattern写到file中,一行一个pattern


简单例子:

#将远程服务器端数据同步至本地
[root@www data]# rsync -azv --exclude-from=/tmp/pattern [email protected]:/data/* ./ 
#将本地文件同步至远程服务器端  
[root@www data]# rsync -azv --exclude-from=/tmp/pattern  ./  [email protected]:/data/*


rsync的服务模式

实验环境:

192.168.1.101   #rsync服务器

192.168.1.112   #部署inotify,将本机上指定目录下的文件实时同步至192.168.1.101

1)rsync服务有超级守护进程xinetd托管,要启动rsync服务要先启动xinetd。centOS上默认没有安装xinetd。

[root@www data]# yum install xinetd
[root@www data]# chkconfig rsync on

2)修改/etc/xinetd.d/rsync配置文件,使xinetd能够启动rsync服务

[root@www data]# vim /etc/xinetd.d/rsync
service rsync
{
        disable = no                            #yes改为no
        ....
        ....

3)为rsync提供配置文件/etc/rsyncd.conf,配置文件默认没有。rsync仅提供了一个帮助文档,可根据帮助文档的信息编辑配置文件(man rsyncd.conf)。/etc/rsyncd.conf配置文件分为两段:全局配置段和共享配置端,共享配置端可存在多个。

[root@www data]# rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync
......
/usr/share/man/man5/rsyncd.conf.5.gz              #帮助文档

/etc/rsyncd.conf配置文件示例:

# Global Setting
uid = nobody                       #以哪个用户的身份运行rsync
gid = nobody
use chroot = false                 #关闭chroot       
max connections = 10               #最大并发连接数
strict modes = true                #对secrets file文件的方式是否需要检查权限
pid file = /var/run/rsyncd.pid 
log file = /var/log/rsyncd.log

# Directory to be synced
[data]                         #共享名称
path = /data                   #共享目录路径
ignore errors = yes 
read only = false              #是否允许上传
write only = false             #是否允许下载
hosts allow = 192.168.0.0/16   #允许访问的地址      
hosts deny = *                 #拒绝其他的主机
list = true                    #是否允许客户端列出目录
uid = root                     #运行rsync的用户(覆盖全局配置端)
gid = root                              
auth users = baby,James       #允许访问的用户
secrets file = /etc/rsyncd.passwd     #认证文件(存放用户名和密码)

auth users后面的用户名需要用逗号隔开,并且每个用户名都存在于/etc/rsyncd.passwd中。/etc/rsyncd.passwd格式:username:passwd,用户名密码均为明文。还有一点需要注意,/etc/rsyncd.passwd这个文件的权限必须是400或者600,否则同步无法完成。


4)修改权限,启动服务。

[root@www data]# chmod 600 /etc/rsyncd.passwd
[root@www data]# service xinetd start
Starting xinetd:                                           [  OK  ]
[root@www data]# ss -tulnp | grep 873
tcp    LISTEN     0      64            :::873         :::*   users:(("xinetd",4515,5))


5)在客户端创建密码文件(该文件的权限也需要是600或者400)

[root@www ~]# touch  /etc/rsync.passwd 
[root@www ~]# echo "passwd" > /etc/rsync.passwd

然后就可以对rsync服务器共享的目录进行数据的拉取和推送。

远程服务器的书写格式有两种:

(1)[USER@]HOST::SRC              #SRC为共享名称

(2)rsync://[USER@]HOST[:PORT]/SRC

#查看服务器端共享的目录
[root@www tmp]# rsync --list-only 192.168.1.101::
data 
#数据的推送
[root@www tmp]# rsync -avz --password-file=/etc/rsync.passwd /data/ [email protected]::data
sending incremental file list       
........
#数据的拉取
[root@www data]# rsync -avz --password-file=/etc/rsync.passwd [email protected]::data /data/
receiving incremental file list
........


inotify的使用

innotify是Linux的内核特性,Linux内核从2.6.13版本之后引入该特性。 inotify可以实现跟踪Linux文件系统的变化(新建文件,删除..,修改..,移动等事件)。innotify有两个命令inotifywait,inotifywatch。inotifywait用来监控文件系统的变化,inotifywatch用来监控文件系统的访问次数。通过inotifywait来监控文件系统,在文件系统发生变化时调用rsync将变化后的数据推送至远程主机可实现数据的实时同步。

(在192.168.1.112上进行)

1)查看内核是否支持inotify特性

[root@www data]# grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y                  #既支持该特性

2)源码安装inotify-tools-3.14

[root@www ~]# tar xf inotify-tools-3.14.tar.gz
[root@www inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools
.....
[root@www inotify-tools-3.14]# make && make install

3)编辑脚本文件

#!/bin/sh
SRC=/data/
MODULE=data
[email protected]
COMMAND=/usr/local/inotify-tools/bin/inotifywait
$COMMAND -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e create,delete,move,modify $SRC|while read files
do
   rsync -az --password-file=/etc/rsync.passwd --delete $SRC $HOST::$MODULE &> /dev/null
done

#inotifywait参数:

-m              #表示始终保持事件监听状态

-r                #监控所有的子目录

-q               #quite

-e               #指定要监控的事件,包括modify、delete、create、attrib等

--timefmt   #指定时间的输出格式

--format     #指定命令执行时的信息输出格式,%T为前面的时间格式


4)编辑完成之后添加执行权限,运行,测试。(在192.168.1.101端需要将rsync服务开启)

[root@www sbin]# chmod +x rsync.sh
[root@www sbin]# bash -x rsync.sh
.........

复制一个文件至/data目录下

wKioL1Wp3bDCN3O3AALwM_gDc7U703.jpg


[root@www data]# ll
total 12
......
-rw-r--r-- 1 root root 1375 Jul 14 18:12 passwd

192.168.0.101的/data目录下已存在对应文件,同步完成!!!

在/etc/rc.local中添加/usr/local/inotify-tools/sbin/rsync.sh &,设置成开机自动启动。

.................^_^

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