利用Inotify和Rsync将web工程文件自动同步到多台应用服务器

标签: 利用 inotify rsync | 发表时间:2014-06-30 19:33 | 作者:mchdba
出处:http://blog.csdn.net


背景:需要搭建一套跟线上一模一样的环境,用来预发布,这是其中的web分发的一个小模块的实现过程。

 

1 工具以及环境简介

1.1,Inotify工具

Inotify,它是一个内核用于通知用户空间程序文件系统变化的机制。众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug、udev 和 inotify 就是这种需求催生的。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的机制,桌面系统能够利用它对设备进行有效的管理,udev 动态地维护 /dev 下的设备文件,inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知,该机制是著名的桌面搜索引擎项目 beagle 引入的,并在 Gamin 等项目中被应用。

 

1.2,rsync工具

它是类unix系统下的数据镜像备份工具,实现远程同步remote sync,它的特性如下:

(1),可以镜像保存整个目录树和文件系统。

(2),可以很容易做到保持原来文件的权限、时间、软硬链接等等。

(3),无须特殊权限即可安装。

(4),快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

(5),安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

(6),支持匿名传输,以方便进行网站镜象。

 

1.3,简单环境介绍:

(1),服务器端(代码发布服务器):192.168.0.51

(2),客户端(Web服务器):192.168.0.50,192.168.0.53

(3),Web目录:/usr/local/nginx/web/

(4),基本原理:由192.168.0.51上inotify服务监测文件目录/usr/local/nginx/web是否有更新,如果有更新(修改,删除,新建)inotify就会通过rsync命令将更新的文件推向二台web服务器(192.168.0.50和192.168.0.53)。

(5),架构图如下:

2.1,查看线上inotify版本

通过rsync -h找到查看帮助,找到 --version参数。

[root@localhost bin]# inotifywait --help

inotifywait 3.14

Wait for a particular event on a file or set of files.

Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

Options:

……

 看到版本号码是3.14

 

2.2,下载inotify版本

下载地址:http://download.csdn.net/detail/mchdba/7564775

 

2.3,开始编译安装

[root@localhost root] tar -xvf inotify-tools-3.14.tar.gz

通过./configure --help查看编译参数,这里选取--prefix参数,开始编译:

[root@localhost inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14

...

config.status: creating Makefile

config.status: creating src/Makefile

config.status: creating man/Makefile

config.status: creating libinotifytools/Makefile

config.status: creating libinotifytools/src/Makefile

config.status: creating libinotifytools/src/inotifytools/Makefile

config.status: creating config.h

config.status: creating libinotifytools/src/inotifytools/inotify.h

config.status: executing depfiles commands

config.status: executing libtool commands

 

[root@localhost inotify-tools-3.14]# time make

...

fytools.so -Wl,-rpath -Wl,/usr/local/inotify-tools-3.14/lib

make[2]: Leaving directory `/root/inotify-tools-3.14/src'

Making all in man

make[2]: Entering directory `/root/inotify-tools-3.14/man'

make[3]: Entering directory `/root/inotify-tools-3.14'

make[3]: Leaving directory `/root/inotify-tools-3.14'

make[2]: Nothing to be done for `all'.

make[2]: Leaving directory `/root/inotify-tools-3.14/man'

make[2]: Entering directory `/root/inotify-tools-3.14'

cd . && /bin/sh ./config.status config.h

config.status: creating config.h

config.status: config.h is unchanged

make[2]: Leaving directory `/root/inotify-tools-3.14'

make[1]: Leaving directory `/root/inotify-tools-3.14'

 

real  0m2.889s

user 0m1.768s

sys   0m0.589s

 

[root@localhost inotify-tools-3.14]# time make install

...

make[2]: Nothing to be done for `install-exec-am'.

make[2]: Nothing to be done for `install-data-am'.

make[2]: Leaving directory `/root/inotify-tools-3.14'

make[1]: Leaving directory `/root/inotify-tools-3.14'

 

real  0m0.854s

user 0m0.454s

sys   0m0.254s

 

2.4,做成软连接到/usr/lib下

ln -sv /usr/local/inotify-tools-3.14/lib/libinotify* /usr/lib/ 

ln -s /usr/local/inotify-tools-3.14/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

设置环境变量:

[root@localhost ~]# echo "export PATH=$PATH:/usr/local/inotify-tools-3.14/bin">>/etc/profile

[root@localhost ~]# source /etc/profile

[root@localhost ~]# inotifywait --help

inotifywait 3.14

Wait for a particular event on a file or set of files.

Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

...

现在可以直接用inotify命令而不用附带加上全路径

 

3,开始安装rsync软件

在192.168.0.51,192.168.0.50,192.168.0.53按照如下顺序安装rsync软件


3.1,查看线上rsync版本

通过rsync -h找到查看帮助,找到 --version参数。

[root@localhost ~]# rsync --version

rsync  version 3.0.6  protocol version 30

Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

Web site: http://rsync.samba.org/

[root@localhost ~]#

 

3.2,下载

wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.6.tar.gz

 

3.3,编译安装

# 解压缩

[root@localhost root]# tar -xvf rsync-3.0.6.tar.gz

[root@localhost rsync-3.0.6]# cd rsync-3.0.6

# 通过./configure --help查看编译参数,这里选取--prefix参数

[root@localhost rsync-3.0.6]# ./configure --prefix=/usr/local/rsync-3.0.6/

......

config.status: creating lib/dummy

config.status: creating zlib/dummy

config.status: creating popt/dummy

config.status: creating shconfig

config.status: creating config.h

 

    rsync 3.0.6 configuration successful

 

[root@localhost rsync-3.0.6]# make

......

gcc -std=gnu99 -I. -I. -g -O2 -DHAVE_CONFIG_H -Wall -W -I./popt  -c popt/poptparse.c -o popt/poptparse.o

gcc -std=gnu99 -g -O2 -DHAVE_CONFIG_H -Wall -W -I./popt  -o rsync flist.o rsync.o generator.o receiver.o cleanup.o sender.o exclude.o util.o main.o checksum.o match.o syscall.o log.o backup.o options.o io.o compat.o hlink.o token.o uidlist.o socket.o hashtable.o fileio.o batch.o clientname.o chmod.o acls.o xattrs.o progress.o pipe.o params.o loadparm.o clientserver.o access.o connection.o authenticate.o lib/wildmatch.o lib/compat.o lib/snprintf.o lib/mdfour.o lib/md5.o lib/permstring.o lib/pool_alloc.o lib/sysacls.o lib/sysxattrs.o  zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/trees.o zlib/zutil.o zlib/adler32.o zlib/compress.o zlib/crc32.o popt/findme.o  popt/popt.o  popt/poptconfig.o popt/popthelp.o popt/poptparse.o

[root@localhost rsync-3.0.6]#

[root@localhost rsync-3.0.6]# make install

mkdir -p /usr/local/rsync-3.0.6/bin

/usr/bin/install -c  -m 755 rsync /usr/local/rsync-3.0.6/bin

mkdir -p /usr/local/rsync-3.0.6/share/man/man1

mkdir -p /usr/local/rsync-3.0.6/share/man/man5

if test -f rsync.1; then /usr/bin/install -c -m 644 rsync.1 /usr/local/rsync-3.0.6/share/man/man1; fi

if test -f rsyncd.conf.5; then /usr/bin/install -c -m 644 rsyncd.conf.5 /usr/local/rsync-3.0.6/share/man/man5; fi

[root@localhost rsync-3.0.6]#

 

3.3,check命令

[root@localhost ~]# rsync -h

rsync  version 3.0.6  protocol version 30

Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.

Web site: http://rsync.samba.org/

看来已经安装好,命令可以直接使用。

 

3.4,配置rsyncd.conf启动参数文件

[root@localhost ~]# vim /etc/rsyncd.conf

uid=nginx  #用户id名称

gid=nginx  #用户所属组ID

use chroot=no

max connections=10

strict modes=yes

port=873

address=192.168.0.50 #本机地址,3台IP地址都填写自己的IP地址

#ignore erros

read only=no

list=no

auth users=nginx

secrets file=/etc/rsync.pas  #密码认证文件地址

hosts allow=192.168.0.51,192.168.0.53 #允许rsync同步的ip地址,除了本机地址的其它2个ip地址。

pid file=/home/nginx/rsync/rsyncd.pid

lock file=/home/nginx/rsync/rsync.lock

log file=/home/nginx/rsync/rsyncd.log

 

[web]

path=/usr/local/nginx/ # 这里的web就是rsync同步的参数名字,path就是同步的目录

comment=mirror for web

 

3.5,添加认证文件

# 创建认证文件

[root@localhost ~]# vim /etc/rsync.pas

nginxpasspd #密码

 nginx:nginxpasswd #用户名:密码

【PS】:不这样设置两行就会用户验证失败。

 # 赋予权限

[root@localhost ~]# chmod 600 /etc/rsync.pas

 

3.6,创建目录并赋予权限

# 创建目录

mkdir -p /usr/local/nginx

mkdir -p /home/nginx/rsync

mkdir -p /usr/local/nginx/web

# 赋予权限

chown -R nginx.nginx  /usr/local/nginx /home/nginx/rsync/ /usr/local/nginx/web

 

3.7,启动rsync服务

[root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf

[root@localhost ~]# ps -eaf|grep rsync

root      1387     1  0 Jun28 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf

root      3201  3136  0 00:50 pts/0    00:00:00 grep rsync

[root@localhost ~]#

启动成功

 

3.8,测试rsync功能

一些调试报错经历:

[root@localhost ]#

rsync -vzrt --delete --progress --itemize-changes --exclude-from=/home/nginx/exclude_fastdfs.txt /data/fastdfs/data [email protected]::web --password-file=/etc/rsync.pas

password file must not be other-accessible

continuing without password file

Password:

@ERROR: auth failed on module web

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

[root@localhost ]#

说明:这是因为/etc/rsync.pas的权限不对,应该设置为600。如:chmod 600 /etc/rsync.pas

 

[root@localhost inotify-tools-3.14]#

rsync -vzrt --delete --progress --itemize-changes --exclude-from=/home/nginx/exclude_fastdfs.txt /data/fastdfs/data [email protected]::fastdfs --password-file=/home/nginx/rsync.pas

@ERROR: auth failed on module fastdfs

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

[root@localhost inotify-tools-3.14]# ll

去查看192.168.0.53的log信息

[root@localhost inotify-tools-3.14]# tail -f /home/nginx/rsync/rsyncd.log

2014/06/28 17:24:14 [19031] auth failed on module web from unknown (192.168.0.50): missing secret for user "nginx"

2014/06/28 17:28:21 [19198] name lookup failed for 192.168.0.50: Name or service not known

2014/06/28 17:28:21 [19198] connect from UNKNOWN (192.168.0.50)

2014/06/28 17:28:21 [19198] auth failed on module web from unknown (192.168.0.50): missing secret for user "nginx"

2014/06/28 17:28:48 [19488] name lookup failed for 192.168.0.50: Name or service not known

去192.168.0.53上面修改认证文件

[root@localhost data]# vim /etc/rsync.pas

nginxpasswd

nginx: nginxpasswd

将原来只有一行密码的改成如此2行,就好使了,能使用rsync功能了。

测试验证,在192.168.0.50的空目录下,建立测试文件 1.txt,2.txt

[root@localhost data]# cd /usr/local/nginx/web

[root@localhost web]# ll

总用量 0

[root@localhost web]# vim 1.txt

[root@localhost web]# vim 2.txt

[root@localhost web]# mkdir test

[root@localhost web]# vim ./test/3.txt

[root@localhost web]# ll /usr/local/nginx/web

总用量 12

-rw-r--r--. 1 nginx nginx    6 6月  28 19:18 1.txt

-rw-r--r--. 1 nginx nginx    6 6月  28 19:18 2.txt

drwxr-xr-x. 2 nginx nginx 4096 6月  28 19:22 test

[root@localhost web]#

 

在rsync同步之前,先去53上面check下目标目录,为空目录,如下所示:

[root@localhost web]# ll /usr/local/nginx/web

总用量 0

[root@localhost web]#

 

在192.168.0.50上执行rsync命令,同步目录

[root@localhost web]# /usr/bin/rsync -auzv --progress --delete /usr/local/nginx/web [email protected]::webroot   --password-file=/etc/rsync.pas

sending incremental file list

web/

web/1.txt

           6 100%    0.00kB/s    0:00:00 (xfer#1, to-check=3/5)

web/2.txt

           6 100%    5.86kB/s    0:00:00 (xfer#2, to-check=2/5)

web/test/

web/test/3.txt

           3 100%    2.93kB/s    0:00:00 (xfer#3, to-check=0/5)

sent 264 bytes  received 73 bytes  224.67 bytes/sec

total size is 15  speedup is 0.04

[root@localhost web]#

 

再去192.168.0.53上check下,看到文件已经同步过来,测试成功,如下所示:

[root@localhost web]# ll

总用量 12

-rw-r--r--. 1 nginx nginx    6 6月  28 19:18 1.txt

-rw-r--r--. 1 nginx nginx    6 6月  28 19:18 2.txt

drwxr-xr-x. 2 nginx nginx 4096 6月  28 19:22 test

[root@localhost web]#

 

4,使用Inotify结合rsync来进行随时随地自动发布web工程

编写一个inotify使用案例脚本inotify_web.sh:

4.1 inotify_web脚本

[root@localhost inotify-tools-3.14]# vim /usr/local/inotify-tools-3.14/inotify_web.sh

#!/bin/bash

src=/usr/local/nginx/web

des=web

#ip1=192.168.0.50,ip2是另外一台服务器ip地址

host="192.168.0.50 192.168.0.53"

# 使用inotifywait随时监控$src目录的一切变更,如果有,就自动调用后面的do…done里面的rsync代码块,将一切变更同步到两台web服务器上相同的目录里面。

/usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T%w%f' -e close_write,move,delete,create $src | while read files

do

  for hostip in $host

         do

                       echo "`date '+%F %T'` start to resync $src to $hostip"

                       /usr/bin/rsync -auzv --progress --delete $src nginx@$hostip::$des --password-file=/etc/rsync.pas

                   echo "$src has been resynced to $hostip `date '+%F %T'`"

         done

    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1

done

 

4.2,设置后台启动任务

[root@localhost inotify-tools-3.14]#

# 启动

nohup sh /usr/local/inotify-tools-3.14/inotify_web.sh >/tmp/inotify_rsync.log 2>&1 &

# 可以/tmp/inotify_rsync.log随时查看执行的日志信息

 

4.3,启动后,查看后台运行的进程:

[root@localhost inotify-tools-3.14]# ps -eaf|grep ino

root     17842 17594  0 20:15 pts/1    00:00:00 sh /usr/local/inotify-tools-3.14/inotify_web.sh

root     17843 17842  0 20:15 pts/1    00:00:00 /usr/local/inotify-tools-3.14/bin/inotifywait -mrq --timefmt %d/%m/%y/%H:%M --format %T%w%f -e close_write,move,delete,create /usr/local/nginx/web

root     17844 17842  0 20:15 pts/1    00:00:00 sh /usr/local/inotify-tools-3.14/inotify_web.sh

root     17872 17594  0 20:16 pts/1    00:00:00 tail -f /tmp/inotify_rsync.log

nginx    17882 17848  0 20:18 pts/0    00:00:00 grep ino

 

4.4,测试,check结果:

  清空192.168.0.50和192.168.0.53上面的/usr/local/nginx/web下面所有文件,然后在inotify监听服务器上的/usr/local/nginx/web创建wb.txt。

按照原理,一旦在inotify创建了文件,那么就会把/usr/local/nginx/web下面的所有文件同步到192.168.0.50和192.168.0.53的相应/usr/local/nginx/web目录下面。

(1),去查看inotify任务日志信息

[root@localhost web]# tail -f /tmp/inotify_rsync.log

nohup: 忽略输入

2014-06-28 20:16:20 start to resync /usr/local/nginx/web to 192.168.0.50

sending incremental file list

web/

web/dd.txt

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=4/6)

web/i3.txt/

web/t.txt/

 

sent 193 bytes  received 40 bytes  466.00 bytes/sec

total size is 6  speedup is 0.03

/usr/local/nginx/web has been resynced to 192.168.0.50 2014-06-28 20:16:20

2014-06-28 20:16:20 start to resync /usr/local/nginx/web to 192.168.0.53

sending incremental file list

web/

web/dd.txt

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=4/6)

web/wb.txt

           6 100%    0.00kB/s    0:00:00 (xfer#2, to-check=3/6)

web/i3.txt/

web/t.txt/

web/test/

 

sent 242 bytes  received 62 bytes  608.00 bytes/sec

total size is 6  speedup is 0.02

/usr/local/nginx/web has been resynced to 192.168.0.53 2014-06-28 20:16:20

 

(2),去另外一台192.168.0.53,查看下,文件已经同步过去。

[root@localhost web]# pwd

/usr/local/nginx/web

[root@localhost web]# ll

总用量 16

-rw-r--r--. 1 nginx nginx    0 6月  28 20:04 dd.txt

drwxrwxr-x. 2 nginx nginx 4096 6月  28 20:16 i3.txt

drwxr-xr-x. 2 nginx nginx 4096 6月  28 19:53 test

drwxr-xr-x. 2 nginx nginx 4096 6月  28 20:10 t.txt

-rw-r--r--. 1 nginx nginx    6 6月  28 19:51 wb.txt

 

至此,简单的通过inotify和rsync实现web工程自动同步功能已经完成,还有一点小细节留待后续解决。

 

参考文献:

http://zhumeng8337797.blog.163.com/blog/static/100768914201172952619883/

 


作者:mchdba 发表于2014-6-30 11:33:08 原文链接
阅读:0 评论:0 查看评论

相关 [利用 inotify rsync] 推荐:

inotify-rsync实时同步脚本

- lostsnow - 无网不剩
rsync是linux下一款非常强大的同步工具,采用差异同步的方法,只上传文件/文件夹的不同部分,同时可以对上传部分先进行压缩,所以rsync的传输效率是很高的. 但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源.

利用Inotify和Rsync将web工程文件自动同步到多台应用服务器

- - CSDN博客推荐文章
背景:需要搭建一套跟线上一模一样的环境,用来预发布,这是其中的web分发的一个小模块的实现过程. 1.1,Inotify工具. Inotify,它是一个内核用于通知用户空间程序文件系统变化的机制. 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug、udev 和 inotify 就是这种需求催生的.

lsyncd实时同步搭建指南——取代rsync+inotify

- - SegmentFault 最新的文章
使用这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,比如排除同步的目录,同步多个模块或同步到多个主机. 搭建过程参考 Linux下同步工具inotify+rsync使用详解 或 这里. 后来听同事说 sersync 这么个工具可以提高同步的性能,也解决了同步大文件时出现异常的问题,所以就尝试了一下.

rsync+inotify-tools实现数据实时同步方案_Ljohn的技术博客_51CTO博客

- -
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等. 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足.

翻译《The rsync algorithm》

- AWard - CSDN博客推荐文章
     最近在学习Rsync工具,在对Rsync算法大加赞赏之余,决定将《The rsync algorithm 》翻译,有不正之处 还请指正. 安德鲁Tridgell 保罗马克拉斯  部计算机科学 澳大利亚国立大学 堪培拉,ACT 0200,澳大利亚.        本报告介绍了将一台计算机上的文件内容同步到另一台机器上的文件的算法(同步后保证文件内容需要一致).

linux配置ssh+rsync

- - CSDN博客推荐文章
sftp    文件共享 类似ftp  ssh  secure file transfer client. scp    文件共享 类似cp. #PermitRootLogin yes    改成no 禁止root直接登录. #Port 22    改变ssh的默认端口号   要打开注释. 登录  ssh  [email protected]  然后输入密码就好了.

Rsync同步使用

- - 开源软件 - ITeye博客
rsync是类unix系统下的数据镜像备份工具——remote sync. /etc/rsyncd/rsyncd.conf 是你刚才编辑的rsyncd.conf的位置. 也可以在/etc/rc.d/rc.local里加入让系统自动启动等. rsync -参数 用户名@同步服务器的IP::rsyncd.conf中那个方括号里的内容 本地存放路径 如:.

rsync 的核心算法

- - 酷壳 - CoolShell.cn
rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输. rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜像是只对有变更的部分进行传送. rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝.

rsync服务安装和配置

- - CSDN博客推荐文章
作者: javaboy2012. 如果安装了,则需要做如下配置和修改. 修改 /etc/xinetd.d/rsync 下的内容. disable = yes 改为 disable = no. 新建:vi /etc/rsyncd.conf.  注意:客户端必须执行同步命令触发同步操作..  要实现定时同步,可以通过crontab -e加入定时任务来实现..

Linux下监测目录或文件的变化---inotify

- - CSDN博客研发管理推荐文章
  inotify是用来监视文件系统事件的机制,在linux 2.6.13内核中引入. 该机制可以用来监视文件和目录,当文件或目录发生变化时,内核会将文件或目录的变化发送给inotify文件描述符,在应用层只需调用read()就可以读取这些事件,非常的方便. 更好的是,inotify文件描述符还可以使用select、poll、epoll这些接口来监听,当有事件发生是,inotify文件描述符会可读.