作者:
beauty9235
鏈接:
http://beauty9235.javaeye.com/blog/229634
發表時間: 2008年06月23日
聲明:本文系JavaEye網站發布的原創博客文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任!
其于window系統的同步實戰
1. 遠程數據同步工具Rsync介紹
1.1 軟件簡介
Rsync是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。Rsync本來是用以取代rcp的一個工具,它當前由 rsync.samba.org維護。Rsync使用所謂的“Rsync演算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。運行Rsync server的機器也叫backup server,一個Rsync server可同時備份多個client的數據;也可以多個Rsync server備份一個client的數據。
Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server會打開一個873的服務通道(port),等待對方Rsync連接。連接時,Rsync server會檢查口令是否相符,若通過口令查核,則可以開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,下一次就只傳送二個文件之間不同的部份。
Rsync支持大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試。此外,它在windows平臺下也有相應的版本,比較知名的有cwRsync和Sync2NAS。
Rsync的基本特點如下:
1.可以鏡像保存整個目錄樹和文件系統;
2.可以很容易做到保持原來文件的權限、時間、軟硬鏈接等;
3.無須特殊權限即可安裝;
4.優化的流程,文件傳輸效率高;
5.可以使用rcp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接;
6.支持匿名傳輸。
1.2 核心算法
假定在名為α和β的兩臺計算機之間同步相似的文件A與B,其中α對文件A擁有訪問權,β對文件B擁有訪問權。并且假定主機α與β之間的網絡帶寬很小。那么rsync算法將通過下面的五個步驟來完成:
1.β將文件B分割成一組不重疊的固定大小為S字節的數據塊。最后一塊可能會比S 小。
2.β對每一個分割好的數據塊執行兩種校驗:一種是32位的滾動弱校驗,另一種是128位的MD4強校驗。
3.β將這些校驗結果發給α。
4.α通過搜索文件A的所有大小為S的數據塊(偏移量可以任選,不一定非要是S的倍數),來尋找與文件B的某一塊有著相同的弱校驗碼和強校驗碼的數據塊。這項工作可以借助滾動校驗的特性很快完成。
5.α發給β一串指令來生成文件A在β上的備份。這里的每一條指令要么是對文件B經擁有某一個數據塊而不須重傳的證明,要么是一個數據塊,這個數據塊肯定是沒有與文件B的任何一個數據塊匹配上的。
1.3 命令語法
rsync的命令格式可以為以下六種:
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
對應于以上六種命令格式,rsync有六種不同的工作模式:
1)拷貝本地文件。當SRC和DES路徑信息都不包含有單個冒號":"分隔符時就啟動這種工作模式。
2)使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啟動該模式。
3)使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啟動該模式。
4)從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含"::"分隔符時啟動該模式。
5)從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啟動該模式。
6)列遠程機的文件列表。這類似于rsync傳輸,不過只要在命令中省略掉本地機信息即可。
主服務器
IP 192.168.0.100
F:/data/www
備份服務器
IP 192.168.0.101
F:/data/www
實戰:
1、http://rsync.samba.org/ 下載cwRsync客戶端(cwRsync)和服務器端(cwRsyncServer)。
2、服務器端安裝:采用默認選項安裝。
安裝后,服務默認為手動啟動模式,到“管理工具/服務管理”里,啟動“RsyncServer”服務,并修改“RsyncServer”為自動啟動模式。
1、http://rsync.samba.org/ 下載cwRsync客戶端(cwRsync)和服務器端(cwRsyncServer)。
安裝的過程很簡單,也很順利,從 cwRsync 網站上下載的 server and client ,都安裝了一下,不過后來發現,其實是不需要安裝 client 的,只要 server 就可以了,server 包括了 client 的功能。安裝完 server 后,會在 service 中增加 Rsync 和 ssh 服務。
服務器端安裝:采用默認選項安裝。
安裝后,服務默認為手動啟動模式,到“管理工具/服務管理”里,啟動“RsyncServer”服務,并修改“RsyncServer”為自動啟動模式
2、配置主服務器
配置了一下 rsyncd.conf
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
pid file = rsyncd.pid
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/work
read only = false
transfer logging = yes
只是將 [test] 中的 path 改成了我本機的備份目錄
[www]
path = /cygdrive/F/data/www
read only = false
transfer logging = yes
3、備分服務器數據同步
因為只是最簡單的數據同步,所以就不使用 ssh 了,直接啟動 rsync 服務就可以了。然后按照 usage 上面教的。
rsync -av /cygdrive/F/data/www 192.168.0.100::www
完成了數據的同步工作,一切順利。順便說一下,/cygdrive/d 是安裝完 cwRsync ,會自動將系統上所有的盤 mount 成 /cygdrive/x ,x 表示盤符,小寫的,并把安裝目錄 mount 成 / 了。
這樣我們實現了從主服務器到備分服務器的數據同步
下一步我們結合windows的任務調度來實現這個批處理文件,取名為XXX.cmd
rsync -avr --ignore-errors --force 192.168.0.100::www /cygdrive/F/data/wwwroot
test.bat
---------------------------------------------------------------------------------------------
@echo off
set path=%path%;C:\Program Files\cwRsyncServer\bin;
date /t >> F:\syn.txt
time /t >> F:\syn.txt
rsync -avr --ignore-errors --force --exclude="/tmp/" --delete 192.168.0.103::test /cygdrive/F/temp >> F:\syn.txt
date /t >> F:\syn.txt
time /t >> F:\syn.txt
echo .
echo .
echo . remote synchronous over
echo .
echo .
rem pause
---------------------------------------------------------------------------------------------
linux中安全性說明
一:服務端rsyncd.conf文件配置
uid = nobody
gid = nobody
use chroot = no # 不使用chroot
max connections = 4 # 最大連接數為4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log # 日志記錄文件
[inburst] # 這里是認證的模塊名,在client端需要指定
path = /home/inburst/python/ # 需要做鏡像的目錄
comment = BACKUP CLIENT IS SOLARIS 8 E250
ignore errors # 可以忽略一些無關的IO錯誤
read only = yes # 只讀
list = no # 不允許列文件
hosts allow=172.25.43.57 #允許連接IP
auth users = inburst # 認證的用戶名,如果沒有這行,則表明是匿名
secrets file = /etc/inburst.pas # 認證文件名
注:
為安全考慮,在設置服務端rsyncd.conf模塊時,最好加上auth users = inburst,secrets file = /etc/inburst.pas,密碼寫到一個文件中inburst.pas。
執行命令時:rsync -avrp /test/ [email=inburst@172.25.43.158::test]inburst@172.25.43.158::test[/email] --password-file=inburst.pas。
二:客戶端腳本
rsync -avrp /test/ [email=administrator@172.25.43.58::test]administrator@172.25.43.58::test[/email] --password-file=1234567
(表示將客戶端test目錄下文件備份到服務器test模塊下。如果將/test/放后面,表示將服務器test模塊下目錄備份帶客戶端/test/下。)
選項說明:
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
其他參數可以查看rsync相關手冊。
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦