在日常運維工作中,經常會遇到這樣的情況:我們需要在無人值守的情況下完成文件、文件夾的同步過程,已實現週期性的備份,避免單點故障。本研究實現了本地Windows主機與遠程Windows主機,本地Windows主機與遠程Linux主機目錄的定時自動同步。實驗在Windows2003,REHL5.4下實驗通過。
一、軟件準備
Linux下有rsync,Windows下也有類似的軟件,就是cwRsync,此軟件分爲服務器端/客戶端。目前最新版本爲:4.04版,cwRsyncServer_4.0.4_Installer,cwRsync_4.0.4_Installer。
cwRsync打包了Rsync和Cygwin,使用cwRsync可以進行快速的遠程備份和同步。Rsync使用了Rsync算法,通過它可以非常快的進行遠程文件的同步。這種算法只需要在鏈路上傳遞文件不同的部分,而不需要提前在一端準備好文件所有版本的。乍一看這似乎是不可能的,因爲計算兩個文件之間的不同,通常需要本地訪問的這兩個文件。
Rsync通常使用ssh進行數據通訊,安裝它不需要任何特殊權限,但是你必須有一個可以運行ssh軟件系統。
作爲選擇,rsync可以運行在守護進程模式,監聽一個socket端口。這通常是用於公共文件的分發,雖然身份驗證和訪問控制是可利用的。Cygwin是一個Windows下類linux系統環境。它由一個DLL(cygwin1.dll),模擬大量的Linux API功能,以及工具的集合。
詳細情況可通過http://itefix.no/cwrsync/瞭解。
二、初始化安裝
cwRsync支持多種平臺:client – NT/2000/XP/2003/Vista/7,Server – NT/2000'/2003/2008/Vista/7.
cwRsync已一個zip壓縮包包含一個Windows下安裝程序形式發佈。解壓下載文件,運行cwRsync_x.x.x_Installer.exe或者cwRsync_Server_x.x.x_Installer.exe(服務器版):
- 歡迎頁面,點擊“Next”進入 。
- 查看License協議。
- 根據安裝包的不同選在安裝組件:客戶端安裝包有一個可選項(Secure Channel Wrapper & Wizard),它做一個簡單的工作,安裝一個安全的連接方式與服務器端程序。
- 指定一個安裝路徑。
- 指定一個服務器的賬戶(僅服務器端程序)。
- 安裝開始。可以點擊“Details”按鈕,查看更多關於安裝的詳細信息。
OK,cwRsync已經安裝成功。
cwRsync服務器端,需要根據需要修改配置文件。安裝過程中會自動創建SvcCWRSYNC用戶,所屬user組。如果定義了上傳模塊,則必須保證cwRsync server有正確的權限可以訪問目錄。可以通過開始菜單程序快速訪問此配置文件。
cwRsync Server會安裝爲WINDOWS服務,啓動參數爲:--config rsyncd.conf --daemon --no-detach。默認自動啓動。
三、實驗環境
服務端(需要背同步的數據所在的服務器):192.168.1.10
客戶端(需要將數據同步的服務器):192.168.1.20
需要被同步的數據:d:/resource
需要同步到d:/back/resource
Server:
修改rsyncd.conf
1: uid = 0 2: gid = 0 3: use chroot = false 4: strict modes = false 5: hosts allow = * 6: log file = rsyncd.log 7: 8: # Module definitions 9: # Remember cygwin naming conventions : c:\work becomes /cygwin/c/work 10: # 11: [RESOURCE] 12: path = /cygdrive/d/resource 13: read only = false 14: transfer logging = yes 15:.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
打開命令行窗口,然後執行: net start RsyncServer。服務器端準備完成。Client:
打開命令行窗口,然後執行:rsync -avz 192.168.1.10::RESOURCE /cygdrive/e/back/resource注意:如果剛剛沒有把cwrsync的安裝目錄添加到windows的path變量中,系統是無法執行rsync命令的。添加方法,例如我把cwrsync的客戶端安裝在D:\Program Files\cwRsync,則需要把D:\Program Files\cwRsync\bin這個路徑添加到windows的系統path變量中。添加之後需要重新打開cmd命令行窗口纔可以執行上面的命令。
Bat腳本編寫:
1: @ECHO OFF 2: REM ***************************************************************** 3: REM 4: REM CWRSYNC.CMD - Batch file to start rsync command (s). 5: REM 6: REM By David.Jin 7: REM ***************************************************************** 8: SETLOCAL 9: SET STIME=%date:~0,10% %time:~0,8% 10: SET CWRSYNCHOME=%PROGRAMFILES%\RSYNC 11: SET CWOLDPATH=%PATH% 12: SET PATH=%CWRSYNCHOME%\BIN;%PATH% 13: rsync -avz 192.168.1.10::RESOURCE /cygdrive/e/back/resource 14: SET ETIME=%date:~0,10% %time:~0,8% 15: ECHO 腳本開始時間: %STIME% 16: ECHO 腳本結束時間:%ETIME% 17: PAUSE
將該腳本保存爲bat文件,使用windows自帶計劃任務就可以進行定期的服務器間文件同步。
總結:此方法對於正常情況下的Windows服務器間文件定期同步是非常有效的解決方案。但是對於大量小文件的同步性能上沒有官方介紹那麼出色。經常會出現各種main.c錯誤。從筆者這裏也無法得到準確的回答。不過筆者確實多次查閱了rsync mail list,可以非常明確的說:使用ssh協議進行文件同步,程序運行會更加穩定,同時性能消耗較大,同步效率降低。
遇見問題時,祝你好運。