分类: BSD
2006-10-16 12:30:19
from:
对于选择Linux、UNIX 系统作为应用平台的企业或网站来说,往往面临着如何实现将数据远程备份或者如何建立网站镜像的问题。虽然有商业化的备份和镜像产品可供选择,但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜像就成为一个值得讨论的话题。通过网络进行远程数据备份或者网站镜像的最简单的方法就是使用Wget。但是这种方式每次都需要将所有数据都重新在网络上传输一遍,而不考虑哪些文件是经过更新的,因此效率非常低下。尤其是在需要备份数据量很大的时候,往往需要花费数个小时来在网络上进行数据传输。因此,若能有一种高效的网络远程备份和镜像工具Rsync,就可以满足绝大多数要求不是特别严格的备份需求。
对系统管理员来说,平时的工作重心应该集中在维护系统正常运转,能够正常提供服务上,这里往往牵涉到一个数据备份的问题。在我们所了解的情况中,有80%的系统管理员不是太关心自己服务器的安全性,可是对备份镜像的技术相当感兴趣。但由于商业产品软硬件价格都相当高昂,因此往往会选择自由软件,例如前面提到的网络远程备份和镜像工具Rsync,它可以满足绝大多数要求不是特别高的备份需求。
Rsync是Linux、UNIX系统下的数据镜像备份工具,从软件的命名上就可以看出来了Remote Sync。它有如此特性:可以镜像保存整个目录树和文件系统;可以很容易做到保持原来文件的权限、时间、软硬链接等;无须特殊权限即可安装;优化的流程,文件传输效率高;可以使用RCP、SSH等方式来传输文件,当然也可以通过直接的Socket连接;支持匿名传输。
安装和配置Rsync实例
例如有2台服务器,服务器名分别为:WWW和BACKUP。
硬件环境: 2台HP服务器,1G CPU , 512M Ram , 18G SCSI硬盘;系统环境: Redhat Linux 6.2;服务环境: Rsync-2.4.6。其中,服务器名为WWW的Web服务内容存放在以下几个地方:/www/和/mirror/file0/和/mirror/file1/目录中。现在我们需要通过搭建Rsync同步服务在备份机BACKUP上建立对这几个目录内容的备份。
软件下载 Rysnc的主页地址为:,可以从这里下载Rysnc的安装软件(注意:下载源码编译最好)。
编译安装 Rysnc的编译安装非常简单,只需要以下简单的几步(在2台服务器中都要安装):
$ tar xvf rsync-2.4.6.tgz
$ cd rsync-2.4.6
$ ./configure
$ make
$ make install
但是,需要注意的是必须在服务器WWW和BACKUP上都安装Rsync,其中WWW服务器上是以服务器模式运行Rsync,而BACKUP上则以客户端方式运行Rsync。这样在Web服务器WWW上运行Rsync守护进程,在BACKUP上定时运行客户程序来备份Web服务器WWW上需要备份的内容。
配置Rsync服务器端
对于Rsync服务器来说,最重要和复杂的就是它的配置了。Rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在实例环境中,有3个目录树需要备份:/www/和/mirror/file0/和/mirror/file1/目录,那么就需要在配置文件中定义3个模块,分别对应3个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。(注:本例所指的Rsync服务器是名为WWW的服务器)。
例如,在上创建Rsyncd的配置文件/etc/rsyncd.conf,内容如下:
[root@ www /] cat /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[www]
path = /mirror/www/
comment = my rsync site
ignore errors
read only = true
list = false
auth users = backup
hosts allow = 12.23.34.57/32
secrets file = /etc/rsyncd.secrets
[file0]
path = /mirror/file0
comment = file0
ignore errors
read only = true
list = false
auth users = backup
hosts allow = 12.23.34.57/32
secrets file = /etc/rsyncd.secrets
[file1]
path =/mirror/file1
comment = file1
ignore errors
read only = true
list = false
auth users = backup
hosts allow = 12.23.34.57/32
secrets file = /etc/rsyncd.secrets
这里分别定义了[www]、[file0]、[file1]模块,分别对应于3个需要备份的目树。这里只允许12.23.34.57备份服务器WWW的数据,并且需要认证。3个模块授权的备份用户都为BACKUP,并且用户信息保存在文件/etc/backserver.pas中,其内容如下:
[root@www /etc]# cat /etc/backserver.pas
backup:bk_passwd
并且该文件只能是Root用户可读写的,否则Rsyncd启动时会出错。这些文件配置完毕以后,就需要在WWW服务器上启动Rsyncd服务器:
[root@www /etc]# grep rsync services
rsync 873/tcp # rsync
rsync 873/udp # rsync
[root@www /etc] grep rsync inetd.conf
rsync stream tcp nowait root /usr/local/bin/rsync rsyncd -daemon
[root@www /etc]# rsync -daemon
执行完毕上面的命令后,Rsync即可启动。Rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。
执行Rsync客户端命令 下一步就要运行Rsync客户端的启动命令了(本例所指的Rsync客户端是名为BACKUP的服务器):
[backup@backup /] /usr/local/bin/rsync -vzrtopg -delete
-exclude “logs/”--exclude “conf/ssl.*/”
--progress /backup/www/
--password-file=/etc/rsync.pass
上面这个命令行中--vzrtopg里的v是代表Verbose(详细);z是代表Zip(压缩);r是代表Recursive(递归);Topg都是保持文件原有属性,如属主、时间的参数;--progress是指显示出详细的进度情况;--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致;--exclude “logs/”是表示不对/www/logs目录下的文件进行备份。同样-exclude“conf/ssl.*/”是表示不对/www/conf/ssl.*/目录下的文件进行备份。
是表示该命令是对服务器12.23.34.56中的WWW模块进行备份,其中BACKUP表示使用BACKUP用户来对该模块进行备份。--password-file=/etc/rsync.pass来指定密码文件,这样就可以在脚本中使用而无须交互式地输入验证密码了。这里需要注意的是,这份密码文件权限属性要设得只有执行这个命令的当前用户可读,本例中是BACKUP用户。
这里将备份的内容存放在备份机的/backup/www/目录下。
[backup@backup /] /usr/local/bin/rsync -vzrtopg -delete -exclude “logs/”--exclude “conf/ssl.*/” --progress /backup/www/ --password-file=/etc/rsync.pass
receiving file list ... done
a.txt
wrote 100 bytes read 990409 bytes 220113.11 bytes/sec
total size is 2779708994 speedup is 2806.34
这样,Rsync同步服务就搭建好了,最后我们可以将在客户端执行的命令通过Crontab定时执行来实现自动备份,或者写一些脚本,这样Rsync同步服务的搭建就更加完美了。
一些示例脚本
1、每隔7天将数据往中心服务器做增量备份
#!/bin/sh
# This script does personal backups to a rsync backup server. You
# with a 7 day rotating backup. The incrementals will go
# into subdirectories named after the day of the week, and the c
# full backup goes into a directory called “current”
#
# directory to backup
BDIR=/home/$USER
# excludes file
EXCLUDES=$HOME/cron/excludes
# the name of the backup machine
BSERVER=owl
# your password on the backup server
export RSYNC_PASSWORD=XXXXXX
BACKUPDIR=‘date +%A’
OPTS=“--force --ignore-errors --delete-excluded
--exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a”
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ]‘ ’mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current
2、备份至一个空闲的硬盘
#!/bin/sh
export PATH=/usr/local/bin:/usr/bin:/bin
LIST=“rootfs usr data data2”
for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/
umount /backup/$d
done
DAY=‘date “+%A”’
rsync -a --delete /usr/local/apache /data2/backups/$DAY
rsync -a --delete /data/solid /data2/backups/$DAY
3、对vger.rutgers.edu的Cvs树进行镜像
#!/bin/bash
cd /var/www/cvs/vger/
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin
RUN=‘lps x | grep rsync | grep -v grep | wc -l’
if [“$RUN”-gt 0 ]; then
echo already running
exit 1
fi
rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog
$HOME/ChangeLog
sum1=‘sum $HOME/ChangeLog’
sum2=‘sum /var/www/cvs/vger/CVSROOT/ChangeLog’
if [ “$sum1”= “$sum2”]; then
echo nothing to do
exit 0
fi
rsync -az --delete
--force vger.rutgers.edu::cvs/ /var/www/cvs/vger/
exit 0
后记:win下也可以架设rsync服务器,download软件cwRsync_Server就可以了。然后以服务器运行模式进行运行,$rsync --daemon --address=192.168.0.104 --config=/rsync.conf --port=333这样就可以了。客户端指令和linux、bsd一样。