
在很多企业中对于高并发数据实时同步都有着自己的方案,我先列举一些:
inotify(sersync)+rsync 实现文件级别的数据同步
drdb 文件系统级别。
第三方软件的自带同步功能:mysql同步、oracle,mongodb
程序双写。(业务中实现程序双写,web服务器同时往两个备份服务器上去写入数据,这样就不用找操作数据同步了。)
业务逻辑解决。
我今天利用inotify配合rsync来实现数据实时同步,这张图中有一个弊端,在实施定时任务时,如果在间隔的时间内,某台web服务器出现异常状态,那么相应的数据内容就无法及时的推送到nfs共享服务器中,导致数据丢失!这样的话实时的数据同步机制诞生!

这种同步机制决定着当web等应用程序数据到达NFS服务器,会实时的同步到Rsync服务器当中去!至此Rsync形成了NFS的实时热备服务器!
优势在于:NFS宕机的时候,web服务器可以挂载到Rsync中寻找数据!


实时同步软件介绍
inotify
一种强大的、细粒度、异步的文件系统时间监控机制!
原理在于:实时监控所对应的文件目录变化,监控文件系统!也包括磁盘写入的各种事件,监控到文件目录变化后,利用脚本调用rsync -avz /tmp/share/变化的文件 rsync@192.168.0.191::backup/ --password-flie=/etc/rsync.passwrod 这条命令来执行!

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/

源码包的安装大致分为三个步骤,都是基础,
解压(切换到当前目录)
编译安装
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






