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软件的主要工具命令

[[email protected] ~]# 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

[[email protected] ~]#

  • inotifywait:在被监控的文件或目录上等待特定文件系统时间(open close delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用。
  • inotifywatch:收集被监控的文件系统使用度统计数据,指文件系统事件发生的次数统计。

说明:yum安装后可以直接使用,如果编译安装需要进入到相应软件目录的bin目录下使用。

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

[[email protected] etc]# uname -r

2.6.32-642.el6.x86_64

[[email protected] etc]# ls -l /proc/sys

sys/           sysrq-trigger  sysvipc/      

[[email protected] 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

[[email protected] etc]#显示上面三个文件说明支持inotify

[[email protected] ~]# cd/proc/sys/fs/inotify/

[[email protected] inotify]# ls

max_queued_events  max_user_instances  max_user_watches

[[email protected] inotify]# catmax_user_watches

8192

[[email protected] inotify]# catmax_user_instances

128

[[email protected] inotify]# catmax_queued_events

16384

[[email protected] 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 <file>


打印事件到文件中,相当于标准正确输出


-s|--syslog


发送错误到syslog相当于标准错误输出


-q|--quiet


输出信息少(只打印事件信息)


--exclude|<pattern>


排除文件或目录时,不区分大小写


--timefmt <fmt>


指定事件输出的格式


--format <fmt>


打印使用指定的输出类似格式字符串,即实际监控输出的内容。


-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:客户端进行测试

服务端代码文件:

[[email protected] nfsbackup]# vim/etc/rsyncd.conf

(省略部分内容)

[backup]                               ##模块名称

path = /backup

[nfsbackup]                               ##创建一个模块

path = /nfsbackup

"/etc/rsyncd.conf" 20L,474C written    

创建备份模块

[[email protected] ~]# mkdir /nfsbackup

授权属主属组

[[email protected] ~]# chown -R rsync.rsync/nfsbackup/

查看授权情况

[[email protected] ~]# ll -d /nfsbackup/

drwxr-xr-x 2 rsync rsync 4096 May 1109:22 /nfsbackup/

查看密码文件

[[email protected] ~]# cat/etc/rsync.password

rsync_backup:123456

查看密码文件权限是否为600

[[email protected] ~]# ll/etc/rsync.password

-rw------- 1 root root 20 May  4 17:51 /etc/rsync.password

[[email protected] ~]#

[[email protected] ~]# /etc/init.d/xinetdstatus

xinetd (pid  1810) is running...

[[email protected] ~]# /etc/init.d/xinetdstop

Stopping xinetd:                                         [  OK  ]

[[email protected] ~]# rsync --daemon

[[email protected] ~]# 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

[[email protected] ~]#

1.4.2 安装部署inotify(二)

1.4.2.1         手工测试inotify软件监控事件

打开两个相同的xshell窗口测试,在其中一个窗口输入下面代码:

[[email protected] 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相应的监控功能,并输出信息

[[email protected] 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事件。

[[email protected] backup]# ls

m

[[email protected] backup]# mkdir oldbpy.txt

[[email protected] backup]# ls

m oldbpy.txt

[[email protected] backup]# rm oldbpy.txt/-fr

[[email protected] backup]#

说明:只监控create创建事件,其他事件没有进行监控,其他事件产生,监控服务没有信息输出。

可以简化命令和输出信息:

[[email protected] 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事件。

[[email protected] backup]# mkdir {1..5}.txt

[[email protected] backup]# ls

1.txt 2.txt  3.txt  4.txt 5.txt  m

[[email protected] backup]# rm 3.txt/ -fr                ##删除事件没有监控,另一端也没有信息输出。

[[email protected] backup]# ls

1.txt 2.txt  4.txt  5.txt m

[[email protected] backup]#

  • 测试delete事件

在NFS服务器上开启inotify相应的监控功能,并输出信息

[[email protected] backup]# ls

1.txt 2.txt  4.txt  5.txt m

[[email protected] backup]# rm -fr 5.txt/            ##删除文件测试

[[email protected] backup]# rm -fr 2.txt/

 [[email protected] backup]# mkdir oldboy.txt           ###创建文件测试,但是没有信息输出

[[email protected] backup]#

再开启一个NFS服务器连接窗口进行测试验证delete事件

[[email protected] backup]# inotifywait-mqr  --format ‘%w%f‘ -e delete /backup

/backup/5.txt

/backup/2.txt                  ##删除会有信息输出

  • 测试moved事件

在NFS服务器上开启inotify相应的监控功能,并输出信息

[[email protected] backup]# inotifywait-mqr  --format ‘%w%f‘ -e move /backup

/backup/oldboy.txt

/backup/1.txt

再开启一个NFS服务器连接窗口进行测试验证move事件

[[email protected] backup]# ls

1.txt 4.txt  m

[[email protected] backup]# mv oldboy.txt//tmp/

[[email protected] backup]# mkdir 4

[[email protected] backup]# rm 4.txt/ -fr

[[email protected] backup]# mv 1.txt/ /tmp/

[[email protected] 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目录,并授权属组和属主。

[[email protected] 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

[[email protected] nfsbackup]#

[[email protected] 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/[email protected]::nfsbackup --password-file=/etc/rsync.password

done

  • 实现脚本监控目录信息事件,并让脚本在后台运行。

[[email protected] data]# sh/server/scripts/monitor.sh &>/dev/null &

[1] 9891

[[email protected] data]#

1.5 inotify的优缺点介绍

  • 监控文件系统事件变化,通过同步工具实现实时数据同步。
  • 并发如果大于200个文件(4-100k),同步就会有延迟。
  • 前面写的脚本,每次都是全部推送一次,但确实是增量的,也可以只同步变化的文件,不变化的不理。
  • 监控到事件后,请用rsync同步是单进程的(加&并发),sersync是多进程同步。
  • inotify服务优化

[[email protected] 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

[[email protected] inotify]# catmax_user_watches

8192

[[email protected] inotify]# catmax_user_instances

128

[[email protected] inotify]# cat max_queued_events

16384

[[email protected] inotify]#

[[email protected] data]# cd/proc/sys/fs/inotify/

[[email protected] inotify]# ls

max_queued_events  max_user_instances  max_user_watches

[[email protected] inotify]# echo "50000000">/proc/sys/fs/inotify/max_user_watches

[[email protected] inotify]# echo "50000000">/proc/sys/fs/inotify/max_queued_events

[[email protected] inotify]# ##说明:以上配置重启可能会失效,需要放置在rc.local文件中。

时间: 2024-08-15 09:00:12

inotify +rsync 实时同步的相关文章

Inotify+rsync实时同步工具实战

Inotify+rsync实时同步工具实战 分别有机器:server-178/24,client-b-179/24,client-c-180/24 中心分发服务器Master:client-c-180/24 备份服务器    :client-b-179/24和server-178/24 基于备份服务器已经提供rsync --daemon的基础上,在中心分发服务器(rsync客户端)配置inotify,监控的目录设置为/www/ 1.查看当前系统是否支持inotify ls -l /proc/sy

配置inotify+rsync实时同步

对rsync服务及命令不熟悉的,可以参考博文通过rsync实现远程同步这里就不多说了! Linux内核从2.6.13版本开始就已经提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取.删除.移动.修改等.利用这一机制,可以非常方便的实现文件异动告警.增量备份,并针对目录或文件的变化及时作出响应. 将inotify机制与rsync工具相结合,可以实现出发时备份(实时同步)--只要原始位置的文档发生变化,则立即启动增量备份,否则处于静默等待状态,如图所示:这样,就避免了按固定周期

真正的inotify+rsync实时同步 彻底告别同步慢

我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题.但当web文件越来越多(百万级数量html,jpg等小 文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决.经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快.大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑.下面我们来分 析. inotifywait 单独分析 /usr/local/bin/

centos 7配置inotify+rsync实时同步

Linux内核提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取.删除.移动.修改等.利用这个机制,可以非常方便地实现文件异动告警.增量备份,并针对目录或文件的变化及时作出响应. 将inotify机制和rsync工具相结合,可以实现触发式备份(实时同步)--只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静默状态,这样,避免了周期性备份时存在的延迟性.周期过密等问题. 在Linux内核中,默认的inotify机制提供了三个调控参数: [[email protec

配置 inotify+rsync 实时同步

rsync 虽然可以实现快速备份,但是什么东西都不可能是十全十美的,作为计划任务备份,都是固定时间进行的,而且延迟明显.实时性差,当同步源长期不变化时,密集的定期任务是不必要的.实时备份就不同了,一旦同步源出现变化,立即启动备份,只要同步源无变化,则不执行备份,但是他只能实现上传功能.Linux内核提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取.删除.移动.修改等.利用这个机制,可以非常方便地实现文件异动告警.增量备份,并针对目录或文件的变化及时作出响应. 将inoti

inotify+rsync实时同步 彻底告别同步慢

#!/bin/bash src=/data/            # 需要同步的源路径 des=data              # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单. rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件 ip1=192.168.0.18      # 目标服务器1 ip2=192.168.0.19      #

inotify+rsync实时同步【优化版本-转发】

#!/bin/bash src=/data/ # 需要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单. rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd

inotify+rsync实时同步

server部署:#!/bin/baash rpm -qa inotify-tools && yum -y install inotify-tools inotifywait -mrq /data --format '%w%f' -e create,delete,close_write,moved_to|\while read linedo rsync -az --delete /data/ [email protected]::backup --password-file=/etc/rs

Inotify+Rsync实时同步文件

一.网络拓补图: 原文地址:http://blog.51cto.com/hbgslz/2064576