前幾年我開發過一個軟件系統,為使用者提供7×24小時不間斷的服務。為了確保服務質量,采用了雙機熱備的形式。雙機系統能夠正常工作的關鍵技術之一,就是主備機之間的數據同步。下面介紹的數據同步方法是以網絡文件共享服務為基礎實現的,簡單易行,安全可靠,在當時時間緊、任務重、投資有限的情況下,應用效果比較理想。
Windows網絡文件共享服務
在Windows系統環境中,一台計算機可以作為服務器向局域網中的其它計算機(客戶機)提供“文件共享服務”。通過這項服務,客戶機用戶能夠像訪問本地文件一樣通過網絡對服務器上的共享文件進行一系列操作。
當用戶通過客戶機連接到服務器的共享位置時,他們可以:
客戶機訪問服務器上共享文件位置的方法有多種,如網上鄰居、映射網絡驅動器等。這裡我們采用適合軟件編程實現的“UNC路徑訪問法”。
UNC (Universal Naming Convention) “通用命名約定”,用於確定保存在網絡服務器上的文件位置。UNC符合“\\servername\sharename”格式,其中 servername 是服務器名,sharename 是共享資源的名稱。目錄或文件的 UNC 名稱可以包括共享資源名稱下的目錄路徑,格式為:\\servername\sharename\directory\filename,其中directory是目錄名,filename是共享文件名。
本數據同步方法的設計思路是:當雙機間需要進行數據同步時,主機作為客戶機,利用“UNC路徑訪問法”打開備機(服務器)的數據文件(共享文件),將最新的運行數據寫入數據文件中。這樣就能夠確保主、備機之間數據的一致性。
由於網絡文件共享服務是Windows操作系統提供的基於TCP/IP協議的標准服務,而且服務器在提供服務前需要客戶機提供有效的訪問憑據(如域的名稱、用戶名稱和密碼),用戶能夠進行的操作也取決於被授予的權限,因此利用網絡文件共享服務,結合文件操作、Ping等通用技術,可以實現免數據庫、安全、便捷、易維護的雙機熱備系統數據同步機制。
服務配置過程
由於網絡文件共享服務不是Windows操作系統提供的缺省服務,因此需要通過以下步驟進行配置:
第一步,在雙機中安裝Windows操作系統。通常,Windows 2000或更高版本的操作系統都能夠提供網絡文件共享服務。
第二步,在雙機的操作系統中建立同樣的用戶,使用同樣的密碼,並確保該用戶對各自的共享文件和目錄具有創建、讀、寫、修改和刪除權限。如此設置,能夠保證客戶機順利通過服務器的安全驗證,並訪問服務器的共享資源。
第三步,在操作系統中安裝TCP/IP協議,並確保處於同一局域網中的雙機能夠進行正常通信。
第四步,在操作系統中安裝“Microsoft網絡客戶端”和“Microsoft網絡的文件和打印機共享”兩個網絡組件。這些組件是操作系統對外提供文件共享服務的基礎配置。
此時配置完成,雙機已經具備了互為服務器和客戶機的條件。
數據同步的實現
具體的雙機間數據同步操作是由運行於操作系統中的應用軟件執行的。數據同步操作通常由主機中的應用軟件發起,因此它的執行流程是:
圖2. 主機數據同步流程
在上述流程中,主機應用軟件首先“將數據寫入本地數據文件”,其目的是保證應用軟件在遇到強制關閉等情況後不丟失運行數據,待重新啟動後能夠從本地數據文件中獲得數據,繼續以正常方式運行。
“向備機執行Ping操作”目的是查看當時主備機之間的網絡是否通暢,為後續的數據文件操作提供保障。Ping(Packet Internet Groper,因特網包探測器)操作是通過向目標IP地址發送ICMP(Internet Control Messages Protocol,因特網控制報文協議)回聲請求消息,並依據對方是否應答來判斷網絡的通斷狀況。在這裡,可以將備機的IP地址寫在應用軟件的配置文件中,應用軟件在啟動階段讀取該IP地址,並作為UNC路徑訪問和Ping操作的參數使用。
執行“通過UNC路徑訪問備機的數據文件”操作的C++代碼如下:
1 CFile NetLogFile; 2 CString strFileName; 3 strFileName.Format("\\\\%s\\c$\\StaTerm\\LOG.tmp",m_strBackUpIP); 4 5 //打開備機數據文件LOG.tmp 6 try 7 { 8 if (!NetLogFile.Open(strFileName, CFile::modeCreate | CFile::modeWrite )) 9 { 10 TRACE0("\n無法打開備機數據文件LOG.tmp\n"); 11 return; 12 } 13 } 14 catch ( CException* pe1 ) 15 { 16 TRACE0("\n系統打開備機數據文件LOG.tmp時出錯!\n"); 17 pe1->Delete(); 18 return; 19 }
上述第3行代碼就是采用UNC路徑訪問法確定備機數據文件位置。這樣就保證了可以在第8行使用本地文件打開函數(CFile::Open)打開備機上的網絡共享數據文件,從而降低了軟件開發的難度和復雜度。
在執行“將數據寫入備機數據文件”操作時,主機應用軟件可以有兩種方法完成向備機的數據同步:
對於備機中運行的應用軟件,一般情況下不對其本機的數據文件進行讀寫操作,避免對主機執行同步操作的影響。只有在接到雙機主備裁決模塊發來的升為主機狀態的命令時,該應用軟件才會從本機數據文件中讀取數據,並進入正常執行邏輯。由於此時的數據文件通過前一次同步過程得到了更新,已與原主機的最新數據保持一致,因此就實現了在主備切換時雙機間數據同步的功能。
- CuteBlueOne@博客園 -