微軟有一個愛好叫綁定。我最痛恨的一個綁定是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的時間。
所以,對於程序員來說,僅僅會寫代碼解決問題是不夠的。真正的程序員不僅追求代碼寫得有多漂亮,而且追求用更巧妙的方式解決問題,哪怕不寫一行代碼,哪怕解決的不是技術問題。
用一句話結束這篇博文:如果把解決問題當作樂趣,程序人生將其樂無窮。