rsync + inotify 组合
Inotify是一种强大的异步的文件系统事件监控机制
NFS间的备份:
如果坏了其中一个的NFS这是就用到了inotify+rsync 把这个NFS的IP地址换到另一个NFS上
inotify 能保持时时同步 +rsync 但是单点问题也有
inotify 的实现有几款软件
1)inotify-tools,
2)sersync(金山周洋)
3)lsyncd
inotify 优点:
1)监控文件系统事件变化,通过同步工具实现实时数据同步
inotify 缺点
1)并发如果大于200个文件(10-100k),同步就会有延迟
2)我们前面写的脚本,每次都是全部推送一次,但确实是增量的。也可以只同步变化的文件,不变化的不理。
3)监控到事件后,调用rsync同步是单进程的,而sersync为多进程同步。既然有了inotify-tools,为什么还要开发sersync?
查看当前系统是否支持inotify:
[root@backup ~]# ls -l /proc/sys/fs/inotify
总用量 0
-rw-r--r-- 1 root root 0 3月 11 05:01 max_queued_events
-rw-r--r-- 1 root root 0 3月 11 05:01 max_user_instances
-rw-r--r-- 1 root root 0 3月 11 05:01 max_user_watches
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
Yum安装inotify-tools:首先要检查看有没有这个命令 wget 还有看能不能上网
需要把大M的文件移动到bak下
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install inotify-tools
rpm -qa inotify-tools
一共安装了2个工具,即inotifywait和inotifywatch
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,
执行后处于阻塞状态,适合shell脚本中使用。
inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。
inotifywait参数:
-r 递归查询目录
-q 打印很少的信息,仅仅打印监控事件的信息
-m 始终保持事件监听状态
-e 通过此参数可以指定需要监控的事件,如下一个列表所示
格式如: inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e create /backup
创建监控: -e create:制定监控的时间类型,监控创建create事件。
删除监控: -e delete:指定监听的事件类型。监听删除delete事件
写模式关闭监控: -e close_write:指定监听类型。监听文件写模式的关闭。
写模式监控如监控 如:ceho vim 创建新的文件时
编写inotify实时监控脚本:
1:#!/bin/bash
2:Path=/data
3:backup_Server=172.16.1.41
4:/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line
5:do
6: if [ -f $line ];then
7: rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
8: else
9: cd $Path &&
10: rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
11: fi
12:done
如果是文件的话就简单一下,如果不是文件的话才会推送所以
脚本命令解析:
| 是多线程
2行:目录的路径
3行:备份服务器的IP地址
4行:命令的绝对路径加-mrq参数--format‘%w%f’以绝对目录的方式-e是监控的三种事件 /data是目录的名字
| while read line 创建的一个循环 |管道符 一种特殊的用法,一但监控的事件有变化就会传送给
line这个变量 就会触发执行下面的命令
6行: 判读一下[ -f $line ] 是不是文件,是文件推送这个文件
7行: 是文件就推送
9行: 9和10是如果不是文件就进入它的目录下推它的所以
10行: 启动rsync这个命令 -az不显示信息 ./ 推当前目录下的所以内容 --delete 以一种时时同步的方式
rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password 朝这个服务器推
nfsbackup这个模块推 下面是密码文件
脚本可以加入开机启动:
echo "/bin/sh /server/scripts/inotify.sh &" >> /etc/rc.local
Rsync+inotify实时数据同步并发简单测试
[root@nfs01 data]# paste inotify_100_server.log
inotify_100_backup_server.log > inotify_100.txt
[root@nfs01 data]# cat inotify_100.txt
23:05 34227 23:05 34227
23:05 34387 23:05 34387
23:05 35027 23:05 35027
23:05 35587 23:05 35587
以下省略...
Inotify实时并发:
结论:经过测试,每秒200文件并发,数据同步几乎无延迟(小于1秒)
读写分离方法: 写%20 读%80
用户上传的图片或者附件单独存在NFS主服务器上;
用户读取数据从两台NFS备份服务器上读取;
NFS主和两台NFS备份通过inotify+rsync方式进行实时同步。