同步使用cwRsync實現。由於windows沒有inotify功能,因此只能實現定時同步,我實際中採用每分鐘同步一次(考慮到使用者上傳的速度實際遠低於內網1GB網速,因此此方案是可行的)。具體實現過程如下:
1、軟體準備:
用戶端版本:cwRsync 4.0.5 Installer(最新版5.22,根據需要選擇)
伺服器版本:cwRsyncServer 4.0.5 Installer(最新版5.22,根據需要選擇)
2、 安裝:
在APP1(暫且定義為主伺服器)上安裝cwRsyncServer;Windows下軟體的安裝很簡單,安裝cwRsync時,只需記住如下的密碼即可,其他預設:
在APP2上安裝cwRsync用戶端版本。同樣全部預設即可。
3、配置:
3.1 、伺服器端配置
在cwRsync的安裝目錄下(預設路徑:C:Program Files (x86)ICW),可以找到一個rsyncd.conf的設定檔,先備份一個,然後再修改。
代碼如下 |
複製代碼 |
use chroot = false strict modes = false hosts allow = * log file = rsyncd.log uid = 0 ##指定uid為0,不指定將無法使用 gid = 0 #定義需要同步的路徑,名稱任意,方便自己識別就好 [bbsapp] path = /cygdrive/d/APPSYSTEM/bbs/ #表示路徑:d:\APPSYSTEMbbs read only = false ignore errors transfer logging = yes hosts allow = 192.168.18.0/255.255.255.0 auth users = SvcCWRSYNC #認證賬戶,安裝時的那個賬戶 secrets file = rsync.password #密碼檔案 |
在上述安裝目錄下建立一個密碼檔案rsync.password,內容如下:
代碼如下 |
複製代碼 |
SvcCWRSYNC:pw123456 |
說明:冒號前面為上述賬戶名,冒號後面為安裝時提示的那個密碼,也可以在安裝時指定。
配置完畢後,即可重啟cwRsync服務了,如下:
3.2、用戶端配置
進入用戶端的預設安裝目錄C:Program Files (x86)cwRsync,建立一個密碼檔案rsync.password,將上述使用者的密碼寫入這個檔案(僅僅是密碼)。注意該檔案的許可權必須所有者為administrator,且許可權為600(即只有管理員有許可權),否則同步時會報如下錯誤:
代碼如下 |
複製代碼 |
password file must be owned by root when running as root |
然後在任意位置建立一個批處理,命令內容如下:
代碼如下 |
複製代碼 |
cd /d "C:Program Files (x86)cwRsyncbin" rsync -avz --delete-after --ignore-errors --progress --password-file=”/cygdrive/c/ Program Files (x86)/cwRsync/rsync.password” SvcCWRSYNC@app1_IP::bbsapp /cygdrive/d/APPSYSTEM/bbs |
在計劃任務中調用此批處理,並設定為每分鐘一次即可。
4、cwRsync用戶端命令詳解:
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 開啟校正開關,強制對檔案傳輸進行校正
-a, --archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞迴模式處理
-R, --relative 使用相對路徑資訊
-b, --backup 建立備份,也就是對於目的已經存在有同樣的檔案名稱時,將老的檔案重新命名為~filename。可以使用--suffix選項來指定不同的備份檔案首碼。
--backup-dir 將備份檔案(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份檔案首碼
-u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且檔案時間晚於要備份的檔案。(不覆蓋更新的檔案)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規檔案一樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑分類樹以外的鏈結
--safe-links 忽略指向SRC路徑分類樹以外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持檔案許可權
-o, --owner 保持檔案屬主資訊
-g, --group 保持檔案屬組資訊
-D, --devices 保持裝置檔案資訊
-t, --times 保持檔案時間資訊
-S, --sparse 對疏鬆檔案進行特殊處理以節省DST的空間
-n, --dry-run現實哪些檔案將被傳輸
-W, --whole-file 拷貝檔案,不進行增量檢測
-x, --one-file-system 不要跨越檔案系統邊界
-B, --block-size=SIZE 檢驗演算法使用的塊尺寸,預設是700位元組
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步
--rsync-path=PATH 指定遠程伺服器上的rsync命令所在路徑資訊
-C, --cvs-exclude 使用和CVS一樣的方法自動忽略檔案,用來排除那些不希望傳輸的檔案
--existing 僅僅更新那些已經存在於DST的檔案,而不備份那些新建立的檔案
--delete 刪除那些DST中SRC沒有的檔案
--delete-excluded 同樣刪除接收端那些被該選項指定排除的檔案
--delete-after 傳輸結束以後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個檔案
--partial 保留那些因故沒有完全傳輸的檔案,以是加快隨後的再次傳輸
--force 強制移除目錄,即使不為空白
--numeric-ids 不將數位使用者和組ID匹配為使用者名稱和組名
--timeout=TIME IP逾時時間,單位為秒
-I, --ignore-times 不跳過那些有同樣的時間和長度的檔案
--size-only 當決定是否要備份檔案時,僅僅察看檔案大小而不考慮檔案時間
--modify-window=NUM 決定檔案是否時間相同時使用的時間戳記視窗,預設為0
-T --temp-dir=DIR 在DIR中建立臨時檔案
--compare-dest=DIR 同樣比較DIR中的檔案來決定是否需要備份
-P 等同於 --partial
--progress 顯示備份過程
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不需要傳輸的檔案模式
--include=PATTERN 指定不排除而需要傳輸的檔案模式
--exclude-from=FILE 排除FILE中指定模式的檔案
--include-from=FILE 不排除FILE指定模式比對的檔案
--version 列印版本資訊
--address 綁定到特定的地址
--config=FILE 指定其他的設定檔,不使用預設的rsyncd.conf檔案
--port=PORT 指定其他的rsync服務連接埠
--blocking-io 對遠程shell使用阻塞IO
-stats 給出某些檔案的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定記錄檔格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O頻寬,KBytes per second
-h, --help 顯示協助資訊
5、問題點:
5.1、服務無法啟動:
伺服器在意外重啟後,RsyncServer服務不能啟動,提示“本機電腦上的reyncserver服務啟動後又停止了”,方法是將安裝目錄下的rsyncd.pid檔案刪除或改名即可,再重新啟動RsyncServer服務,OK,成功了,rsyncd.pid檔案會自動重建。
5.2、提示“password file must be owned by root when running as root”
用戶端使用命令同步時,提示上述錯誤,原因為密碼檔案許可權不對,檔案屬主(所有者)必須為administrator,且許可權為600(即只有管理員有許可權)。
6、排除
兩台伺服器上,有些緩衝目錄或臨時檔案,以及特定配置可能是不需要同步的,因此需要進行排除。所以必須在server的設定檔中添加排除同步的檔案,這就需要用到了exclude這個參數。
6.1、目錄排除
exclude這個參數可以在client上面使用,也可以直接在server上面的進行配置。下面的例子是在server的rsyncd.conf檔案上面配置的。
案例:config檔案目錄下有test1、test2和test3這三個目錄,這三個目錄當中都有一個test.txt檔案。下面通過不同的配置資訊來實現不同的同步要求。
ENVISION——config——test1——test.txt
||———test2——test.txt
||———test3——test.txt
通過exclude關鍵字實現test1目錄的例外
代碼如下 |
複製代碼 |
[config] path = /cygdrive/d/ENVISION/ config #exclude from = rsync.exclude exclude = test1/read only = falsetransfer logging = yeslock file = rsyncd.lock |
通過exclude from關鍵字實現test2和test3目錄的例外
代碼如下 |
複製代碼 |
[config] path = /cygdrive/d/ENVISION/ config exclude from = rsync.exclude #exclude = test1/read only = falsetransfer logging = yeslock file = rsyncd.lock |
其中rsync.excluede檔案跟rsyncd.conf在同一目錄下,其中的檔案內容是,其中“/”非常重要。
test2/test3/
6.2、檔案排除
exclude和exclude from不僅僅指限制與目錄,也可以使指定的檔案名稱。
在test1目錄下添加一個檔案test2.txt,然後進行如下配置
代碼如下 |
複製代碼 |
[config] path = /cygdrive/d/ENVISION/ config exclude from = rsync.exclude exclude = test1/ test.txt read only = falsetransfer logging = yeslock file = rsyncd.lock |
再次執行同步命令,會發現test1/test2.txt會被同步,而test1/test.txt不會被同步,好了如果我們要實現自動同步還需要如下做個計劃任務
下面介紹一下如何通過windows中的“任務計劃”來建立定時任務,執行定時同步圖文的,前面介紹的是命令的估計有些朋友會會搞。
首先在用戶端的機器上的: 控制項面板->任務計劃->點擊“新增工作計劃”, 在相應的快顯視窗中點擊下一步,然後點擊導航視窗中的“瀏覽”按鈕,如下,並從中選擇之前建立的批次檔”dnt_sync.bat”:
這時系統會顯示如下視窗提示當前計劃任務執行方式,我這裡選擇每天執行(一次):
到這裡,系統就會建立一個叫dnt_sync的任務計劃,同時在接下來的視窗中提示任務的開始執行時間:
這裡不做任何修改,直接點擊下一步,接著是身分識別驗證(通常是管理員身份),必定任務計劃非同兒戲,要有足夠的許可權才可以玩的轉:)
最後點擊完成,就建立了一個任務計劃。只不過它是按天執行的,如果我們希望其每分鐘執行一次又該怎麼辦呢,其實很簡單,只要在用滑鼠點擊新建立的任務計劃,並在快顯功能表中選擇“屬性”,這時在快顯視窗的“排程”中點擊“進階按鈕”,如下:
這時就會彈出一個叫“進階計劃選項”的子視窗,在其它做如下設定:
到這裡,這個計劃任務就會每天24小時,以每分鐘運行一次的方式來同步之前的那兩個檔案夾了