首页 > 网络 > 其他 >

rsync+inotify实现实时同步案例

2016-11-15

rsync+inotify实现实时同步案例。随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

1.1 inotify介绍2.1 rsync+inotify同步逻辑图3.1 环境部署4.1 inotify-slave部署4.1.1检查是否安装rsync4.1.2 新建rsync用户及模块目录并更改其用户组4.1.3 编写rsync daemon配置文件/etc/rsyncd.conf4.1.4 配置虚拟用户的密码文件4.1.5 启动rsync 服务4.1.6 通过inotify-master测试推送5.1 inotify-master部署5.1.1 查看当前系统是否支持inotify5.1.2 下载inotify源码包并编译安装5.1.3 inotify之inotifywait命令常用参数详解5.1.4 编写监控脚本并加载到后台执行5.1.5 实时同步测试

1.1 inotify介绍

inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。

1240

2.1基本架构

3.1 基本环境部署(这里为了避免不兼容的情况出现,采用统一版本的系统)

主机名IP地址系统版本内核版本

inotify master192.168.42.116centos 6.82.6.32-642.el6.x86_64

inotify slave192.168.42.112centos 6.82.6.32-642.el6.x86_64

4.1 inotify-slave部署

这里就是部署rsync服务,rsync daemon工作模式。

4.1.1检查是否安装rsync

rpm-qarsync

1240

结果

4.1.2 新建rsync用户及模块目录并更改其用户组

useraddrsync-s/sbin/nologin-M

mkdir/backup#创建rsyncdaemon工作模式的模块目录chownrsync.rsync/backup/#更改模块目录的用户组ll-d/backup/

4.1.3 编写rsync daemon配置文件/etc/rsyncd.conf

##rsyncd.confstart###工作中指定用户(需要指定用户)uid=rsync

gid=rsync#相当于黑洞.出错定位usechroot=no#有多少个客户端同时传文件maxconnections=200#超时时间timeout=300#进程号文件pidfile=/var/run/rsyncd.pid#日志文件lockfile=/var/run/rsync.lock#日志文件logfile=/var/log/rsyncd.log#模块开始#这个模块对应的是推送目录#模块名称随便起[backup]#需要同步的目录path=/backup/#表示出现错误忽略错误ignoreerrors#表示网络权限可写(本地控制真正可写)readonly=false#这里设置IP或让不让同步list=false#指定允许的网段hostsallow=192.168.42.0/24#拒绝链接的地址,一下表示没有拒绝的链接。hostsdeny=0.0.0.0/32#不要动的东西(默认情况)#虚拟用户authusers=rsync_backup#虚拟用户的密码文件secretsfile=/etc/rsync.password#配置文件的结尾#rsync_config_______________end

4.1.4 配置虚拟用户的密码文件

echo"rsync_backup:123456">/etc/rsync.password#注:rsync_backup为虚拟用户,123456为这个虚拟用户的密码

chmod600/etc/rsync.password#为密码文件提权,增加安全性

4.1.5 启动rsync 服务

rsync--daemon#启动rsync服务ps-ef|greprsync

root23891010:15?00:00:00rsync--daemon

root23922305010:15pts/000:00:00greprsync

ss-tunl

tcpLISTEN05:::873:::*

tcpLISTEN05*:873*:*

4.1.6 通过inotify-master测试推送

inotify-master配置密码文件,测试推送

echo"123456">/etc/rsync.password#注意:这里只要写密码即可,切记。chmod600/etc/rsync.passwordecho"hellosjf">test.txt

rsync-avztest.txtrsync_backup@192.168.42.116::backup--password-file=/etc/rsync.password

sendingincrementalfilelist

test.txt

sent79bytesreceived27bytes42.40bytes/sec

totalsizeis10speedupis0.09inotify-slave检查:

ll/backup/

total4-rw-r--r--1rsyncrsync10Oct2910:20test.txt

cat/backup/test.txt

hellosjf

5.1 inotify-master部署

注:

inotify是rsync客户端安装和执行的

企业场景压力测试200-300个同步限制,受网卡,磁盘,带宽等的制约。

5.1.1 查看当前系统是否支持inotify

ll/proc/sys/fs/inotify/

total0-rw-r--r--1rootroot0Oct2910:43max_queued_events

-rw-r--r--1rootroot0Oct2910:43max_user_instances

-rw-r--r--1rootroot0Oct2910:43max_user_watches#显示这三个文件则证明支持。番外:

/proc/sys/fs/inotify/max_queued_evnets

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

/proc/sys/fs/inotify/max_user_instances

表示每一个realuserID可创建的inotifyinstatnces的数量上限。

/proc/sys/fs/inotify/max_user_watches

表示每个inotifyinstatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

例如:echo30000000>/proc/sys/fs/inotify/max_user_watches

5.1.2 inotify的安装

inotify可以编译安装也可以直接yum安装

我这里采用的是yum安装的方式

yum-yinstallinotify-tools

当然我这里也给出编译安装的方法

wgethttp://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

tarzxfinotify-tools-3.14.tar.gzcdinotify-tools-3.14./configure--prefix=/usr/local/inotify-3.14#配置inotify,并指定安装路径为/usr/local/inotify-3.14make&&makeinstall

注意这里安装完成后记得将命令所在路径引入环境变量

5.1.3 inotify之inotifywait命令常用参数详解

inotifywait--help

-r|--recursiveWatchdirectoriesrecursively.#递归查询目录-q|--quietPrintless(onlyprintevents).#打印监控事件的信息-m|--monitorKeeplisteningforeventsforever.Withoutthisoption,inotifywait

willexitafteroneeventisreceived.#始终保持事件监听状态--excludeiLike--excludebutcaseinsensitive.#排除文件或目录时,不区分大小写。--timefmtstrftime-compatibleformatstringforusewith%Tin--formatstring.#指定时间输出的格式--formatPrintusingaspecifiedprintf-likeformatstring;readthemanpageformoredetails.#打印使用指定的输出类似格式字符串-e|--event[-e|--event...]Listenforspecificevent(s).

Ifomitted,alleventsarelistenedfor.

#通过此参数可以指定需要监控的事件如下所示:

Events:

accessfileordirectorycontentswereread#文件或目录被读取。modifyfileordirectorycontentswerewritten#文件或目录内容被修改。attribfileordirectoryattributeschanged#文件或目录属性被改变。closefileordirectoryclosed,regardlessofread/writemode#文件或目录封闭,无论读/写模式。openfileordirectoryopened#文件或目录被打开。moved_tofileordirectorymovedtowatcheddirectory#文件或目录被移动至另外一个目录。

movefileordirectorymovedtoorfromwatcheddirectory#文件或目录被移动另一个目录或从另一个目录移动至当前目录。

createfileordirectorycreatedwithinwatcheddirectory#文件或目录被创建在当前目录deletefileordirectorydeletedwithinwatcheddirectory#文件或目录被删除

unmountfilesystemcontainingfileordirectoryunmounted#文件系统被卸载

5.1.4 编写监控脚本并加载到后台执行

#!/bin/bash#sjfhost01=192.168.42.116#inotify-slave的ip地址src=/backup/#本地监控的目录dst=backup#inotify-slave的rsync服务的模块名user=rsync_backup#inotify-slave的rsync服务的虚拟用户rsync_passfile=/etc/rsync.password#本地调用rsync服务的密码文件#inotify_home=/usr/share/doc/inotify-3.14#inotify的安装目录inotify_home=/usr#这个是yum安装的软件的安装所在目录#judgeif[-z"$src"]\

||[-z"${rsync_passfile}"]\

||[-z"${inotify_home}/bin/inotifywait"]\

||[-z"/usr/bin/rsync"];thenecho"CheckFileandFolder"exit9fi${inotify_home}/bin/inotifywait-mrq--timefmt'%d/%m/%y%H:%M'--format'%T%w%f'-eclose_write,delete,create,attrib$src\

|whilereadfiledo#rsync-avzP--delete--timeout=100--password-file=${rsync_passfile}$src$user@$host01::$dst>/dev/null2>&1cd$src&&rsync-aruz-R--delete./--timeout=100$user@$host01::$dst--password-file=${rsync_passfile}>/dev/null2>&1doneexit0

shinotify.sh&#将脚本加入后台执行bashinotify.sh&

[1]3357

5.1.5 实时同步测试

inotify-master操作:

cd/backup/foriin`seq200`;dotouch$i;done#创建200个文件ls-l--time-style=full-iso

total0-rw-r--r--1rootroot02016-10-2911:38:16.183409656+08001-rw-r--r--1rootroot02016-10-2911:38:16.225409783+080010-rw-r--r--1rootroot02016-10-2911:38:16.526410667+0800100-rw-r--r--1rootroot02016-10-2911:38:16.528410673+0800101-rw-r--r--1rootroot02016-10-2911:38:16.530410679+0800102-rw-r--r--1rootroot02016-10-2911:38:16.533410688+0800103-rw-r--r--1rootroot02016-10-2911:38:16.535410694+0800104-rw-r--r--1rootroot02016-10-2911:38:16.538410703+0800105-rw-r--r--1rootroot02016-10-2911:38:16.539410707+0800106-rw-r--r--1rootroot02016-10-2911:38:16.552410742+0800107

inotify-slave检查

ll--time-style=full-iso

total0-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+08001-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+080010-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800100-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800101-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800102-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800103-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800104-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800105-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800106-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800107-rw-r--r--1rsyncrsync02016-10-2911:38:16.000000000+0800108

这样我们结合inotify的测试就完成了,是不是很简单!

相关文章
最新文章
热点推荐