热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rsync与inotify集成实现数据实时同步更新

本文转载:http:ilanni.blog.51cto.com5268701605200把rsync与inotify集成实现数据的实时同步。要达到这个目的,我们需要分以下几个步骤:

本文转载:http://ilanni.blog.51cto.com/526870/1605200

把rsync与inotify集成实现数据的实时同步。

要达到这个目的,我们需要分以下几个步骤:

1、rsync的优点与不足

2、inotify是什么

3、检测OS是否支持inotify

4、inotify相关参数详解

5、inotify监控的文件事件类似

6、inotify-tools是什么

7、安装inotify-tools

8、inotifywait使用详解

9、inotifywatch使用详解

10、inotif-tools与rsync集成

一、rsync的优点与不足

rsync在Linux/Unix下是一个比较重要和实用的服务,大家应该已经知道rsync具有安全性高、备份迅速、支持增量备份等优点。

通过rsync可以解决对实时性要求不高的数据备份需求,例如:定期备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据安全性和可靠性也提出了更高的要求,rsync在高端业务系统中也逐渐暴露出它的不足。

首先,rsync在进行同步数据时,需要先扫描所有文件后进行比对,然后再进行差量传输。如果文件数量达到百万甚至千万级,扫描所以文件将是非常耗时的。而且发生变化的往往是其中很少的一部分文件,这是非常低效的方式。

其次,rsync不能实时地去监测、同步数据。虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作之间一定会有时间差。这样就可能会导致服务端和客户端数据出现不一致的情况,无法在应用出现故障时完全恢复数据。

基于以上原因,所以就考虑采用rsync与inotify集成的方式来解决这些问题。

二、inotify是什么

inotify是一种强大的、细粒度的、异步的文件系统事件监控机制。

Linux内核从2.6.13(2005年8月)起,加入了对inotify的支持,通过inotify可以监控文件系统中的添加、删除、修改、移动等各种细微事件。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样一个第三方软件。

在上面章节中,我们讲到,rsync可以实现触发式的文件同步。它是通过crontab守护进程方式触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变化时,就触发rsync同步,这就刚好解决了数据同步实时性的问题。

三、检测OS是否支持inotify

由于inotify特性需要Linux内核的支持,所以在安装inotify-tools之前要先确认Linux系统内核是否达到2.6.13以上。如果Linux内核低于2.6.23版本,就需要重新编译内核加入对inotify的支持,也可以用如下的方法来判断Linux内核是否支持inotify。

注意:目前本篇文章的OS为centos 6.5 64bit。

cat /etc/system-release

uname -r

ls -lsart /proc/sys/fs/inotify/

技术分享

只要执行ls -lsart /proc/sys/fs/inotify/命令,如下结果有max_user_watches、max_user_instances、max_queued_events这三个文件,说明centos 6.5 64bit是支持inotify的。

通过上图,我们可以很明显的看到centos 6.5 64bit是支持inotify的。

四、inotify相关参数详解

inotify定义了三个接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求实时的调节其大小。下面分别做简单介绍:

/proc/sys/fs/inotify/max_queued_evnets

表示请求events数的最大值,超出这个值的事件将被丢弃。该值默认为16384。

注意:max_queued_events是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。

如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用。

/proc/sys/fs/inotify/max_user_instances

表示每个user可创建的instances数量上限。该值默认为128。

/proc/sys/fs/inotify/max_user_watches

表示可监控目录的最大数。该值默认为8192。

要修改以上默认值,我们可以使用以下类似手段修改。如下:

echo 30000000>/proc/sys/fs/inotify/max_user_watches

技术分享

五、inotify监控的文件事件类型

inotify可监控的文件系统事件类型,如下:

IN_ACCESS:文件被访问。

IN_MODIFY:文件被write。

IN_ATTRIB:文件属性被修改,如chmod、chown等。

IN_CLOSE_WRITE:可写文件被close。

IN_CLOSE_NOWRITE:不可写文件被close。

IN_OPEN:文件被open。

IN_MOVED_FROM:文件被移出被监控目录,如mv。

IN_MOVED_TO:文件被移入被监控目录,如mv、cp。

IN_CREATE:文件/文件夹被创建。

IN_DELETE:文件/文件夹被删除,如rm。

IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除自己。

IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动自己。

IN_UNMOUNT:宿主文件系统被umount。

IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。

IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。

注意:上面所说的文件也包括目录。

六、inotify-tools是什么

inotify仅仅是一个API,需要通过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。这些命令行工具可用于通过命令行或脚本对某些文件系统的事件进行监控。

inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。

1)inotify不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,并且会产生一个umount事件。

2)inotify既可以监视文件,又可以监视目录。

3)inotify使用系统调用而非SIGIO信号来通知文件系统事件。

4)inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select和poll来监视文件系统的变化。

七、安装inotify-tools

inotify-tools的安装可以分为源码方式和RPM方式。下面就这两种方式一一讲解。

注意:inotify-tools主要是通过inotifywait和inotifywatch,这两个命令进行工作。特别是inotifywait命令,是我们生产环境中使用最多的命令。

7.1 源码方式安装

源码方式安装inotify-tools,我们可以去inotify-tools官网去下载源码包。

inotify-tools官网:

https://github.com/rvoicilas/inotify-tools/wiki

下载inotify-tools并安装,如下:

技术分享

注意:不建议使用wget下载inotify-tools,因为我在使用wget下载inotify-tools一直不成功,后来查询相关资料发现是github网站的原因。

wget https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

技术分享

我们可以先通过浏览器下载本地,然后通过rz命令上传到服务器。

要使用rz命令,我们需要安装lrzsz软件,如下:

yum -y install lrzsz

技术分享

lrzsz安装完毕后,我们来上传inotify-tools软件包。如下:

技术分享

现在开始解压、安装inotify-tools,如下:

tar -xf inotify-tools-3.14.tar.gz

./configure

make&&make install

技术分享

技术分享

技术分享

安装完毕后,我们切换到/usr/local/bin/目录下查看,如下:

cd /usr/local/bin/

技术分享

通过上图,我们可以看到inotifywait和inotifywatch命令已经被安装到/usr/local/bin/目录下。

7.2 RPM方式安装

要RPM方式安装inotify-tools,我们首先要配置yum源,否则系统会提示找不到inotify-tools这软件包。如下:

技术分享

我们可以去下面这个连接下载最新的yum源,如下:

http://dl.fedoraproject.org/pub/epel/6/x86_64/

技术分享

下载epel-release-6-8.noarch.rpm软件包并安装,如下:

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm

技术分享

技术分享

以上操作完毕后,我们再来yum安装inotify-tools,如下:

yum –y install inotify-tools

技术分享

查看inotify-tools安装的生成的文件,如下:

rpm -ql inotify-tools

技术分享

通过上图,我们可以很容易的看到inotifywait和inotifywatch已经被安装到了/usr/bin/目录下。

以上就是有关inotify-tools的安装。

八、inotifywait使用详解

inotify-tools命令中,我们使用最多的就是inotifywait命令。

inotifywait是一个监控等待事件,它主要用于监控文件或目录的变化,并且可以递归地监控整个目录树。

8.1 inotifywait命令详解

有关inotifywait的使用方法,我们可以通过它的帮助信息查看。如下:

inotifywait -h

技术分享

技术分享

通过上图,我们可以看到inotifywait参数很多。下面我们就介绍下一些经常使用的参数:

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

-r表示递归查询目录。

-q表示打印出监控事件。

-e通过此参数可以指定要监控的事件。可监听的事件,如下:

access:访问,读取文件。

modify:修改,文件内容被修改。

attrib:属性,文件元数据被修改。

move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。

create:创建,生成新文件

open:打开,对文件进行打开操作。

close:关闭,对文件进行关闭操作。

delete:删除,文件被删除。

--timefmt是指定时间的输出格式,用于--format选项中的%T格式。

--format指定文件变化的详细信息输出格式。格式参数如下:

%w表示发生事件的目录

%f表示发生事件的文件

%e表示发生的事件

%T使用由--timefmt定义的时间格式

%Xe事件以“X”分隔

8.2 inotifywait命令实例

8.1章节我们讲解了inotifywait命令的参数,下面我们来实际使用下inotifywait命令。

我们要监测/home目录下所有文件及目录的变化情况,命令如下:

inotifywait -mrq --timefmt ‘%y/%m/%d/%H:%M‘ --format ‘%T %w %f %e‘ -e modify,delete,create,attrib,move,open,close,access /home/

这条命令表示对/home目录下所有文件及目录的操作进行监控。

技术分享

现在我们打开另外一个窗口对/home目录进行操作,如下:

技术分享

我们是在/home目录下创建一个空的文件createfile以及一个新的目录createmkdir。

现在我们来切换到刚刚执行inotifywait命令的窗口,如下:

技术分享

通过上图,我们可以很容易的看到inotifywait已经监控到我们前面创建的文件以及目录。

九、inotifywatch使用详解

除了inotifywatit命令之外,inotify-tools还有一个命令inotifywatch。

inotifywatch主要用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

9.1 inotifywatch命令详解

inotifywatch使用可以查看其帮助信息,如下:

inotifywatch -h

技术分享

inotifywatch参数说明如下:

-h:输出帮助信息。

-v:输出详细信息。

@:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

–-fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

-z:输出表格的行和列,即使元素为空。

–-exclude:正则匹配需要排除的文件,大小写敏感。

–-excludei:正则匹配需要排除的文件,忽略大小写。

-r:监视一个目录下的所有子目录。

-t:设置超时时间。

-e:只监听指定的事件。该事件与inotifywait监听的事件类型一样。

-a:以指定事件升序排列。

-d:以指定事件降序排列。

9.2 inotifywatch命令实例

9.1章节我们讲解了inotifywatch命令的参数,下面我们来实际使用下inotifywatch命令。

要求统计60秒内/home目录下文件系统的事件,使用如下命令:

inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home

技术分享

现在我们打开另外一个窗口对/home目录进行操作,如下:

技术分享

我们是在/home目录下删除一个文件createfile以及重命名createmkdir为test。

现在我们来切换到刚刚执行inotifywatch命令的窗口,如下:

技术分享

通过上图,我们可以很容易的看到inotifywatch已经监控到我们前面删除的文件和重命名的目录文件事件数量。

十、inotify-tools与rsync集成

inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync客户端,而rsync服务器端正需要按照正常的配置进行即可。

注意:该集成的主要目的是把rsync客户端需要备份的文件实时推送到rsync服务器上。

有关rsync的配置,可以参考《烂泥:linux文件同步之rsync学习(一)》这篇文章,而且本次实验的环境和这篇文章是同一个环境。

rsync服务器是192.168.199.247,rsync客户端为192.168.199.248。

我们现在的要求是只要rsync客户端的/home/www目录下有任何文件或者目录有改动的情况,都要实时的同步到rsync服务器上。

rsync服务器已经正常运行,相关配置文件如下:

技术分享

技术分享

下面我们的所有操作都是在rsync客户端上进行的,其实inotifywait命令与rsync命令集成,我们所要做的只是写一个shell脚本即可。脚本内容如下:

#!/bin/bash

src=/root/www/

dest=www

ip=192.168.199.247

/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y%H:%M‘ --format ‘%T %w %f‘ -e modify,delete,create,attrib $src | while read DATE TIME DIR FILE;

do

filechange=${DIR}${FILE}

/usr/bin/rsync -avz --delete --progress $src apache@$ip::$dest --password-file=/etc/rsyncd.password &

echo "At ${TIME} on ${DATE}, file $filechange was backed up via rsynce" >>/tmp/rsync.log 2>&1

done

技术分享

在这个脚本中,我只讲解while read DATE TIME DIR FILE这条语句,其他语句请自行查看相关文档。

inotifywait命令产生三个返回值,分别是“日期,时间,文件”这3个返回值会做为参数传给read,因此脚本中的“while read D E F”写法细化了返回值。

该脚本的原理是利用inotifywait命令对指定的文件和目录进行监控,如果指定文件和目录有改变那么就启动rsync同步命令。

上述脚本写好后,我们要给予其执行权限,然后配置其开机后台运行,并启动。使用如下命令:

chmod 700 inotify.sh

chmod u+x inotify.sh

ll |grep inotify.sh

echo "sh /root/inotify.sh > /dev/null &" >>/etc/rc.local

sh inotify.sh > /dev/null &

技术分享

注意:为了让该脚本启动后台运行,一定要把启动命令写成图中的形式,否则该脚本在进行同步文件时会报如下的信息:

技术分享

以上配置完毕后,我们来测试看看其效果。在rsync客户端上新建一个文件ilanni.txt,如下:

touch www/ilanni.txt

技术分享

现在切换rsync服务器上查看刚刚在rsync客户端上创建的文件是否已经同步过来。

技术分享

通过上图,我们可以很明显的看到文件已经同步过来。

再来rsync客户端查看相关的日志,如下:

技术分享

可以看到日志中记录同步的时间已经同步的文件。

到此inotify-tools与rsync的集成已经全部配置完毕。

本文出自 “从心开始” 博客,请务必保留此出处http://hao360.blog.51cto.com/5820068/1606368

rsync与inotify集成实现数据实时同步更新


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
-DJIAJIAN-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有