1.Rsync [http://rsync.samba.org/] 介绍、下载与安装
1.1介绍:
Rsync(remotesync)是类unix系统下的数据镜像备份工具。
它的特性如下:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的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 A上rsync的配置文件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 A上rsync.sh
#!/bin/sh
[ -f /etc/profile ] && . /etc/profile
PROG=/usr/bin/rsync
LOGFILE=/u1/script/rsync/logs/rsync.log
SERVER1="[email protected]"
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="[email protected]"
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: 用于排除不需要传输的文件类型.
“[email protected]::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
[[email protected]]# 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.3在3个服务器上配置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 �Cprogress $src $user1@$host1::$dst1 --password-file=/etc/server.pass
/usr/local/bin/rsync -vzrtopg--delete �Cprogress $src $user2@$host2::$dst2
--password-file=/etc/server.pass
/usr/local/bin/rsync -vzrtopg--delete �Cprogress $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="[email protected]"
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
本文出自 “zhangdh开放空间” 博客,谢绝转载!