现在的位置: 首页 > 综合 > 正文

Rsync 同步镜像服务的搭建

2014年03月09日 ⁄ 综合 ⁄ 共 5860字 ⁄ 字号 评论关闭
出自:http://www.china-pub.com 张亚宁 2002年12月14日 22:00

  DNS(Domain Name Servive,域名服务)是Internet/Intranet中最基础也是非常重要的一项服务,提供了网络访问中域名到IP地址的自动转换。我们知道,Inetrnet上的主机成千上万,并且还在随时不断增加,不可能由一个或几个DNS服务器能够实现这样的解析过程,传统主机表(hosts)方式更无法胜任,事实上DNS依靠一个分布式数据库系统对网络中主机域名进行解析,并及时地将新主机的信息传播给网络中的其它相关部分,因而给网络维护及扩充带来了极大的方便。

  对于选择Linux、UNIX 系统作为应用平台的企业或网站来说,往往面临着如何实现将数据远程备份或者如何建立网站镜象的问题,虽然有商业化的备份和镜象产品可供选择,但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜象就成为一个值得讨论的话题。通过网络进行远程数据备份或者网站镜象的最简单的方法就是使用wget,但是这种方式每次都需要将所有数据都重新在网络上传输一遍,而不考虑哪些文件是经过更新的,因此效率非常低下。尤其在需要备份的数据量很大的时候,往往需要花费数个小时来在网络上进行数据传输。因此这里我们就介绍一种高效的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别严格的备份需求。

  对系统管理员来说,平时的工作重心应该集中在维护系统正常运转,能够正常提供服务上,这里往往牵涉到一个数据备份的问题,在我们所了解的情况中,有80%的系统管理员不是太关心自己服务器的安全性,但往往对备分镜像的技术相当感兴趣。但由于商业产品软硬件价格都相当高昂,因此往往会选择自由软件,例如刚才我们提到的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别高的备份需求。

rsync是Linux、UNIX系统下的数据镜像备份工具,从软件的命名上就可以看出来了-remote sync。它的特性如下:

(1)可以镜像保存整个目录树和文件系统。
(2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。
(3)无须特殊权限即可安装。
(4)优化的流程,文件传输效率高。
(5)可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
(6)支持匿名传输。


安装和配置rsync实例

下面给大家介绍一个rsync 安装和配置的实例:

例如这里有两台服务器,服务器名分别为:WWW和BACKUP。情况如下:

服务器名 域名 IP地址 应用
WWW www.blue.com.cn 12.23.34.56 Web服务器
BACKUP backup.blue.com.cn 12.23.34.57 备份机

硬件环境: 两台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的主页地址为:http://rsync.samba.org/,可以从这里下载rysn的安装软件(注意:下载源码编译最好)。

编译安装

rsync的编译安装非常简单,只需要以下简单的几步(在两台服务器中都要安装):

$ 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上运行rsyn守护进程,在BACKUP上定时运行客户程序来备份Web服务器WWW上需要备份的内容。


配置rsync服务器端

对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/和/mirror/file0/和/mirror/file1/目录,那么就需要在配置文件中定义三个模块,分别对应三个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。(注:本例所指的rsync服务器是名为WWW的服务器)


例如,在www.blue.com.cn上创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:

[root@ www /] cat /etc/rsyncd.confuid = nobody gid = nobody use chroot = nomax connections = 4pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log[www]path = /mirror/www/comment = my rsync siteignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets[file0]path = /mirror/file0comment = file0ignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets[file1]path =/mirror/file1comment = file1ignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets

这里分别定义了[www]、[file0]、[file1]三个模块,分别对应于三个需要备份的目树。这里只允许12.23.34.57备份服务器WWW的数据,并且需要认证。三个模块授权的备份用户都为backup,并且用户信息保存在文件/etc/backserver.pas中,其内容如下:

[root@www /etc]# cat /etc/backserver.pasbackup:bk_passwd

并且该文件只能是root用户可读写的,否则rsyncd启动时会出错。这些文件配置完毕以后,就需要在WWW服务器上启动rsyncd服务器:

[root@www /etc]# grep rsync services rsync 873/tcp # rsyncrsync 873/udp # rsync[root@www /etc] grep rsync inetd.confrsync 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@12.23.34.56::www /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.*/目录下的文件进行备份。
backup@12.23.34.56::www 是表示该命令是对服务器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@12.23.34.56::www /backup/www/ --password-file=/etc/rsync.passreceiving file list ... donea.txtwrote 100 bytes read 990409 bytes 220113.11 bytes/sectotal size is 2779708994 speedup is 2806.34

这样,rsync同步服务就搭建好了,最后我们可以将在客户端执行的命令通过crontab定时执行来实现自动备份,或者写一些脚本,这样rsync同步服务的搭建就更加完美了。

一些示例脚本:

这里这些脚本都是rsync网站上的一些脚本例子,供大家参考:

1、每隔七天将数据往中心服务器做增量备份

#!/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" # tridge@linuxcare.com # 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

抱歉!评论已关闭.