暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Rsync+inotify数据实时同步配置演示

爱婷如命一生一世 2019-06-03
309


在很多企业中对于高并发数据实时同步都有着自己的方案,我先列举一些:

  1. inotify(sersync)+rsync  实现文件级别的数据同步

  2. drdb 文件系统级别。

  3. 第三方软件的自带同步功能:mysql同步、oracle,mongodb

  4. 程序双写。(业务中实现程序双写,web服务器同时往两个备份服务器上去写入数据,这样就不用找操作数据同步了。)

  5. 业务逻辑解决。

我今天利用inotify配合rsync来实现数据实时同步,这张图中有一个弊端,在实施定时任务时,如果在间隔的时间内,某台web服务器出现异常状态,那么相应的数据内容就无法及时的推送到nfs共享服务器中,导致数据丢失!这样的话实时的数据同步机制诞生!

这种同步机制决定着当web等应用程序数据到达NFS服务器,会实时的同步到Rsync服务器当中去!至此Rsync形成了NFS的实时热备服务器!

优势在于:NFS宕机的时候,web服务器可以挂载到Rsync中寻找数据


实时同步软件介绍

  1. inotify 

    一种强大的、细粒度、异步的文件系统时间监控机制!

    原理在于:实时监控所对应的文件目录变化,监控文件系统!也包括磁盘写入的各种事件,监控到文件目录变化后,利用脚本调用rsync -avz /tmp/share/变化的文件 rsync@192.168.0.191::backup/ --password-flie=/etc/rsync.passwrod 这条命令来执行!

  2. sersync

    一款咱们强大祖国人民开发的,周洋在金山公司开发的。


    两个软件都属于触发式的,二选一即可!我列举intofy的演示!

rsync+inotify的组合,是为了弥补rsync的不足之处


rsync采用核心算法对远程服务器目标文件进行比对,子进行差异同步,如果服务器的文件容量达到了千万的量级,文件比对会非常的耗时,并且是差异同步,就变得非常低效!

实验拓扑

检查Rsync 服务器以deamon方式运行:

[root@Rsync ~]# lsof -i :873


配置NFS,将这台NFS服务器定义为客户端(同理,在日后rsync这台服务器上也要用定时任务将关键数据推送给NFS服务器,形成相互备份,只不过NFS上的共享目录我这里做的事实时备份,请区别这一点!)

新增一个rsync的密码文件,因为是密码文件,权限给600即可!

[root@Cenos6 etc]# echo 123456 >/etc/rsync.password

[root@Cenos6 etc]# chmod 600 /etc/rsync.password 

站在NFS服务器客户端上上,查看共享目录,这个共享文件目录按照拓扑,是提供给web服务器提供存储服务的,

[root@Cenos6 ~]# showmount -e localhost

共享文件目录的内容,如图所示:

检测NFS 推送数据情况,我们看下NFS客户端推送给Rsync服务器的数据情况,如图所示:推送成功

[root@Cenos6 ~]# rsync -avz /tmp/share/ rsync_backup@192.168.0.191::backup --password-file=/etc/rsync.password 其中有个错误提示,不用理会:

Rsync端的/backup下面文件已经推送过来了。



在进行推送的时候实验有个小报错,如图所示:根据提示就是自己拼错了。


到此,前提准备工作结束!


安装inotify工具

在NFS存储服务器上安装inotify工具,目的在于及时监控NFS存储文件目录的变化,新建一个文件目录:

[root@Cenos6 home]# mkdir fengxin/tools -p

inotify文件下载链接:

链接:https://pan.baidu.com/s/1fp1EeIwF8ViwQUK60gqiag 

提取码:48y8 


企业中不乏存在老旧系统,我们需要查看当前系统是否支持inotify,出现以下三个文件,代表支持!

[root@Cenos6 tools]# ls -l /proc/sys/fs/inotify/


源码包的安装大致分为三个步骤,都是基础,

  1. 解压(切换到当前目录)

  2. 编译安装

  3. make && make install 


演示如下:

[root@Cenos6 tools]# tar zxf inotify-tools-3.14.tar.gz 

[root@Cenos6 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14

[root@Cenos6 inotify-tools-3.14]# make && make install



为以后使用方便,建议使用软链,去版本号为的是更短路径!

[root@Cenos6 tools]# ls -l /usr/local/inotify-tools/

重要的inotify的配置文件

路径:/usr/local/inotify-tools/bin

①inotifywait:在被监控的文件和目录上等待特定文件系统事件(open/close/delete等)发生,执行后处于阻塞状态(所谓的阻塞状态就是不能退出!),适合在脚本中使用!

②inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计!


inotifywait参数详解:

[root@Cenos6 inotify-tools]# ./bin/inotifywait --help

-r :递归查询目录。

-q:打印很少的信息,仅仅打印监控事件的信息,可以理解成安静。

-m:始终保持事件监听状态。

-excludei:排除文件或目录,不区分大小写。

--fromat:格式

-e|--event 关键参数,事件(删增改查)

关于event事件的参数有很详细的解释:


inotifywait参数命令演示:

在CRT上克隆会话(开两个NFS端的窗口,以便于观察inotify的阻塞状态),其中我定义了事件为新增,并以安静的方式下按照格式和时间输出!

[root@Cenos6 ~]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /tmp/share

我们可以看到图中光标闪烁,就是所谓的阻塞状态,不能再做别的操作!

既然是监控了/tmp/share的文件,那么我在share文件下新增一个文件,看看有什么变化不?

[root@Cenos6 share]# touch share3.txt

我们可以从阻塞状态中看到了变化:inotifywait如就开始监控这个文件,一旦这个文件出现新增的话,他就打印出来结果!

当然还可以新增监控删除事件,我们以逗号分隔就好!同时监控多个事件

[root@Cenos6 ~]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /tmp/share

我在另外一个对话上/tmp/share文件里创建和删除操作:

inotifywait就会监控到文件目录的变化,并且将这个结果打印出来,汇报给系统管理员!


在实际的工作中,我们对文件监控的事件可以再增加一个close_write(修改),增删改就足够了!

[root@Cenos6 ~]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,close_write /tmp/share

利用脚本实现监控自动化同步

通过最基础的shell编程,将我们之前写的这些命令通过管道交给一个循环,发现变化就调用rsync来进行推送

脚本命令如下:

[root@Cenos6 scripts]# vim inotify.sh

#!/bin/bash

inotify=/usr/local/inotify-tools/bin/inotifywait

$inotify -mrq  --format '%w%f' -e create,close_write,delete /tmp/share \

|while read file

do

  cd / &&

  rsync -az ./tmp/share  --delete rsync_backup@192.168.0.191::backup/ \

  --password-file=/etc/rsync.password

done


在另外一个窗口中输入测试脚本,来测试文件的增删查是否正常:

[root@Cenos6 scripts]# sh -x inotify.sh

①新增测试

[root@Cenos6 share]# touch share20.txt

[root@Cenos6 share]# touch share21.txt



查看rsync服务器下的back目录下有share目录,进到share目录查看有新增的文件:

②删除测试:删除测试同步正常!

[root@Cenos6 share]# rm -f share3.txt 


③改动测试:改动测试正常!

[root@Cenos6 share]# echo change111 >share11.txt 


至此,脚本测试完毕。

配置脚本后台运行

[root@Cenos6 scripts]# /bin/sh /server/scripts/inotify.sh &

不要忘记开机自启动:

[root@Cenos6 scripts]# vi /etc/rc.local 

inotify优缺点

优点:

配合rsync实现数据实时同步。

缺点:

1>并发大于200个文件(10-100K),同步会有延迟。

2>单进程任务不如serync有真正的守护进程,无法对失败的文件进行重定向。

在这个架构方案中,10-300K的小文件,会产生200-300的并发,不会产生延迟。但是超过这个临界点的话,NFS客户端到rsync服务端会产生延迟!(可以用多个脚本、多个进程、多个目录暂时优化)在实际场景中这个200-300的并发其实也很大的!

经过测试:每秒200个文件并发,数据同步几乎无延迟!


inotify关键参数说明

/proc/sys/fs/inotify这个目录下面有三个文件,对inotify机制有一定的限制:

max_queued_events : 设置inotify实例时间(event)队列可容纳的事件数量。  (跟监控队列有关系)

max_user_instances : 设置每个用户可以运行的inotifywait或inotifywatch名ing的进程数。

max_user_watches :设置每个用户可以运行的inotifywait或者inotifywatch命令可以监视的文件数量。 (建议调大)

缺省情况下,这些参数的值都是偏小的:


在并发量较大的场景中,修改这些值即可:

echo "50000000"/proc/sys/fs/inotify/max_user_instances 



文章转载自爱婷如命一生一世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论