對于選擇Linux、UNIX
系統(tǒng)作為應(yīng)用平臺的企業(yè)或網(wǎng)站來說,往往面臨著如何實現(xiàn)將數(shù)據(jù)遠(yuǎn)程備份或者如何建立網(wǎng)站鏡像的問題。雖然有商業(yè)化的備份和鏡像產(chǎn)品可供選擇,但這些產(chǎn)品的
價格往往過于昂貴。因此如何利用自由軟件高效實現(xiàn)遠(yuǎn)程備份和網(wǎng)站鏡像就成為一個值得討論的話題。通過網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程數(shù)據(jù)備份或者網(wǎng)站鏡像的最簡單的方法就是
使用Wget。但是這種方式每次都需要將所有數(shù)據(jù)都重新在網(wǎng)絡(luò)上傳輸一遍,而不考慮哪些文件是經(jīng)過更新的,因此效率非常低下。尤其是在需要備份數(shù)據(jù)量很大
的時候,往往需要花費(fèi)數(shù)個小時來在網(wǎng)絡(luò)上進(jìn)行數(shù)據(jù)傳輸。因此,若能有一種高效的網(wǎng)絡(luò)遠(yuǎn)程備份和鏡像工具Rsync,就可以滿足絕大多數(shù)要求不是特別嚴(yán)格的
備份需求。
對系統(tǒng)管理員來說,平時的工作重心應(yīng)該集中在維護(hù)系統(tǒng)正常運(yùn)轉(zhuǎn),能夠正常提供服務(wù)上,這里往往牽涉到一個數(shù)據(jù)備份的問題。在我們所了解的情況中,有80%
的系統(tǒng)管理員不是太關(guān)心自己服務(wù)器的安全性,可是對備份鏡像的技術(shù)相當(dāng)感興趣。但由于商業(yè)產(chǎn)品軟硬件價格都相當(dāng)高昂,因此往往會選擇自由軟件,例如前面提
到的網(wǎng)絡(luò)遠(yuǎn)程備份和鏡像工具Rsync,它可以滿足絕大多數(shù)要求不是特別高的備份需求。
Rsync是Linux、UNIX系統(tǒng)下的數(shù)據(jù)鏡像備份工具,從軟件的命名上就可以看出來了Remote
Sync。它有如此特性:可以鏡像保存整個目錄樹和文件系統(tǒng);可以很容易做到保持原來文件的權(quán)限、時間、軟硬鏈接等;無須特殊權(quán)限即可安裝;優(yōu)化的流程,文件傳輸效率高;可以使用RCP、SSH等方式來傳輸文件,當(dāng)然也可以通過直接的Socket連接;支持匿名傳輸。
安裝和配置Rsync實例
例如有2臺服務(wù)器,服務(wù)器名分別為:WWW和BACKUP。
硬件環(huán)境: 2臺HP服務(wù)器,1G CPU , 512M Ram , 18G
SCSI硬盤;系統(tǒng)環(huán)境: Redhat Linux 6.2;服務(wù)環(huán)境:
Rsync-2.4.6。其中,服務(wù)器名為WWW的Web服務(wù)內(nèi)容存放在以下幾個地方:/www/和/mirror/file0/和/mirror/file1/目錄中。現(xiàn)在我們需要通過搭建Rsync同步服務(wù)在備份機(jī)BACKUP上建立對這幾個目錄內(nèi)容的備份。
軟件下載 Rysnc的主頁地址為:http://rsync./,可以從這里下載Rysnc的安裝軟件(注意:下載源碼編譯最好)。
編譯安裝
Rysnc的編譯安裝非常簡單,只需要以下簡單的幾步(在2臺服務(wù)器中都要安裝):
$ tar xvf rsync-2.4.6.tgz
$ cd rsync-2.4.6
$ ./configure
$ make
$ make install
但是,需要注意的是必須在服務(wù)器WWW和BACKUP上都安裝Rsync,其中WWW服務(wù)器上是以服務(wù)器模式運(yùn)行Rsync,而BACKUP上則以客戶端
方式運(yùn)行Rsync。這樣在Web服務(wù)器WWW上運(yùn)行Rsync守護(hù)進(jìn)程,在BACKUP上定時運(yùn)行客戶程序來備份Web服務(wù)器WWW上需要備份的內(nèi)容。
配置Rsync服務(wù)器端
對于Rsync服務(wù)器來說,最重要和復(fù)雜的就是它的配置了。Rsync服務(wù)器的配置文件為/etc/rsyncd.conf,其控制認(rèn)證、訪問、日志記錄
等。該文件是由一個或多個模塊結(jié)構(gòu)組成。一個模塊定義以方括弧中的模塊名開始,直到下一個模塊定義開始或者文件結(jié)束,模塊中包含格式為name
=
value的參數(shù)定義。每個模塊其實就對應(yīng)需要備份的一個目錄樹,比方說在實例環(huán)境中,有3個目錄樹需要備份:/www/和/mirror/file0/
和/mirror/file1/目錄,那么就需要在配置文件中定義3個模塊,分別對應(yīng)3個目錄樹。配置文件是行為單位的,也就是每個新行都表示一個新的注
釋、模塊定義或者參數(shù)賦值。(注:本例所指的Rsync服務(wù)器是名為WWW的服務(wù)器)。
例如,在www.上創(chuàng)建Rsyncd的配置文件/etc/rsyncd.conf,內(nèi)容如下:
[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]模塊,分別對應(yīng)于3個需要備份的目樹。這里只允許12.23.34.57備份服務(wù)器WWW的數(shù)
據(jù),并且需要認(rèn)證。3個模塊授權(quán)的備份用戶都為BACKUP,并且用戶信息保存在文件/etc/backserver.pas中,其內(nèi)容如下:
[root@www /etc]# cat /etc/backserver.pas
backup:bk_passwd
并且該文件只能是Root用戶可讀寫的,否則Rsyncd啟動時會出錯。這些文件配置完畢以后,就需要在WWW服務(wù)器上啟動Rsyncd服務(wù)器:
[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
執(zhí)行完畢上面的命令后,Rsync即可啟動。Rsync默認(rèn)服務(wù)端口為873,服務(wù)器在該端口接收客戶的匿名或者認(rèn)證方式的備份請求。
執(zhí)行Rsync客戶端命令
下一步就要運(yùn)行Rsync客戶端的啟動命令了(本例所指的Rsync客戶端是名為BACKUP的服務(wù)器):
[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(詳細(xì));z是代表Zip(壓縮);r是代表Recursive(遞歸);Topg都是保
持文件原有屬性,如屬主、時間的參數(shù);--progress是指顯示出詳細(xì)的進(jìn)度情況;--delete是指如果服務(wù)器端刪除了這一文件,那么客戶端也相
應(yīng)把文件刪除,保持真正的一致;--exclude
“logs/”是表示不對/www/logs目錄下的文件進(jìn)行備份。同樣-exclude“conf/ssl.*/”是表示不對
/www/conf/ssl.*/目錄下的文件進(jìn)行備份。
backup@12.23.34.56::www
是表示該命令是對服務(wù)器12.23.34.56中的WWW模塊進(jìn)行備份,其中BACKUP表示使用BACKUP用戶來對該模塊進(jìn)行備份。--
password-file=/etc/rsync.pass來指定密碼文件,這樣就可以在腳本中使用而無須交互式地輸入驗證密碼了。這里需要注意的是,
這份密碼文件權(quán)限屬性要設(shè)得只有執(zhí)行這個命令的當(dāng)前用戶可讀,本例中是BACKUP用戶。
這里將備份的內(nèi)容存放在備份機(jī)的/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.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同步服務(wù)就搭建好了,最后我們可以將在客戶端執(zhí)行的命令通過Crontab定時執(zhí)行來實現(xiàn)自動備份,或者寫一些腳本,這樣Rsync同步服務(wù)的搭建就更加完美了。
一些示例腳本
1、每隔7天將數(shù)據(jù)往中心服務(wù)器做增量備份
#!/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樹進(jìn)行鏡像
#!/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
|