一、什么是rsync
二、rsync的功能特性
三、编译安装rsync软件
四、rsync的应用模式
五、rsync 借助ssh通道技术案例
六、企业案例一:搭建远程容灾备份系统
练习一推送文件方式同步并排除指定的目录和文件
练习二测试主机之间数据完全同步(无差异同步)
练习三rsync多目录多模块同步
配置防火墙允许rsync服务
附加一:rsync服务端部署流程回顾
附加二:rsync自我模拟排错思路及实战
附加三rsync生产排错整理我的FAQ
inotify介绍
企业应用案例:利用rsync+inotify搭建实时同步系统

---------------------------------------rsync+inotify学习---------------------------------------

rsync的优点和不足
   与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,
例如,定期备份文件服务器数据到远端服务器,对本地磁盘定期进行数据镜像等。
   随着应用系统的规模不断扩大,对数据的安全性和可靠性提出了更高的要求,rsync在高端业务系统中也逐渐暴露出来很多不足,首先,rsync同步数据时,
需要扫描所有文件后进行对比,然后进行差量传输,如果文件数据达到了百万甚至千万量级,扫描所有文件将是非常耗时的,而且发生变化往往是其中很少的一部分,
因此rsync是非常低效的方式,其次,rsync不能实时监测、同步数据。虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,可能导致服务端和客户端数据出现不一致,无法在出现应用故障时完成恢复数据。基于这个原因,rsync+inotify组合就出现了。
重点是inotify的使用方法:
初识inotify
   inotify是一种强大的、细粒度的、异步的文件系统事件监控机制、Linux内核从2.6.13版本其,
加入了对inotify的支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种细微事件,利用这个内核接口,第三方软件可以监控文件系统下
的文件的各种变化情况、inotify-tools就是这样的一个第三方软件。
在安装inotify-tools前请先确认你的Linux内核是否达到了2.6.13,并且在编译时开启CONFIG_INOTIFY选项,
1》查看当前系统是否支持inotify
[root@b-server lianglab]# uname -r
2.6.18-308.el5
[root@b-server src]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jan  4 02:32 max_queued_events
-rw-r--r-- 1 root root 0 Jan  4 02:32 max_user_instances
-rw-r--r-- 1 root root 0 Jan  4 02:32 max_user_watches
2》上传inotify源码包到服务器上,如果可以连接互联网,可以使用wget在网络上下载。
[root@b-server lianglab]# cd /usr/local/src/
[root@b-server src]# ls
inotify-tools-3.14.tar.gz
3》编译安装系统。
[root@b-server src]# ls
inotify-tools-3.14.tar.gz
[root@b-server src]# tar zxvf inotify-tools-3.14.tar.gz
-----------省略-------
inotify-tools-3.14/INSTALL
inotify-tools-3.14/ltmain.sh
inotify-tools-3.14/depcomp
[root@b-server src]#
[root@b-server src]# cd inotify-tools-3.14
[root@b-server inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14
-----------省略---------
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@b-server inotify-tools-3.14]# make
-----------省略---------
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make[2]: Leaving directory `/usr/local/src/inotify-tools-3.14'
make[1]: Leaving directory `/usr/local/src/inotify-tools-3.14'
[root@b-server inotify-tools-3.14]# 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 `/usr/local/src/inotify-tools-3.14'
make[1]: Leaving directory `/usr/local/src/inotify-tools-3.14'
[root@b-server inotify-tools-3.14]#
我们在做一个软连接
[root@b-server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify
[root@b-server inotify-tools-3.14]#
[root@b-server inotify-tools-3.14]# ll /usr/local/inotify-tools-3.14/bin/inotifywa*
-rwxr-xr-x 1 root root 47224 Jan  4 02:46 /usr/local/inotify-tools-3.14/bin/inotifywait
-rwxr-xr-x 1 root root 43586 Jan  4 02:46 /usr/local/inotify-tools-3.14/bin/inotifywatch
[root@b-server inotify-tools-3.14]#
安装完inotify-tools后,会生成inotifywait和inotifywatch两个指令,
其中,inotifywait用于等待文件或文件集上的一个特定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树,
inotifwatch用于收集被监控的文件系统统计数据,包括美国inotify事件发生多少次等信息。
[root@b-server inotify]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan  4 02:46 bin  #inotify执行命令(二进制)
drwxr-xr-x 3 root root 4096 Jan  4 02:46 include   #inotify程序所需用的头文件
drwxr-xr-x 2 root root 4096 Jan  4 02:46 lib       #动态链接的库文件
drwxr-xr-x 4 root root 4096 Jan  4 02:46 share     #帮助文档
[root@b-server inotify]#
inotifywait相关参数介绍:
-m "monitor"表示始终保持事件监听状态
-r "recursive"表示递归查询目录
-q "quiet"表示打印出监控事件
-e "event"通过此参数可以指定要监控的事件,常用的事件有,nodify、delete、create、attrib等等。
Events:
   access        file or directory contents were read      #文件或目录被读取
   modify        file or directory contents were written   #文件或目录内容被修改
   attrib        file or directory attributes changed        #文件或目录属性被改变
   close_write    file or directory closed, after being opened in
                  writeable mode
   close_nowrite    file or directory closed, after being opened in
                  read-only mode
   close        file or directory closed, regardless of read/write mode  #文件或目录封闭、无论读/写模式
   open        file or directory opened                  #文件或目录被打开
   moved_to    file or directory moved to watched directory  #文件或目录被移动至另外一个目录
   moved_from    file or directory moved from watched directory
   move        file or directory moved to or from watched directory  #文件或目录被移动另一个目录或从另一个目录移动到当前目录。
   create        file or directory created within watched directory   #文件或目录被创建在当前目录。
   delete        file or directory deleted within watched directory   #文件或目录被删除
   delete_self    file or directory was deleted
   unmount        file system containing file or directory unmounted   #文件系统被卸载。
[root@b-server bin]#
创建事件监控脚本-------重点。
#vi realtime_rsync.sh
#!/bin/bash
#created by lianglab 21:55   2013-6-13
#QQ 865362365
# http://hi.baidu.com/zll56281688
## inotify_rsync.sh ##
#para
host=192.168.1.100
src=/lianglab
dst=lianglab
user=backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify/
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
 echo "Check File and Folder"
 exit 0
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e  modify,close_write,delete,create,attrib $src \
| while read file
   do
#rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src$user$host::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
   done
exit 0
---------------------------------------------------------------------
推送失败
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
[root@b-server lianglab]#
推送成功
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
我们测试一下,创建23个文件
[root@b-server lianglab]# for f in `seq 23`;do touch $f;done
[root@b-server lianglab]# ls
1   11  13  15  17  19  20  22  3  5  7  9  b  d           liang2.txt  null
10  12  14  16  18  2   21  23  4  6  8  a  c  liang1.txt  liang.txt
[root@b-server lianglab]#
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
我们在到服务器端查看一下,
[root@rsync lianglab]# ls
1  10  11  12  13  14  15  16  17  18  19  2  20  21  22  23  3  4  5  6  7  8  9  a  b  c  d  liang1.txt  liang2.txt  liang.txt  null
[root@rsync lianglab]#
[root@rsync lianglab]# ls | wc -l
31
[root@rsync lianglab]#
[root@b-server lianglab]# rm -rf *
[root@b-server lianglab]#
我们创建99个目录
[root@b-server lianglab]# for f in `seq 99`;do mkdir -p $f;done
[root@b-server lianglab]#
[root@rsync lianglab]# ls
1   12  15  18  20  23  26  29  31  34  37  4   42  45  48  50  53  56  59  61  64  67  7   72  75  78  80  83  86  89  91  94  97
10  13  16  19  21  24  27  3   32  35  38  40  43  46  49  51  54  57  6   62  65  68  70  73  76  79  81  84  87  9   92  95  98
11  14  17  2   22  25  28  30  33  36  39  41  44  47  5   52  55  58  60  63  66  69  71  74  77  8   82  85  88  90  93  96  99
[root@rsync lianglab]# ls | wc -l
99
[root@rsync lianglab]#
------------------------企业应用案例:利用rsync+inotify搭建实时同步系统。-------------------------------------
spacer.gif
案例描述:
   国内著名上市公司lianglab,由于业务不断增长,搭建了一个CMS内容发布系统、后端采用负载均衡集群部署方案,由一个负载调度节点、
3个服务节点及一个内容发布节点构成,内容发布节点负责将用户发布的数据生成静态页面,同时将静态网页传输给3个服务节点,而负载调度节点负责将
用户请求根据负载算法调度到相应的服务节点上,实现用户访问,用户要求在前端访问到的网页数据始终是最新的、一致的。
解决方案:
   为了保证用户访问到的数据一致性和实时性,必须保证3个服务节点上的数据和内容发布节点上的数据始终是一致的,这就需要通过文件同步工具来实现,
这里采用rsync,同时又要保证数据的实时性,这就需要inotify,及利用inotify监视内容发布节点文件的变化,如果文件有变动,那么就启动rsync,
将文件实时同步到2个节点上。
系统环境
   节点名称                内核版本              用途                IP地址                网页数据路径
 a-server(rsync)       2.6.18-308.el5    代码更新         192.168.1.100       /data/httpd/wwwroot
 b-server(web1)       2.6.18-308.el5   服务节点1      192.168.1.110     /data/httpd/wwwroot
 c-server(web2)       2.6.18-308.el5   服务节点2      192.168.1.120    /data/httpd/wwwroot
1、安装rsync与inotify-tools
   inotify-tools是用来监控文件系统变化的工具,因此必须安装在内容发布节点上,服务节点上无需安装inotify-tools,另外需要在b-server、c-server和server节点上安装rsync,安装非常简单,前面都说过了,就不多做介绍了。
   这个案例中,内容发布节点(即Server) 充当rsync客户端的角色,而2个服务节点充当了rsync服务器端的角色,整个数据同步的过程其实就是一个从客户端向服务端发送数据的过程。
================================
web节点服务器配置
第一步:我们在web节点上配置rsync服务
#mkdir -p /data/httpd/wwwroot
第二步:创建rsync配置文件
vi /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[www]
path = /data/httpd/wwwroot/
comment = update
ignore errors
read only = no
write only = no
hosts allow = 192.168.1.0/255.255.255.0
list = false
uid = root
gid = root
auth users = root
secrets file = /etc/web.password
第三步:创建rsync认证文件
#vi /etc/web.password
123456
root:123456
第四步:设置权限,开启服务,并添加到开机自启动
#chmod 600 /etc/web.password
#rsync --daemon
#echo "rsync --daemon" >>/etc/rc.local
配置服务端(rsync+inotify)
第一步:创建存放代码目录
#mkdir -p /data/httpd/wwwroot
第二步:安装inotify
#cd /usr/local/src
#tar zxvf inotify-tools-3.14.tar.gz
#cd inotify-tools-3.14
#./configure
#make
#make install
第三步:编写同步更新脚本文件
vi inotify_rsync88.sh
#!/bin/bash
src=/data/httpd/wwwroot/
des=www
host="192.168.1.110 192.168.1.120"
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
for hostip in $host
do
rsync -vzrtopg --delete --progress --password-file=/etc/web.password $src root@$hostip::$des
done
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
第四步:创建rsync认证文件
#vi /etc/web.password
123456
root:123456
#chmod u+x /etc/web.password
第五步:启动并添加到开启自启动中。
#nohup /bin/bash /home/inotify_rsync88.sh &
#echo "nohup /bin/bash /home/inotify_rsync88.sh &" >>/etc/rc.local
第六步:测试
我们到192.168.1.100上进入目录/data/httpd/wwwroot/
#touch liang.txt
在到两台web机器上看/data/httpd/wwwroot/目录是否有liang.txt文件了。
附录一、rsync命令常用参数
常用参数说明:
-v --verbose 详细模式输出,传输时的进度等信息。
-z --compress 对备份的文件在传输时进行压缩处理。
-r --recusive 对子目录以递归模式处理
-t --time 保持稳健时间信息
-o --owner 保持稳健属主信息
-p --perms 保持文件权限
-g --group 保持文件属组信息
--progress 显示备份过程
-a --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopsD1
-e --rsh=COMMAND 使用的信道协议,指定替代rsh的shell程序,例如:ssh
--exclude=PATTERN 指定排除不需要传输的文件模式
-D --devices 保持设备文件信息
-l ----links 保留软连接
-u --update

============================================================================

参考文献:老男孩51CTO视频教程  

         南非蚂蚁《高性能Linux服务器构建实战》一书