微軟有一個愛好叫綁定。我最痛恨的一個綁定是IIS與Windows的綁定——升級IIS竟然要升級作業系統,伺服器不是PC,系統不是想重裝就可以重裝。
在使用SQL Server記錄傳送進行異地備份時,又被微軟的繫結原則坑了一次。記錄傳送只支援Windows檔案分享權限設定這1種也僅此1種方式,而用於異地備份的伺服器與主伺服器不在同一個網路中,根本無法使用Windows檔案分享權限設定。就是微軟繫結原則的證據:
中的共用路徑 \\dbserver\LogBackup 是在記錄傳送主伺服器上設定的,備份伺服器進行記錄傳送時,需要訪問這個路徑,複製其中的記錄備份檔案並進行恢複。
而異地備份時,備份伺服器與主伺服器不在同一個網路,無法通過這個共用路徑訪問到要傳送的記錄檔。
怎麼解決這個問題呢?
如果用Windows架構VPN,你就上了微軟繫結原則的當。
我們沒上這個當,用移花接木之法解決這個問題。
備份伺服器不是需要訪問 \\dbserver\LogBackup 嗎?那我們就在與備份伺服器同一個網路的另外一台伺服器(中間伺服器)上共用出一個這樣的路徑,對於備份伺服器來說,只要能訪問 \\dbserver\LogBackup 就行,才不管是誰共用的呢。
共用路徑的問題解決了,但是備份伺服器訪問共用路徑的真正目的是複製記錄備份檔案。所以,接下來的問題是如何將遠程主伺服器上的記錄備份檔案同步到這台中間伺服器上?
你可能想到的是FTP,我們開始也是這麼想的。但是FTP是上傳/下載的利器,但不是同步的利器。我們這裡的情境是中間伺服器要與遠程主伺服器上的記錄備份檔案進行同步,比如遠程主伺服器會自動刪除超過多少天的記錄備份檔案,主伺服器上刪除了,中間伺服器也要自動刪除。
後來想到了我們在用的檔案同步利器——rsync(使用方法可以參考之前的一篇博文:Windows平台網站檔案同步備份解決方案——cwRsyn),這也是開源世界的傑作,東西雖然看起來簡單、醜陋,但解決起問題來就是那麼有效。
我們就靠rsync解決了SQL Server的異地戀問題,輕鬆實現了異地自動化記錄傳送。
分享一下使用的rsync命令:
rsync -avz --delete --no-super rsync://遠程主伺服器/logbackup /cygdrive/e/LogBackup
解決問題後的感想
在想到rsync之前,我們打算採用的方法是在遠程主伺服器跑FTP服務,然後通過寫C#代碼從遠程主伺服器上FTP下載記錄備份檔案實現同步。即使這部分代碼寫起來不複雜,但從建立項目到發布項目整個加起來的時間會遠遠超過部署rsync的時間。
所以,對於程式員來說,僅僅會寫代碼解決問題是不夠的。真正的程式員不僅追求代碼寫得有多漂亮,而且追求用更巧妙的方式解決問題,哪怕不寫一行代碼,哪怕解決的不是技術問題。
用一句話結束這篇博文:如果把解決問題當作樂趣,程式人生將其樂無窮。