1.Rsync [http://rsync.samba.org/] 介绍、下载与安装

1.1介绍:

Rsyncremotesync)是类unix系统下的数据镜像备份工具。

它的特性如下:

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

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

无须特殊权限即可安装。

快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。

rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

安全:可以使用scpssh等方式来传输文件,当然也可以通过直接的socket连接。

支持匿名传输:以方便进行网站镜象。

1.2下载与安装

#考虑到centos6.2 yum源上的版本低,这里使用源码安装

[root@test3 local]# wget http://rsync.samba.org/ftp/rsync/rsync-3.0.9.tar.gz

[root@test3 local]# tar zxvf rsync-3.0.9.tar.gz

[root@test3 rsync-3.0.9]# ./configure

[root@test3 rsync-3.0.9]# make;make install


2.Rsync简单应用

2.1本地shell模式: 主要用于复制指定目录/文件到另一个目录

1)复制指定文件到另一个目录下

       [root@test3 local]# rsync -avmysql-5.5.30.tar.gz /u1/tool/

2)复制指定目录到另一个指定目录

   [root@test3local]# rsync -av mysql-5.5.30/ /u1/tool/mysql


2.2远程shell模式: 主要是用于将本地目录/文件复制到另一台机器上

1)复制一个文件到另一台机器

   [root@test3 tool]# rsync -avzemysql-5.5.30.tar.gz 192.168.101.101:/u1

      2)复制一个目录到另一台机器上

          [root@test3tool]# rsync -av rsync-3.0.9 192.168.101.101:/u1

2.3rsync列表模式: root用户身份查看远程主机指定目录下的内容

1)查看远程主机指定目录下的文件列表

   [root@test3 tool]# rsync -a 192.168.101.101:/u1

      2)查看本机指定目录下的文件列表

          [root@test3tool]# rsync -a /u1/tool/rsync-3.0.9


3.企业案例

3.1案例描述

某一电子商务网站,前端由ngnix代理,后端运行tomcat,php使用keeperalive做了一个高可用;为了保证每次版本更新时同步两台不同机器的重复工作,于是采用rsync来进行同步互备.


3.2系统配置参数

OS: centos 6.2

A: 192.168.1.160

B: 192.168.1.10

3.3 Arsync的配置文件rsyncd.conf

uid = nobody

gid = nobody

read only = yes

hosts allow = 192.168.1.0/24

max connections = 10

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

syslog facility = local5

secrets file = /etc/rsyncd.secrets


[wwwserver]

path=/u1/www_root/

comment = Www Web Server PUBLISH    

auth users=gyrsyncuser


[dlserver]

path=/u1/dl_server/

comment = dl Server PUBLISH    

auth users=gyrsyncuser


[piaoserver]

path=/u1/www_piao/

comment = Www Piao Server PUBLISH

auth users=gyrsyncuser


[adminserver]

path=/u1/admin_platform/

comment =Admin Server  

auth users=gyrsyncuser


[wapserver]

path=/u1/wap_root/

comment = Wap Server  

auth users=gyrsyncuser


[taoserver]

path=/u1/www_ying

comment = WWW ying Server  

auth users=gyrsyncuser


[javaserver]

path=/u1/pr

comment =Java Server

authusers=gyrsyncuser

3.4  A上密码文件rsyncd.secrets

  gyrsyncuser:syncpwd


3.5  Arsync.sh

#!/bin/sh

[ -f /etc/profile ] && . /etc/profile

PROG=/usr/bin/rsync

LOGFILE=/u1/script/rsync/logs/rsync.log

SERVER1="gyrsyncuser@192.168.1.10"

OPTS=" --force --ignore-errors -avzP --delete"

export RSYNC_PASSWORD=syncpwd

DSTDIR=/u1/www_root/

RSYNC_SERVER=wwwserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/dl_server/

RSYNC_SERVER=dlserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list" $SERVER1::$RSYNC_SERVER$DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/www_piao/

RSYNC_SERVER=piaoserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/admin_platform/

RSYNC_SERVER=adminserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/wap_root/

RSYNC_SERVER=wapserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/www_ying

RSYNC_SERVER=taoserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/pr

RSYNC_SERVER=javaserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`" >>$LOGFILE2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE2>&1


     3.6 A上配置上文提到的wwwexclude.list

*application/cache/*


     3.7  B上配置的rsyncd.conf

      uid = nobody

gid = nobody

read only = yes

hosts allow = 192.168.1.0/24

max connections = 10

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

syslog facility = local5

secrets file = /etc/rsyncd.secrets


[wwwserver]

path=/u1/www_root/

comment = Www Web Server PUBLISH    

auth users=gyrsyncuser


[piaoserver]

path=/u1/www_piao/

comment = Www Piao Server PUBLISH

auth users=gyrsyncuser


[adminserver]

path=/u1/admin_platform/

comment =Admin Server    

auth users=gyrsyncuser


[wapserver]

path=/u1/wap_root/

comment = Wap Server  

auth users=gyrsyncuser


[taoserver]

path=/u1/www_ying

comment = WWW ying  Server  

auth users=gyrsyncuser


[javaserver]

path=/u1/pr

comment =Java Server  

auth users=gyrsyncuser


   3.8  B上配置rsyncd.secrets

gyrsyncuser:syncpwd


       3.9  B上配置rsync.sh

       #!/bin/sh

[ -f /etc/profile ] && . /etc/profile

PROG=/usr/bin/rsync

LOGFILE=/u1/script/rsync/logs/rsync.log

SERVER1="gyrsyncuser@192.168.0.160"

OPTS=" --force --ignore-errors -avzP--delete"

export RSYNC_PASSWORD=syncpwd

DSTDIR=/u1/www_root/

RSYNC_SERVER=wwwserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/dl_server/

RSYNC_SERVER=dlserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS --exclude-from="/u1/script/rsync/wwwexclude.list"

$SERVER1::$RSYNC_SERVER $DSTDIR>>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/www_piao/

RSYNC_SERVER=piaoserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo "########################################">>$LOGFILE 2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/admin_platform/

RSYNC_SERVER=adminserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS --exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/wap_root/

RSYNC_SERVER=wapserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time: `date`">>$LOGFILE2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/www_ying

RSYNC_SERVER=taoserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1

DSTDIR=/u1/pr

RSYNC_SERVER=javaserver

echo "################# $DSTDIR#######################" >>$LOGFILE 2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

time $PROG $OPTS--exclude-from="/u1/script/rsync/wwwexclude.list"$SERVER1::$RSYNC_SERVER $DSTDIR >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1

echo "" >>$LOGFILE 2>&1


      3.10 B上配置上面提到的wwwexclude.list

       *application/cache/*


#上面配置文件的参数说明

uid: 指定当该模块传输文件时守护进程应该具有的用户ID,默认是”nobody”.

gid: 指定当该模块传输文件时守护进程应该具有的用户组ID,默认是”nobody”.

max connections: 指定模块的最大并发连接数量,以保护服务器.超过限制的链接请求将被暂时限制.默认值是0 ,即没有限制.

strict modes: 指定是否检查口令文件的权限,yes为检查口令文件权限,反之为no;如果是yes,密码文件的权限必须为root用户权限.

pid file: 指定rsync守护进程对应的pid文件路径.

lock file: 指定支持max connections的锁文件,默认是/var/run/rsyncd.lock.

log file: 指定了rsync的日志输出文件路径.

[www]: 表示定义一个模块的开始,www就是对应的模块名称.

path: 指定需要备份的文件或目录,是必须设置的项.

ignore errors: 表示可以忽略一些无关的I/O错误.

read only: 设置为no表示客户端可以上传文件,yes为表示只读.

write only: 设置为no表示客户端可以下载文件,yes为不能下载.

hosts allow: 设置可以连接rsync服务器的主机,”*”表示允许连接任何主机.

hosts deny: 设置禁止连接rsync服务器的主机地址.

list: 此选项用于设定当客户端请求可以使用的模块列表时,该模块是否被列出.默认值是true,如果要建立隐藏的模块,可以设置为false.

auth users: 此选项用来定义可以连接该模块的用户名,多个用户以空格或者逗号隔开.需要注意的是,这里的用户非linux系统用户.

secrets file: 此选项用于指定一个包含用户名:密码格式的文件,用户名就是”auth users”选项定义的用户,密码可以随便指定,只要和客户端的secrets file对应起来即可.只有在auth users被定义时,该文件才起作用.系统默认没有这个文件,需要手动创建该文件.

-vzrtopg: v表示”--verbose”,即详细模式输出;   z表示”--compress”,即在传输时对备份文件进行压缩处理;  r表示”--recursive”,即对子目录以递归模式处理;  t表示”--times”,用来保持文件时间信息;  o表示”--owner”,用来保持文件属主信息;  p表示”--perms”,用来保持文件权限;  g表示”--group”,用来保持文件的属组信息;

--delete: 表示指定以rsync服务器端为基准进行数据镜像同步,也就是要保持rsync服务器端目录与客户端目录的完全一致.

--progress: 用于显示数据镜像的同步过程.

--exclude: 用于排除不需要传输的文件类型.

“backup@192.168.101.103::www”: 表示对服务器192.168.101.103中的www模块进行备份,也就是指定备份的模块.backup表示使用”backup”这个用户对该模块进行备份.

“/u1/www”: 用于指定备份文件在客户端机器上的存放路径.

“--passwd-file=/etc/server.pass”: 用于指定客户机上存放密码文件的位置,这样在客户端上执行同步命令是就无需输入交互密码.


4. Rsync&inotify的整合: 实现服务器和客户端数据的实时同步

4.1判断内核是否支持inotify(即内核版本在2.6.13以上)

[root@test1 rsync-3.0.9]# uname -r

   2.6.32-279.el6.x86_64

   [root@test1rsync-3.0.9]# ll /proc/sys/fs/inotify/

总用量 0

-rw-r--r-- 1 root root 0 5  25 02:54max_queued_events

-rw-r--r-- 1 root root 0 5  25 02:54max_user_instances

-rw-r--r-- 1 root root 0 5  25 02:54max_user_watches

: 如果有上面3行输出,就表示系统默认支持inotify!

http://sourceforge.net/projects/inotify-tools/下载inotify-tools


4.2开始安装inotify-tools

[root@test1 u1]# tar zxvf inotify-tools-3.13.tar.gz

[root@test1 u1]# cd inotify-tools-3.13

[root@test1 inotify-tools-3.13]# ./configure

[root@test1 inotify-tools-3.13]# make;make install

[root@test1 inotify-tools-3.13]# ll /usr/local/bin/inotifywa*

-rwxr-xr-x. 1 root root 38622 5  2504:26 /usr/local/bin/inotifywait

-rwxr-xr-x. 1 root root 40393 5  25 04:26/usr/local/bin/inotifywatch


4.33个服务器上配置rsync

Web1节点的rsyncd.conf配置文件

uid = nobody

gid = nobody

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


[web1]

path = /web1/wwwroot/

comment = web1 file

ignore errors

read only = no

write only = no

hosts allow = 192.168.101.146

hosts deny = *

list = false

uid = root

gid = root

auth users = web1user

secrets file = /etc/web1.pass


Web2节点的rsyncd.conf配置文件

uid = nobody

gid = nobody

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


[web2]

path = /web2/wwwroot/

comment = web2 file

ignore errors

read only = no

write only = no

hosts allow = 192.168.101.146

hosts deny = *

list = false

uid = root

gid = root

auth users = web2user

secrets file = /etc/web2.pass

Web3节点的rsyncd.conf配置文件

uid = nobody

gid = nobody

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


[web3]

path = /web3/wwwroot/

comment = web3 file

ignore errors

read only = no

write only = no

hosts allow = 192.168.101.146

hosts deny = *

list = false

uid = root

gid = root

auth users = web3user

secrets file = /etc/web3.pass


4.4 配置内容发布节点

配置内容发布节点的主要工作是将生成的静态网页实时同步到集群中3个服务节点上,可用下面的shell脚本实现:

#!/bin/bash

host1=192.168.101.101

host2=192.168.101.102

host3=192.168.101.103


src=/web/wwwroot/

dst1=web1

dst2=web2

dst3=web3

user1=web1user

usre2=web2user

user3=web3user


/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

/usr/local/bin/rsync -vzrtopg--delete –progress $src $user1@$host1::$dst1 --password-file=/etc/server.pass

/usr/local/bin/rsync -vzrtopg--delete –progress $src $user2@$host2::$dst2

--password-file=/etc/server.pass

/usr/local/bin/rsync -vzrtopg--delete –progress $src $user3@$host3::$dst3

--password-file=/etc/server.pass

Echo “${files} was rsynced ” >>/tmp/rsync.log 2>&1


     参数说明:

     --timefmt: 指定时间的输出格式.

     --format: 指定变化文件的详细信息.

     注:特别提示的是为了节约系统资源可将脚本中红色部分修改为:”

      -e close_write,delete,create,attrib”,也就是等待文件写完后再出发rsync同步.

   [root@test1 ~]# chmod 755/web/wwwroot/inotifyrsync.sh

   [root@test1~]# /web/wwwroot/inotifyrsync.sh &

   [root@test1~]# echo “/web/wwwroot/inotifyrsync.sh &” >> /etc/rc.local


5. 其他应用参考例子

[root@linuxblind script]# cat /etc/rsyncd.conf

uid = nobody

gid = nobody

read only = yes

#hosts allow = 192.168.1.0/24

#hosts deny = 192.168.100.0/24

max connections = 10

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

syslog facility = local5

secrets file = /etc/rsyncd.secrets


[imgserver]

path=/u2/img_server

comment = Gy Img Server PUBLISH    

authusers=imgserver

[root@linuxblind ~]# cat /u2/script/rsync.sh

#!/bin/sh

[ -f /etc/profile ] && ./etc/profile

PROG=/usr/bin/rsync

IMGSERVER=/u2/img_server

RSYNC_IMGSERVER=imgserver

LOGFILE=/u2/script/logs/rsync.log

SERVER1="imgserver@192.168.1.100"

OPTS=" --force --ignore-errors -avzP--delete"

echo ""

echo"########################################" >>$LOGFILE2>&1

echo "Begin Time: `date`">>$LOGFILE 2>&1

export RSYNC_PASSWORD=imgserver

time $PROG $OPTS $SERVER1::$RSYNC_IMGSERVER$IMGSERVER >>$LOGFILE 2>&1

echo "End Time:`date`">>$LOGFILE 2>&1

echo"########################################" >>$LOGFILE2>&1