inotify+rsync实时同步
1.1 inotify简介
inotify是一种强大的,细粒度的,异步的文件系统时间监控机制,Linux内核从2.6.13加入了inotify支持,通过inotify可以监控文件系统汇中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正式实施这样的监控的软件,国人周洋在金山公司开发了类似的实时同步软件sersync.
公司主营业务:成都做网站、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出君山免费做网站回馈大家。
1.1.1 安装inotify
在安装inotify-tools前请先确认你的Linux内核是否达到了2.6.13,并且在编辑时开启CONFIG_INOTIFY选项,也可以通过以下命令检测。
安装inotify默认条件:
yum安装方式源信息必须设置正确:
默认的yum源(软件的仓库):base+extras+updates
国内yum源(软件的仓库):http://mirrors.aliyun.com/help/centos
扩展yum源(扩展的仓库):epel(企业级Linux的yum源的扩展仓库)
阿里云epel源:通过访问阿里yum源镜像地址获取
直接安装epel源方式:yum install epel-release
1.2 数据同步原理介绍
1.2.1 inotify+rsync实时同步
实时同步软件会负责监控磁盘文件系统的变化。比如:指定一个/data目录,实时同步软件服务进程会实时监控这个/data目录中数据的变化,即文件系统block与inode信息的变化。
实时同步软件服务进程监控/data目录文件系统数据一旦发生变化,就会执行rsync命令,将变化的文件数据信息推送到备份服务器相应的备份目录中,从而完成数据的实时备份。
rsync的传输效率是很高的但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源,如果只对经常改动的目录进行同步,也可以忽略这个问题,如果每次改动的目录多较大,那么就要用到inotify了。
inotify+rsync的方式使得效率更高效,只对经常改变的文件进行同步
安装 inotify 软件的前提 rsync 服务安装成功,可以在客户端推送拉取数据
另外:inotify 是在客户端配置安装的软件,别装错了
1.2.2 定时任务crond+rsync数据同步
rsync+定时任务的方式会定时的将系统中变动的文件定时的同步给服务器,但是定时任务的最小单位是分。这对于数据变化快而且数据重要的金融行业来说,显然是不能容忍的。因此这种方式有一定局限性。
1.3 inotify知识介绍
1.3.1 inotify软件的主要工具命令
[root@nfs01 ~]# rpm-ql inotify-tools ##查询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
[root@nfs01 ~]#
inotifywait:在被监控的文件或目录上等待特定文件系统时间(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用。
inotifywatch:收集被监控的文件系统使用度统计数据,指文件系统事件发生的次数统计。
说明:yum安装后可以直接使用,如果编译安装需要进入到相应软件目录的bin目录下使用。
1.3.2 查看当前系统是否支持inotify
[root@nfs01 etc]# uname -r
2.6.32-642.el6.x86_64
[root@nfs01 etc]# ls -l /proc/sys
sys/ sysrq-trigger sysvipc/
[root@nfs01 etc]# ls-l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 12 16:26 max_queued_events
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_instances
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_watches
[root@nfs01 etc]#显示上面三个文件说明支持inotify
[root@nfs01 ~]# cd/proc/sys/fs/inotify/
[root@nfs01 inotify]# ls
max_queued_events max_user_instances max_user_watches
[root@nfs01 inotify]# catmax_user_watches
8192
[root@nfs01 inotify]# catmax_user_instances
128
[root@nfs01 inotify]# catmax_queued_events
16384
[root@nfs01 inotify]#
关键参数说明:
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
1.3.3 inotify的工作机制(属于触发机制)
客户端开启运行inotify服务进程,检测共享目录的数据变化
获取到共享目录数据发生变化,通知执行rsync命令同步数据。
将变化数据发送到rsync服务端(开启rsync守护进程服务器)的共享目录中。
1.3.4 inotify同步命令详解
1.3.4.1 inotify命令的参数
命令参数 | 参数说明 |
-m|--monitor | 始终保持事件监听状态 |
-d|--daemon | 类似于-m参数,只是将命令运行在后台,记录触发的事件信息在指定文件中,利用--outfile参数,定义程序日志使用--syslog参数 |
-r(重要参数) | 递归监控目录数据信息变化 |
-o|--outfile | 打印事件到文件中,相当于标准正确输出 |
-s|--syslog | 发送错误到syslog相当于标准错误输出 |
-q|--quiet | 输出信息少(只打印事件信息) |
--exclude| | 排除文件或目录时,不区分大小写 |
--timefmt | 指定事件输出的格式 |
--format | 打印使用指定的输出类似格式字符串,即实际监控输出的内容。 |
-e | 指定监听指定的事件,如果省略,表示所有事件都进行监听 |
通过/usr/local/inotify-tools/bin/inotifywait --help命令获取监控事件信息。
1.3.4.2 inotify的事件
事件名称 | 事件说明 |
access | 文件或目录内容被读取 |
modify | 文件或目录内容被写入 |
attrib | 文件或目录属性改变 |
close_write | 文件或目录关闭,在写入模式打开之后关闭的。 |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的。 |
close | 文件或目录关闭,不管读或是写模式 |
open | 文件或目录被打开 |
moved_to | 文件或目录被移动到监控的目录中 |
moved_from | 文件或目录被移动从监控的目录中。 |
move | 文件或目录不管移动到或移动出监控目录都触发事件 |
create | 文件或目录创建在监控的目录中。 |
delete | 文件或目录被删除在监控的目录中 |
delete_self | 文件或目录被删除 |
unmount | 文件系统包含的文件或目录不能卸载 |
1.4 部署rsync+inotify过程
1.4.1 部署rsync守护进程模式(一)
部署rsync守护进程模式
服务端的配置
01:检查是否安装rsync
02:配置rsyncd.conf配置文件
03:创建rsync进程管理用户
04:创建模块的存储目录
05:修改存储目录的属主和属组权限
06:配置认证密码文件,授权为600权限
07:启动rsync守护进程服务
08:设置rsync服务开机自启动
09:进行测试
客户端的配置
01:创建密码文件,并授权600权限
02:客户端进行测试
服务端代码文件:
[root@backup nfsbackup]# vim/etc/rsyncd.conf
(省略部分内容)
[backup] ##模块名称
path = /backup
[nfsbackup] ##创建一个模块
path = /nfsbackup
"/etc/rsyncd.conf" 20L,474C written
创建备份模块
[root@backup ~]# mkdir /nfsbackup
授权属主属组
[root@backup ~]# chown -R rsync.rsync/nfsbackup/
查看授权情况
[root@backup ~]# ll -d /nfsbackup/
drwxr-xr-x 2 rsync rsync 4096 May 1109:22 /nfsbackup/
查看密码文件
[root@backup ~]# cat/etc/rsync.password
rsync_backup:123456
查看密码文件权限是否为600
[root@backup ~]# ll/etc/rsync.password
-rw------- 1 root root 20 May 4 17:51 /etc/rsync.password
[root@backup ~]#
[root@backup ~]# /etc/init.d/xinetdstatus
xinetd (pid 1810) is running...
[root@backup ~]# /etc/init.d/xinetdstop
Stopping xinetd: [ OK ]
[root@backup ~]# rsync --daemon
[root@backup ~]# ps -ef |grep rsync
root 4955 1 0 09:25 ? 00:00:00 rsync --daemon
root 4959 4860 0 09:25 pts/0 00:00:00 grep rsync
[root@backup ~]#
1.4.2 安装部署inotify(二)
1.4.2.1 手工测试inotify软件监控事件
打开两个相同的xshell窗口测试,在其中一个窗口输入下面代码:
[root@nfs01 data]# inotifywait-mrq /data/
/data/ DELETE oldboy.txt
/data/ CREATE oldboy.txt
/data/ OPEN oldboy.txt
/data/ ATTRIB oldboy.txt
/data/ CLOSE_WRITE,CLOSE oldboy.txt
在另外一个相同的窗口进行操作,如创建,删除,移动等。观察变化。
测试create 事件
在NFS服务器上开启inotify相应的监控功能,并输出信息
[root@nfs01 backup]#inotifywait -mqr --timefmt '%d/%y %H:%M' --format '%T %w%f' -e create /backup ###监控backup创建事件显示信息
12/17 23:18 /backup/oldbpy.txt
再开启一个NFS服务器连接窗口进行测试验证create事件。
[root@nfs01 backup]# ls
m
[root@nfs01 backup]# mkdir oldbpy.txt
[root@nfs01 backup]# ls
m oldbpy.txt
[root@nfs01 backup]# rm oldbpy.txt/-fr
[root@nfs01 backup]#
说明:只监控create创建事件,其他事件没有进行监控,其他事件产生,监控服务没有信息输出。
可以简化命令和输出信息:
[root@nfs01 backup]# inotifywait -mqr --format '%w%f' -e create /backup
/backup/1.txt 监控/backup目录创建事件显示信息。
/backup/2.txt
/backup/3.txt
/backup/4.txt
/backup/5.txt
再开启一个NFS服务器连接窗口进行测试验证create事件。
[root@nfs01 backup]# mkdir {1..5}.txt
[root@nfs01 backup]# ls
1.txt 2.txt 3.txt 4.txt 5.txt m
[root@nfs01 backup]# rm 3.txt/ -fr ##删除事件没有监控,另一端也没有信息输出。
[root@nfs01 backup]# ls
1.txt 2.txt 4.txt 5.txt m
[root@nfs01 backup]#
测试delete事件
在NFS服务器上开启inotify相应的监控功能,并输出信息
[root@nfs01 backup]# ls
1.txt 2.txt 4.txt 5.txt m
[root@nfs01 backup]# rm -fr 5.txt/ ##删除文件测试
[root@nfs01 backup]# rm -fr 2.txt/
[root@nfs01 backup]# mkdir oldboy.txt ###创建文件测试,但是没有信息输出
[root@nfs01 backup]#
再开启一个NFS服务器连接窗口进行测试验证delete事件
[root@nfs01 backup]# inotifywait-mqr --format '%w%f' -e delete /backup
/backup/5.txt
/backup/2.txt ##删除会有信息输出
测试moved事件
在NFS服务器上开启inotify相应的监控功能,并输出信息
[root@nfs01 backup]# inotifywait-mqr --format '%w%f' -e move /backup
/backup/oldboy.txt
/backup/1.txt
再开启一个NFS服务器连接窗口进行测试验证move事件
[root@nfs01 backup]# ls
1.txt 4.txt m
[root@nfs01 backup]# mv oldboy.txt//tmp/
[root@nfs01 backup]# mkdir 4
[root@nfs01 backup]# rm 4.txt/ -fr
[root@nfs01 backup]# mv 1.txt/ /tmp/
[root@nfs01 backup]#
说明:只监控move移动事件,其他事件并没有进行监控,其他事件产生,监控服务没有信息输出,因此利用监控移动事件,就对目录中文件或目录的移入和移出事件都监控了。
知识点结论:
通过上面的测试实验可以发现,有些监控事件已经包含了其他相应事件的监控功能,因此进行监控时可以根据要求精简相应的监控事件。
重要事件 | 包含事件 | 备注说明 |
close | close_write , close_nowrite | 文件或目录关闭,不管读写或是写模式;即包含写关闭或读关闭 |
close_write | create | 包含文件创建事件,但不包含目录创建事件 |
move | move_to move_from | 文件或目录不管移动到或移动出监控目录都触发事件,即包含信息移入或移除监控目录事件。 |
重要参数汇总:根据以上说明,在实际使用时,只要监控以下事件即可:create创建,delete删除,moved_to移入,close_write修改
1.4.2.2 rsync+inotify利用脚本进行结合
需要通过相应脚本实现目录中变化文件信息推送,脚本编写思路演变过程如下:
环境准备:在服务器上添加nfsbackup模块和nfsbackup目录,并授权属组和属主。
[root@backup nfsbackup]# cat/etc/rsyncd.conf
tart##
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup] ##模块名称
path = /backup
[nfsbackup] ##模块名称
path = /nfsbackup
[root@backup nfsbackup]#
[root@backup backup]# chown rsync.rsync /nfsbackup/
客户端上编写脚本实时监控目录中信息变化,并获取变化信息。
# 第一步:编写监控命令
#!/bin/bash
#desc: monitor /data and pushdatainfo to backup_server
/usr/bin/inotifywait -mrq --format"%w%f" -e moved_to,delete,create,close_write /data|\
第二步:编写脚本编写推送命令rsync 进行无差异同步 --delete /data/
while read line
do
rsync -az --delete /data/rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password
done
实现脚本监控目录信息事件,并让脚本在后台运行。
[root@nfs01 data]# sh/server/scripts/monitor.sh &>/dev/null &
[1] 9891
[root@nfs01 data]#
1.5 inotify的优缺点介绍
监控文件系统事件变化,通过同步工具实现实时数据同步。
并发如果大于200个文件(4-100k),同步就会有延迟。
前面写的脚本,每次都是全部推送一次,但确实是增量的,也可以只同步变化的文件,不变化的不理。
监控到事件后,请用rsync同步是单进程的(加&并发),sersync是多进程同步。
inotify服务优化
[root@nfs01 etc]# ls-l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 12 16:26 max_queued_events
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_instances
-rw-r--r-- 1 root root 0 May 12 16:26 max_user_watches
[root@nfs01 inotify]# catmax_user_watches
8192
[root@nfs01 inotify]# catmax_user_instances
128
[root@nfs01 inotify]# cat max_queued_events
16384
[root@nfs01 inotify]#
[root@nfs01 data]# cd/proc/sys/fs/inotify/
[root@nfs01 inotify]# ls
max_queued_events max_user_instances max_user_watches
[root@nfs01 inotify]# echo "50000000">/proc/sys/fs/inotify/max_user_watches
[root@nfs01 inotify]# echo "50000000">/proc/sys/fs/inotify/max_queued_events
[root@nfs01 inotify]# ##说明:以上配置重启可能会失效,需要放置在rc.local文件中。
本文标题:inotify+rsync实时同步
本文网址:http://ybzwz.com/article/ppcdcd.html