1.參考文獻:
2.背景:
當前的SCADA架構中,有1台Server,5台FE,還有1台Client。其架構如下圖所示:
雖然叫法不同,但是他們的安裝文件和配置文件是完全一樣的。並且大多數情況下,也建議這些服務器上面的配置文件保持一致,這樣只需要維護一個版本的config即可,不需要個性化定義每台服務器上面的config文件。由此也帶來了一個新的問題,每當我在一台機器上面修改了配置文件,我還需要在其他6台機器上面做相同的修改,重復勞動非常多。由此產生了部署一套文件同步系統的想法,只需要在一台機器上做修改,其他機器自動定時同步即可。
3.解決方案:
在網上找到一些文件同步方案,最后決定使用cwRsync這個軟件。cwRsync是基於cygwin平台的rsync軟件包,支持windows對windows、windows對Linux、Linux對windows高效文件同步。由於CwRsync已經集成了cygwin類庫,因此安裝的時候可以省去cygwin包。Cwrsync還集成了OpenSSH for windows,可以實現Linux 下Rsync一模一樣的操作。使用 cwRsync 來同步文件后,只需要對一台主服務器進行文件修改,其他鏡像服務器可以自動同步,包括文件的更新、刪除、重命名等。
cwRsync分為付費版和免費版兩種,我們只需要使用免費版即可,在官方網站上面下載cwRsync的客戶端版本和服務器版本。
客戶端版本:cwRsync 4.0.5 Installer
服務器版本:cwRsyncServer 4.0.5 Installer
4.安裝:
對於cwRsync的安裝沒有什么好說的,我選擇的全部都是默認安裝,對於服務器版本的安裝,這里再多加一句,在安裝過程中會提示要求我們輸入Service account以及密碼,如果我們不指定的話會使用SvcCWRSYNC這個賬戶,密碼是隨機生成的,所以要記住這個密碼。但是在我后面的配置中,並沒有用到這個Service account。
5.配置:
cwRsync的架構很簡單,有一個Server和多個Client組成。安裝server版的cwRsync以后,在服務器上面啟動cwRsync服務,然后在客戶端上面執行文件同步命令即可實現文件同步功能。如果我們將文件同步命令添加到windows計划任務當中,就可實現定義同步的功能。
5.1服務器端配置
在cwRsync的安裝目錄下,可以找到一個rsyncd.conf的配置文件,下面我根據自己實際的業務需求來講名配置文件的修改方法,在第二節背景中我就已經講到了,我有1台Server,5台FE,1台Client。我們的SCADA系統安裝在這七台機器的相同目錄下,都是D:\xxx,然后配置文件目錄是D:\xxx\config,我要實現的目標就是:只要我修改Server這台機器的config目錄,那么其他六台機器(5台FE和1台Client)就會自動同步相應的配置信息。
下面我將自己服務器端配置文件貼出來,在配置文件的下端,我們看到[config]標簽,這就是我們需要同步的config目錄,這里需要注意的就是對於文件目錄名稱的變更。我們看到配置文件中有一行寫着"Remember cygwin naming conventions : c:\work becomes /cygwin/c/work",也就是在windows系統下,目錄地址為c:\work的,在我們的配置文件path中,需要修改為/cygwin/c/work。同樣的,我們的當前想要同步的目錄是D:\xxx\config,那么我就寫成path = /cygdrive/d/xxx/config。其他的配置就按照給出的模板來配置即可。
use chroot = false strict modes = false hosts allow = * log file = rsyncd.log pid file = rsyncd.pid port = 8173 #默認端口8173 uid = 0 #不指定uid,不加這一行將無法使用任何賬戶 gid = 0 #不指定gid max connections = 10 #最大連接數10 # Module definitions # Remember cygwin naming conventions : c:\work becomes /cygwin/c/work # [config] path = /cygdrive/d/xxx/config #表示文件目錄 read only = false transfer logging = yes lock file = rsyncd.lock #auth users = service-scada #認證用戶名 #secrets file = rsync.password #認證用戶的用戶名和密碼存儲位置
在配置完畢以后,我們接下來就需要啟動cwRsync的服務,我們將此服務設定為自動啟動,如下圖所示。
還有,在上面我們指定RsyncServer的端口是8173,我們可以通過netstat -an這個命令來檢查8173端口是否被監聽,如下圖所示。
5.2客戶端配置
在安裝完cwRsync的客戶端以后,我們看到默認的安裝目錄是C:\Program Files\cwRsync,我們記下這個安裝目錄,后面會用到這個安裝目錄。
在客戶端上新建一個記事本,在記事本中輸入以下信息:
1 c: 2 cd C:\Program Files\cwRsync\bin 3 rsync -av rsync://10.138.16.54:8173/config /cygdrive/d/xxx/config
然后再將此記事本重命名為config_rsync.bat,就形成了一個批處理文件。在批處理文件中,之所以需要添加第1、2行,是因為在安裝cwRsync客戶端的時候,並沒有將cwRsync的程序目錄添加到path這個環境變量當中,如果在環境變量path當中添加C:\Program Files\cwRsync\bin,則不需要在批處理中添加第1、2行。
第三行"rsync -av rsync://10.138.16.54:8173/config /cygdrive/d/xxx/config"的含義是從服務器同步config文件,同步到本地的D:\xxx\config目錄下面。同步會以server上面的版本為准,如果在fe上面存在同名文件會被替換。
5.3通過計划任務客戶端定時同步文件
前面通過批處理文件來實現文件同步還是手動操作,后面通過添加計划任務即可實現。我們添加一個叫做rsync_scada的計划任務,然后指定其運行腳本是config_rsync.bat,如下圖所示:
在日程安排中設定執行時間,如下圖所示,這樣設置能夠做到每個十分鍾就能同步一次config目錄。
6.日志查看:
對於文件同步的日志,只能在安裝有服務器版cwRsync的機器上面查看。在5.1中提到了服務器端的配置文件,其中有一行是:log file = rsyncd.log。我們在安裝目錄下就能找到 rsyncd.log這個文件,打開文件我們可以看到所有的記錄。下面我摘錄部分日志信息

2013/10/10 15:40:38 [2316] connect from BJCGNSCF01 (10.138.16.55) 2013/10/10 15:40:39 [2316] rsync on config/ from bjcgnscf01 (10.138.16.55) 2013/10/10 15:40:39 [2316] building file list 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () config.xml 438246 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () config1.xml 438161 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () process-test.xml 20339 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_AUML.txt 8178 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_BPCG.txt 4453 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_BRBA_SE.txt 4373 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_BRBA_VS.txt 4340 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_DEBT.txt 7114 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_LWZA.txt 4462 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMCH.txt 4822 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMDS.txt 7531 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMFR.txt 7104 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMHJ.txt 4956 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMSY_VS.txt 4184 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_NMXQ.txt 4340 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_PI.txt 50574 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_SCDA.txt 4960 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_SDSG.txt 7531 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_TPSA.txt 4466 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_TSLW.txt 4791 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_TWSA.txt 4466 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_XKHA.txt 4791 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_XZDA.txt 4952 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_OPC_ZJCA.txt 4462 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () fe_sys/wtg_template_zjc.txt 43642 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/alarm_tab_define.sys 141 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/his_start_month.sys 8 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/pointvalue_10m.sys 255 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/system - 副本.sys 138 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/system.sys_bak 269 2013/10/10 15:40:39 [2316] send bjcgnscf01 [10.138.16.55] config () scada_sys/version.sys 5 2013/10/10 15:40:40 [2316] sent 580665 bytes received 5217 bytes total size 4120913 #cwRsync只同步增量文件,當server端沒有新增或者刪除文件時,客戶端的目錄頁不會發生變化 2013/10/10 15:50:16 [2252] connect from BJCGNSCF01 (10.138.16.55) 2013/10/10 15:50:17 [2252] rsync on config/ from bjcgnscf01 (10.138.16.55) 2013/10/10 15:50:17 [2252] building file list 2013/10/10 15:50:17 [2252] sent 2420 bytes received 125 bytes total size 4120913
7.Windows下rsync服務無法啟動的解決方法
服務器在意外重啟后,RsyncServer服務不能啟動,提示“本地計算機上的reyncserver服務啟動后又停止了”,方法是將安裝目錄下的rsyncd.pid文件刪除或改名即可,再重新啟動RsyncServer服務,OK,成功了,rsyncd.pid文件會自動重新生成。
8.rsync排除目錄的使用方法
需求場景:當前希望將一台server上面的一個文件夾同步到5個client上面去,但是又不希望同步所有文件,由個別文件是不需要同步的,所以必須在server的配置文件中添加排除同步的文件,這就需要用到了exclude這個參數。這個可以在client上面使用,也可以直接在server上面的進行配置。下面的例子是在server的rsyncd.conf文件上面配置的。
案例:config文件目錄下有test1、test2和test3這三個目錄,這三個目錄當中都有一個test.txt文件。下面通過不同的配置信息來實現不同的同步要求。
ENVISION——config——test1——test.txt
||———test2——test.txt
||———test3——test.txt
8.1通過exclude關鍵字實現test1目錄的例外
[config] path = /cygdrive/d/ENVISION/config #exclude from = rsync.exclude exclude = test1/ read only = false transfer logging = yes lock file = rsyncd.lock
8.2通過exclude from關鍵字實現test2和test3目錄的例外
[config] path = /cygdrive/d/ENVISION/config exclude from = rsync.exclude #exclude = test1/ read only = false transfer logging = yes lock file = rsyncd.lock
其中rsync.excluede文件跟rsyncd.conf在同一目錄下,其中的文件內容是,其中“/”非常重要。
test2/
test3/
8.2排除目錄下的指定文件
exclude和exclude from不僅僅指限制與目錄,也可以使指定的文件名。
在test1目錄下添加一個文件test2.txt,然后進行如下配置
[config] path = /cygdrive/d/ENVISION/config exclude from = rsync.exclude exclude = test1/test.txt read only = false transfer logging = yes lock file = rsyncd.lock
再次執行同步命令,會發現test1/test2.txt會被同步,而test1/test.txt不會被同步。