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(服务器系统为Centos6.5 x86_64):

uname -r

2.6.18-194.el6

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

总计 0

 max_user_watches
 max_user_instances
 max_queued_events

通过以上显示我们明白,Centos6.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.10.5,Centos6.5 x86_64
WebServer2:192.168.10.6,Centos6.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
# ln -sv inotify-tools-3.14 inotify-tools
# cd inotify-tools
# ./configure 
# make && make install

或直接 yum install inotify-tools

2.WebServer1端

即192.168.10.35的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的配置过程和原理请大家参考http://blog.csdn.net/moqiang02/article/details/37937795这里就不详细说明了。

3.我们配置好WebServer2的inotify

让其开机即启动,脚本内容如下:

vim /root/rsync.sh
#!/bin/bash
src=/data/htdocs/www/
des=www
ip=192.168.10.35
/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.10.36的机器的/data/htdocs/www目录下新建文件,更改文件内容,我们很欣慰的发现,192.168.1.5的机器上马上也会发生相应的改变,就像二台机器是网络Raid-1样,非常方便。

总体说来,rsync+inofity比较适用于没有存储环境的小文件的即时同步更新,如果要更新的文件非常大而且同步的机器数量在10台以上时,我建议还是以共享存储的方法来解决,如果没有资金购置昂贵的存储,大家不妨考虑下Heartbeat+DRBD+NFS方案来作为我们的文件服务器。

 

原创文章,作者:nene,如若转载,请注明出处:http://www.178linux.com/90865

(0)
nenenene
上一篇 2018-01-05
下一篇 2018-01-06

相关推荐

  • linux 计划任务

    Linux之 计划任务 介绍 相信每个人都有使用闹钟的习惯,我们设定闹钟的种类有很多。比如说,只提醒一次、工作日提醒、休息日提醒等。在设定闹钟之后,每天的设定时间都会按时的提醒你去做什么事情,以免自己忘记一些重要的会议等事情。像这样在每天特定的时间安排做一些事情。这样一种事情我们就称之为例行任务计划。 其实在个系统平台上都有类似的例行性任务计划功能,那如何去…

    Linux干货 2017-09-04
  • Linux文件类型及颜色标示

    在Linux系统中,有多种文件类型,不同的文件类型有不同的颜色。 ls -l 目录,这个命令可以在显示的类容中的第一个位置查看目录里面文件的类型。 Linux下用字符表示的文件类型 -:普通文件 d:目录文件 l:链接文件 b:块设备文件 c:字符设备文件 p:管道文件 同时 白色:表示普通文件 蓝色:表示目录 绿色:表示可执行文件 红色:表示压缩文件 浅蓝…

    Linux干货 2016-10-17
  • 文本处理工具-2

    1、 sed 是一种行/流编辑器,它一次处理一行内容;处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中该行内容,处理完成后,把缓冲区的该行内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed 可以用来自动编辑一个或多个文件。 2…

    Linux干货 2016-08-15
  • 计算机及Linux基础介绍

    Linux及计算机基础介绍 计算机的组成及其功能 What:计算机的组成是什么? 计算机的主要部件: CPU:可分为运算器、控制器、寄存器、缓存等 存储器:比如内存。执行程序时,会将程序及相关数据加载进内存,供CPU读取 输入设备:比如:键盘。用于下达指令及输入数据。 输出设备:比如显示器。用户显示和输出指令执行的结果等 冯诺依曼体系中提出的五大部件为:运算…

    Linux干货 2016-09-19
  • 通过webGUI显示日志信息

         日志信息通常对于我们维护人员有着极为重要的意义,能够为我们提供故障排查、运维监控、历史操作记录等等很多必要的信息。为了方便此类信息的获取,我们可以搭建日志服务器,并实现webGUI显示以便更直观形象的观察收集它们。     一、拓扑图         &nbs…

    Linux干货 2015-07-15
  • chmod命令详细用法

    指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [–help] [–version] mode file… 说明 : …

    Linux干货 2016-10-17