rsync+inotify实现数据的实时同步更新
rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样就可以解决同步数据的实时性问题。
一、rsync的优点与不足
rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过Linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify可以解决这个问题。
二、 初识inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
我们曾讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。
三、 安装inotify工具inotify-tools
由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了 2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持,也可以用如下方法判断,内核是否支持 inotify(服务器系统为Centos5.5 x86_64):
- uname -r
2.6.18-194.el5
- ls -lsart /proc/sys/fs/inotify/
总计 0
- 0 dr-xr-xr-x 7 root root 0 06-16 00:02 ..
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_watches
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_user_instances
- 0 -rw-r--r-- 1 root root 0 06-21 11:15 max_queued_events
- 0 dr-xr-xr-x 2 root root 0 06-21 11:15 .
通过以上显示我们明白,Centos5.5 x86_64是支持inotify的。
四、inotify的简单介绍
Inotify 是文件系统事件监控机制,作为 dnotify 的有效替代。dnotify 是较早内核支持的文件监控机制。Inotify 是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。
inotify 可以监视的文件系统事件包括:
- IN_ACCESS,即文件被访问
- IN_MODIFY,文件被 write
- IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
- 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)
注:上面所说的文件也包括目录。
五、rsync+inotify企业应用案例
我们的后端WEB是二台部署了Nginx的WEB服务器,由于没有共享存储,我们现在要实现的是对它们的根目录/data/htdocs/www实现即时同步更新。
- WebServer1:192.168.1.5,Centos5.5 x86_64
- WebServer2:192.168.1.6,Centos5.5 x86_64
根目录均为/data/htdocs/www,自动同步顺序为WebServer2à WebServer1,我们将WebServer1配置成rsync的服务器端即可
1.我们首先开始安装inotify-tools
可以到http://inotify-tools.sourceforge.net/下载相应的inotify-tools版本,然后开始编译安装:
- cd /usr/local/src
- tar zxvf inotify-tools-3.14.tar.gz
- cd inotify-tools-3.14
- ./configure &&make && make install
2.WebServer1端
即192.168.1.5的rsync,我们配置好/etc/rsyncd.conf文件,如下:
- [root@server ~0m]# vim /etc/rsyncd.conf
- uid = nobody
- gid = nobody
- user chroot = no
- max connections = 200
- timeout = 600
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsyncd.lock
- log file = /var/log/rsyncd.log
- [www]
- path=/data/htdocs/
- ignore errors
- read only = no
- list = no
- hosts allow = 192.168.1.0/255.255.255.0
- auth users = www
- secrets file = /etc/rsyncd.password
然后重启xinetd即可,如下所示:
- /etc/init.d/xinetd restart
记得二台WEB机器都要配置/etc/rsyncd.passwd文件,rsync的配置过程和原理请大家参考我在51cto.com的rsync配置相关文章,这里就不详细说明了。
3.我们配置好WebServer2的inotify
让其开机即启动,脚本内容如下:
- vim /root/rsync.sh
- #!/bin/bash
- src=/data/htdocs/www/
- des=www
- ip=192.168.1.5
- /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src | while read file
- do
- rsync -vzrtopg --delete --progress $src www@$ip::$des --password-file=/etc/rsyncd.password &&
- echo "$src was rsynced"
- done
脚本相关解释如下:
- timefmt:指定时间的输出格式。
- format:指定变化文件的详细信息。
这个脚本的作用就是通过inotify监控文件目录的变化,进而触发rsync进行同步操作,由于这个过程是一种主动触发操作,通过系统内核完成的,所以,比起那些遍历整个目录的扫描方式,效率要高很多。
然后我们将此脚本放在/etc/rc.local,即在最后一行添加,/etc/rc.local文件改动后内容如下:
- [root@slave www0m]# cat /etc/rc.local
- #!/bin/sh
- #
- # This script will be executed *after* all the other init scripts.
- # You can put your own initialization stuff in here if you don't
- # want to do the full Sys V style init stuff.
- touch /var/lock/subsys/local
- /root/rsync.sh &
修改rc.local后重启生效,注意最后的“&”不能少,如果不加“&”的话,系统无法重启。
如果文件无法同步的话,也可能是rsync.sh脚本写错了,那么可以在命令行界面直接执行:/root/rsync.sh,看是否有语法错误。
4.验证就很容易了
我们可以在192.168.1.6的机器的/data/htdocs/www目录下新建文件,更改文件内容,我们很欣慰的发现,192.168.1.5的机器上马上也会发生相应的改变,就像二台机器是网络Raid-1样,非常方便。
总体说来,rsync+inofity比较适用于没有存储环境的小文件的即时同步更新,如果要更新的文件非常大而且同步的机器数量在10台以上时,我建议还是以共享存储的方法来解决,如果没有资金购置昂贵的存储,大家不妨考虑下Heartbeat+DRBD+NFS方案来作为我们的文件服务器。
rsync+inotify实现数据的实时同步更新的更多相关文章
- 通过rsync+inotify实现数据的实时备份
我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp.tar备份方式相比,r ...
- rsync+inotify实现数据的实时备份
一.rsync概述 1.1.rsync的优点与不足 rsync与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需 ...
- 通过rsync+inotify实现数据的实时备份(多台备份机)
在前面的博文中,我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp.ta ...
- 通过rsync+inotify实现数据的实时备份 【转载】
在前面的博文中,我讲到过利用rsync实现数据的镜像和备份,但是要实现数据的实时备份,单独靠rsync还不能实现,本文就讲述下如何实现数据的实时备份. 一.rsync的优点与不足 与传统的cp ...
- rsync+sersync实现数据文件实时同步
一.简介 sersync是基于Inotify开发的,类似于Inotify-tools的工具: sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字: ...
- rsync+inotify百万级文件实时同步
实验环境:Centos7.4 目的:将源服务器的文件实时同步至目标服务器 源服务器:10.11.1.107 目标服务器:10.11.1.106 分别在两个节点安装rsync yum -y instal ...
- 使用rsync+inotify实现/www目录实时同步
一.实现bak-server 1.1安装rsync # yum -y install rsync 1.2修改配置文件 # vi /etc/rsyncd.conf #添加下面内容 uid=test gi ...
- nfs+rsync+inotify实现文件的实时同步
准备三台服务器进行测试: nfs_server:192.168.12.110 web_server:192.168.12.111 rsync_server:192.168.12.112 网络规划图: ...
- 烂泥:rsync与inotify集成实现数据实时同步更新
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要 ...
随机推荐
- Velodyne VPL16 configuration in ROS Kinetic
1. 驱动安装 sudo apt-get install ros-kinetic-velodyne 2. 在已有工作空间catkin_ws中,添加Velodyne包 cd ~/catkin_ws/sr ...
- 算法训练 数字三角形(DP)
问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...
- the ssl module in Python is not available错误解决
在使用pip安装pymongo的过程中报错,提示如下: $ pip3 install pymongo pip is configured with locations that require TLS ...
- localStorage、sessionStorage、cookie的有效期和作用域问题
sessionStorage,localStorage,cookie都可以实现客户端存储,三者的区别有哪些了? cookie作为最早期的被设计web浏览器存储少量数据,从底层看,它是作为http协议的 ...
- MPI编程指南
MPI编程指南 一. MPI概述 1.1 MPI的发展史 MPI标准化涉及到大约60个国家的人们,他们主要来自于美国和欧洲的40个组织,这包括并行计算机的多数主要生产商,还有来自大学.政府实 ...
- wget使用技巧
以下内容为转载: wget 是一个命令行的下载工具.对于我们这些 Linux 用户来说,几乎每天都在使用它.下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget. $ w ...
- Boost lockfree deque 生产者与消费者多对多线程应用
boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...
- 18.Jewels and Stones(珠宝和石头)
Level: Easy 题目描述: You're given strings J representing the types of stones that are jewels, and Sre ...
- 我的web安全工程师学习之路——规划篇
据网上收集的web安全工程师需要掌握哪些技能,职位要求以及如何入门,加上学习网易推出的web安全工程师微专业课程,为了进一步学习,所以给自己做了一些小小规划,也希望给同样想成为web安全工程师的同仁们 ...
- Unity 动画系统 AnimationEvent 动画事件