Rsync+inotify实现数据同步

    本节我们来讲一讲如何利用rsync以及inotify来实现两台不同主机之间的实时数据同步,rsync虽然同步功能异常强悍,但是它不能实时的去监测、同步数据,这就是为什么我们要用了inotify的原因了。 好的废话不多说,下面我们就分别对他们进行介绍。

rsync

顾名思意,它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

特点:

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

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

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

4、支持匿名传输;

 

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的服务模式

 

1、设定rsync服务器端

# yum -y install xinetd
# chkconfig rsync on

2、为rsync提供配置文件:手动创建

/etc/rsyncd.conf

 [root@localhost ~]# vim /etc/rsyncd.conf

配置文件分两段:

全局配置段:1

共享配置段:可以有多个

[SHARE_NAME]:名称可以自定义

配置示例:

# Global Settings
uid = nobody               进程运行用户身份
gid = nobody               进程运行用户组
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
[tools]                   
path = /data               同步目录:名字自己定义
ignore errors = yes        忽略错误
read only = no             只读
write only = no            只写
hosts allow = 172.16.0.0/16    同步白名单
hosts deny = *                 同步黑名单 *表示拒绝所有
list = false                   
uid = root                     
gid = root

 

3、启动服务

注意启动服务之前必须修改/etc/xinetd.d/rsync 文件中的disable项,使其为no,这样xinetd才会为其开启监听服务。

[root@localhost ~]# vim /etc/xinetd.d/rsync 

wKiom1P4ieXA9z56AABv19nq2cg825.jpg

# service xinetd start

如果启动成功则监听于873/tcp:可用ss -tnl 命令查看

wKiom1P4ityBDX1ZAAFR9HS8H10009.jpg

可以看到最后一行,873端口已监听。 

 

 用法:

读取: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

 

测试:本机的地址为172.16.6.20,以另一台地址为172.16.106.2的机子进行同步测试

wKioL1P4jC2BFL1BAABHhjCAGaM965.jpg 

可以看到同步成功,但是由于没有验证功能这里不需要任何密码


4、服务端启用用户认证的功能

 创建密码文件

密码文件创建为/etc/rsyncd.passwd (该文件名可以自己定义,但需要与配置文件中保持一致:注意,密码不能超过8个字符

密码文件中的格式:username:password

 [root@localhost ~]# vim /etc/rsyncd.passwd

wKiom1P4jDbDizTfAAAjC3gPp8M049.jpg

这里我任意写了三个用户mwj,james,tracy


由于此文件不能允许其它用户有访问权限,因此创建完成后修改下文件的权限: 

 [root@localhost ~]# chmod 600 /etc/rsyncd.passwd

 在共享定义处加认证配置

[tools]
path = /data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.0.0/16
hosts deny = *
list = false
uid = root
gid = root  
auth users = USERNAME LIST             该用户列表为以逗号分隔且在密码文件中存在的用户名
secrets file = /etc/rsyncd.passwd      密码文件

wKiom1P4jLnz0SloAAEiL9ZO9_c660.jpg 

注意,这里我们只给了james和tracy权限,因此理论上来说mwj没有权限同步,那么我们来验证下结果。


ok,一切完毕。我们来重启下服务并且测试下:

[root@localhost ~]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

测试:本机的地址为172.16.6.20,还是以另一台地址为172.16.106.2的机子进行同步测试

[root@localhost data]# rsync [email protected]::tools/inittab  /web/data/   复制inittab文件
Password: 
@ERROR: auth failed on module tools         认证被拒绝
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
[root@localhost data]# ls
fstab                                     复制未成功                
[root@localhost data]# rsync [email protected]::tools/inittab  /web/data/ 复制inittab文件
Password: 
[root@localhost data]# ls
fstab  inittab                             复制成功
[root@localhost data]# rsync [email protected]::tools/fstab2  /web/data/   复制fstab2文件
Password: 
[root@localhost data]# ls
fstab  fstab2  inittab                     复制成功

好了,通过上述的测试验证的我们此前的预测,认证生效。


inotify

rsync虽然也能够使用cron来进行任务同步,但是其中还是会出现一定的时间差,如果想要解决这个问题,那么我们就可以用inotify来解决了,Inotify 是一个 Linux 内核特性,它可以实时监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等,还可以实时跟踪活动的源头和目标等细节,这样一旦同步文件发送改变,inotify就可以实时的通知客户端到服务器端进行同步,这样就可以实现无缝隙的数据同步。

1、安装 (注意:此功能需要2.6.13及以上内核支持)

[root@localhost ~]# uname -r      查看一下机器的内核版本
2.6.32-431.el6.x86_64             2.6.32的内核

这里我们两种方式都提供:编译安装和yum安装

 编译安装

这里我们下载inotify的源码包进行编译安装

下载地址:http://sourceforge.net/projects/inotify-tools/files/

[root@localhost ~]# wget http://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz

wKiom1P4lpOCI4HCAAYPtpL6hKk417.jpg

[root@localhost ~]# tar xf inotify-tools-3.13.tar.gz 
[root@localhost ~]# cd inotify-tools-3.13
[root@localhost inotify-tools-3.13]# ./configure       
[root@localhost inotify-tools-3.13]# make && make install

这里只是提供一下编译安装的过程,具体的我还是利用下面yum安装的操作来进行。


yum安装

[root@localhost inotify-tools-3.13]# yum install inotify-tools
[root@localhost inotify-tools-3.13]# rpm -ql inotify-tools     查看生成了哪些文件
/usr/bin/inotifywait          指令文件:用来监视文件的变化
/usr/bin/inotifywatch         指令文件:用于收集被监控的文件系统统计数据
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz

inotify相关参数 

inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小。下面分别做简单介绍。 

/proc/sys/fs/inotify/max_queued_evnets     
表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。 


/proc/sys/fs/inotify/max_user_instances 
表示每一个real user ID可创建的inotify instatnces的数量上限。 


/proc/sys/fs/inotify/max_user_watches 
表示每个inotify instatnces可监控的最大目录数量。如果想要增加此值的大小: 可直接使用echo重定向即可:
echo 1000000 > /proc/sys/fs/inotify/max_user_watches 


下面我们来看下inotifywait和inotifywatch这2个命令的用法:


inotifywait:wait for changes to files using inotify  使用inotify监控文件变化

语法格式:

 inotifywait  [-options]  <file> [ ... ]

options

-h :help

-m : --monitor,监听

-c :输出为逗号分隔形式

-r :递归

-e  <event>:指定监听事件,不指默认问全部

-t <seconds>:时间

--format <fmt> :格式

--timefmt <fmt>:时间格式


inotifywatch:gather filesystem access statistics using inotify收集统计数据

语法格式:

inotifywatch  [options]   <file> [ ... ]

options


-h :help

-r :递归

-v :输出额外的错误信息

-e <event>:指定事件

-t <seconds>:时间

-a <event>:输出时按照事件计数进行升序排序

-d <event>:输出时按照事件计数进行降序排序


案例:

wKioL1P42WCzbVDwAAF6pdaTjbs770.jpg

172.16.6.20:作为rsync服务器

172.16.106.2:作为inotify服务端,rsync的客户端,当文件改动时将改变同步到A


rsync服务器配置

这里的配置跟上面的服务认证一样,这里就不多加介绍了,主要还是介绍下面的inotify的配置

 [root@localhost ~]# vim /etc/rsyncd.conf

wKiom1P4jLnz0SloAAEiL9ZO9_c660.jpg

密码文件以及其他配置跟上面完全相同。


inotify服务端配置

这里假设我们将监控/shared目录下的内容,并同步到rsync服务器端。

下面编写一个脚本

[root@localhost ~]# vim /etc/inotify.sh

#!/bin/bash
#
host1=172.16.6.20                  ##服务器端IP
src=/shared/                        ##本地数据存放目录
dst=tools                        ##服务端数据的目录
user=james                      ##主机A允许推送拉取数据的用户
psd=lbj                         密码 
/usr/bin/local/inotifywait -mrq  -e modify,delete,create,attrib $src |while read line ;
do 
    echo $psd > /usr/bin/rsync -vzrtopg --delete --progress  $src $user@$host::$dst  
 
done

[root@localhost ~]#

好了,这样我们一个rsync+inotify的实时数据同步就OK了。直接启动就可以用来额。

[root@localhost ~]#/etc/inotify.sh  &


好了本节就讲到这里,欢迎大家的批评指正,谢谢!

你可能感兴趣的:(rsync,inotify)