背景:需要搭建一套跟线上一模一样的环境,用来预发布,这是其中的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 nginx@192.168.0.53::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 nginx@192.168.0.53::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 nginx@192.168.0.53::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/
相关推荐
本文将详细介绍如何通过结合`Rsync`与`Inotify`这两种强大工具,在两台Linux服务器之间实现实时目录同步。 #### 二、Rsync简介 `Rsync`是一种用于文件传输的高效工具,它支持增量备份,即只传输两个文件差异的部分...
### rsync+inotify 实现服务器之间目录文件实时同步 #### 软件简介与应用场景 **rsync** 是一种高效且广泛使用的文件同步工具,主要用于远程数据备份、镜像和迁移场景。相较于传统的 `cp` 和 `tar` 备份方式,...
同步方案:采用inotify监听文件变化,触发rsync实时同步,并且用supervisor监控inotify进程,莫明死掉后会立即重新启动。 需求:adminweb上的/data/www/user下的代码要同步到web1\2\3上 172.40.0.203:web1 172.40.0...
- **定义**:`sersync`是一种基于`inotify`和`rsync`的自动化文件同步工具,可以实现实时监控文件系统的变更,并将更改同步到多台服务器。 - **优点**: - 实现了真正的实时同步,提高了数据一致性; - 支持多线程...
为了使`rsync`能够与`inotify`协同工作,需要在各Web应用服务器上配置`rsync`服务。通过编辑`/etc/rsyncd.conf`配置文件,指定服务运行参数、访问权限、日志记录路径以及同步目录等,确保`rsync`服务的稳定运行和...
这些技术在企业环境中经常结合使用,例如,NFS用于Linux系统间的高速文件共享,Samba让Linux和Windows环境能共同访问资源,rsync用于定期备份和同步数据,inotify可以实时监控文件系统变化并自动执行脚本,而WebDAV...
使用多个web服务器实现负载均衡,为了保持前端web服务器上资源的一致性可以通过rsync在主服务器上(可写入数据)将更新过的文件同步到其他从服务器(只读服务器),但是不能自动的进行实时同步,使用inotify可以实现实时...
这样的组合在备份、镜像创建、内容分发等场景中非常实用,特别是在需要实时更新的环境中,如Web服务器的静态文件同步、开发环境的代码同步等。 总的来说,`inotify-tools`和`rsync`的结合使用是Linux环境下实现高效...
rsync 是一个文件同步工具,用于将文件从一个位置同步到另一个位置。sersync 使用 rsync 命令来实现文件同步。 同步解决方案对比 sersync 相比于其他同步解决方案,如 inotify-tools+rsync 和 Openduckbill,具有...
本文将详细介绍如何利用`rsync`和`inotify`工具来实现两台Linux服务器之间的文件实时同步。 #### 二、测试环境 本实验使用的测试环境包括两台Linux服务器: - **主服务器**:IP地址为192.168.1.7 - **备份服务器*...
- Rsync+inotify:利用inotify监控文件系统变化,实时触发rsync进行同步,适合需要实时数据一致性的场景。 - Rsync+sersync:通过sersync工具结合rsync实现更为高效的同步机制,同时支持更多的同步选项。 3. NFS...
Contagious使用inotify检查文件系统更改,然后挂接到rsync以异步将这些更改推送到指定的服务器。 与Java,Bash和Python方法相比,Javascript为此提供了多个优势。 由于其事件驱动机制,因此无需运行多个线程。 这...
3. **多线程支持**:`sersync`内置了多线程同步机制,在处理大型文件时能更好地利用系统资源,确保文件实时同步。 4. **错误处理机制**:当遇到同步失败的情况时,`sersync`会自动将其放入失败队列,并按照预设时间...
本文档是一份关于Linux运维技术的详细笔记,包含了Linux系统安装后的基本优化、系统服务配置、服务器管理工具应用、网络文件系统(NFS)的部署与应用、以及Apache和Nginx这两个流行的Web服务器的详细配置和应用案例...
- **Sersync部署**: Sersync是一种用于服务器之间实时同步文件的工具,它可以基于inotify来监测文件的变化并自动同步到目标服务器上。 #### 五、负载均衡中的Session解决 - **负载均衡中Session的问题**: 在负载...
Sersync是一种基于inotify和rsync的文件同步工具,它可以实现实时的数据同步,同时支持更高级的功能,比如压缩、加密等。 #### 五、负载均衡中的Session解决 **5.1 负载均衡中Session的问题** 在负载均衡环境中,...