如何爲Exchange2010設計基於Windows Server Backup的備份恢復方案

寫在前面:
第一,如果有經費,最好是使用專業的備份軟件。Windows server backup (WSB) 有諸多限制和功能缺陷,只適合在沒有經費或者緊急情況下的替代方案。

 第二, 本文的宗旨是解惑和最佳實踐推薦。如果要看向導性質的初級文章,請點這裏 和 這裏 。

Okay, 開始講故事了。

 話說有一天,technet的微博上登了一則關於使用Windows 備份Exchange數據庫的帖子,我覺得不完全正確,就點了一下,結果引得一個管理員跟我爭論這個問題,最後還對我開啓了嘲諷模式 唉,無奈啊。。。 鑑於我們這裏也有蠻多版友對如何使用Windows Server backup產生了迷惑,而且網上的文章,包括technet 文章基本都是泛泛而談,容易讓人產生誤解,我這裏特撰文一篇來把來龍去脈講清楚。

 先談幾個知識要點:

要點一: 
Windows Server backup 由於使用的是 VSS備份,因此是對數據庫所在的Volume進行備份,而不是針對單獨的數據庫文件。也就是說,如果在同一個Volume上有三個數據庫,你必須對這三個數據庫同時進行備份,而不能分開進行。

要點二:
 請一定把針對系統狀態的備份和Exchange數據庫的備份分開到不同的備份計劃裏。原因有二,WSB對system state進行備份時,需要特定的VSS Writer, 而且備份存儲空間不可以設置爲遠程共享目錄。

要點三:
只能針對本機的volume 進行備份,且不能使用磁帶機做爲存儲目標。備份的數據允許被存儲到遠程共享,而且允許複製到其他節點進行數據庫恢復。

要點四:
 缺省情況下, Windows native backup 使用Exchange Replica 的VSS Writer來備份Exchange數據庫。這在單臺情況下沒什麼問題。然而,如果針對DAG進行備份就會有問題。備份雖然能結束,但是最後會報警,同時你會在事件日誌中看到警告ID: 2137 ,並且發現 transaction log 根本沒有被清除。



 出現這個錯誤的原因是,當你使用Exchange Replica 的VSS Writer來備份Exchange數據庫,你指定的那個Volume 上,必須只能有 active copy 的數據庫。
 舉例說明,有一個DAG如下表所示:




也就是說,例如你在DAG節點1上指定備份一個Volume1,這個Volume上有三個數據庫,db1,db2,db3。現在 db1 在節點1是活躍拷貝,db2和db3是passive copy,備份結果就會報警,並且db1,2,3都不會自動清除 transaction log。要解決這個問題有兩個方法:
1.        在備份任務裏,選擇要備份的Volume的時候,選擇只有數據庫的active copy 的Volume。這個方法其實很不現實,因爲DAG切來切去是很正常的事情,你不能保證這個Volume上跑的總是 active copy.
 2.        使用一個註冊表,啓用Exchange Store 的VSS Writer來替代原始的 VSS writer. 微軟technet上提供的方案就是這個。看上去很美,不是嗎?但其實問題多多。這就是要點四要講的事情了。

要點五: 
按照微軟 technet的推薦,你可以創建下面的註冊表並重啓 Exchange replication 服務,來啓用Exchange Store 的VSS Writer. 
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\V14\Replay\Parameters.
 Type: DWORD
 name: EnableVSSWriter
 value: 0
開啓了這個註冊表以後,你就可以解決上面的出錯信息了,Windows backup可以針對同時有 passive copy 和active copy的 Volume進行備份了。

 這就全搞定了嗎?其實不然,這依舊還是有問題的。technet和網上的文章都沒有講清楚,很容易讓人產生誤解。

 讓我們回到上面的例子,對Volume1完整備份之後,你會發現db1 (該節點上的database active copy) 的transaction log 的確被自動清除了,而且清除能複製到其他的節點上。然而db2和db3的log 依然不會被自動清除。也就是說,active copy的備份的確是成功了,passive copy的備份最後被忽略了。因此,如果要成功備份全部db1 , db2, db3, 你需要去三個節點上,分別針對volume1跑一個備份任務。如此才能保證三個數據庫無論被切換到哪個節點,都能被成功備份並且清除transaction log。看到這裏,相信各位應該很容易看出問題了。這麼將會
1.        浪費系統資源包括IO和備份存儲空間
2.        浪費寶貴的備份窗口時間,要知道,Windows backup 只能同時運行一個任務,如果你有多個volume 要備份,只能一個接一個的做。
3.        針對active copy備份會產生大量的IO, 容易對客戶端的使用產生影響,比如 outlook 慢,界面僵住不動等等。有人要說了,我放晚上備份不就是了嗎?拜託,這已經不是exchange 2003時代了,現在的數據庫動輒就是500GB朝上,而且WSB是單個進程工作的,job 要一個一個滴完成,一個晚上有多少時間留給備份的?
4.        即使你能保證每個volume 分配一個數據庫,但是由於DAG的特性,你不能保證這個volume上的數據庫拷貝總是 active copy. 一旦後臺數據庫發生切換,備份照常進行,但卻是無效備份, transaction log 不會被自動刪除。如果數據庫數目比較多,這將是系統管理者的噩夢。

要點六:
使用的windows backup 備份的數據庫,只能用來恢復 active copy. 比如,你在節點一上備份了數據庫後,數據庫切換到節點二了。這時候,如果你嘗試用備份在節點一上直接恢復這個數據庫,將會失敗。你必須把數據庫的 active copy切換到節點一,纔可以正常恢復數據。當然你也可以拷貝數據去節點二,在節點二上恢復。



 弄清楚了以上幾個要點,我們現在來一起總結一下Windows backup備份Exchange數據庫的最佳實踐。

1. 首先,在存儲允許的情況下,儘量保證一個數據庫一個 volume(注意: volume和LUN不是一個概念). 不要擔心盤符不夠的問題,你可以使用 mount point 來解決。


2.        備份active copy 會產生大量的IO, 容易對客戶端的使用產生影響,比如 outlook 慢,界面hung住等等。因此在老的Exchange 2003系統裏,管理員不得不把備份窗口限制在晚上很短的一段時間內。現在有了Exchange DAG, 我們可以針對 passive node 進行備份,從而規避備份IO帶來的問題。這一點在虛擬化的Exchange private cloud系統中尤其重要。另外,如果我們能夠把 passive copy 都集中到一臺專門用來備份的服務器上,同時配置服務器以阻止數據自動切換到這個節點。這將能大大節省備份所需的存儲空間和提高備份的效率,管理起來也方便了許多。
PowerShell 命令:
Set-MailboxServer -Identity <server name> -DatabaseCopyAutoActivationPolicy Blocked

 3.        兩步備份 (2 stage backup)。我們可以安排一臺性能較低的服務器,後臺除了鏈接數據庫所需的 SAN/DAS/JBOD外,還鏈接大容量的 SATA盤組作爲 第一步的disk to disk 的備份,然後再從備份硬盤組上把數據通過磁帶機備份去VTL/TL.

 4.        爲了確保每天備份的目標一定是passive copy, 備份不會因爲某些人爲切換而失敗,我們可以在備份任務開始前大約15分鐘,運行一個PowerShell腳本,檢查數據庫的active copy 是否都在我們預設的節點上,如果不是,把他們按照預設的優先級切換回去。

  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

複製代碼
5.        不要使用Windows Server backup 界面來配置備份任務,因爲這樣你只能配置一個任務,相當不方便。推薦使用計劃任務加wbadmin命令行的方式。
  1. wbadmin start backup -backupTarget:F: -include:D:,E:,F: -allCritical -vssfull -quiet

複製代碼
NOTE: 如果是mount point或者想避免使用盤符,你可以用 Volume ID 代替盤符。這個信息可以使用 mountVol.exe 從服務器上獲取。類似格式如下:
  1. wbadmin start backup -backupTarget:\\remoteshare\Exchangebackup\node1 -include:\\?\Volume{1be73a5a-052f-11df-82c2-806e6f6e6963}\,\\?\Volume{26934b04-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{26934b0b-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{26934b0e-09f5-11df-a2b7-002564f8c664}\,\\?\Volume{1be73a5b-052f-11df-82c2-806e6f6e6963}\ -allCritical -vssfull -quiet

複製代碼
6.        網上還有一些文章推薦在每晚備份前把數據庫用腳本切換到一個節點,然後在這個節點上統一備份,完成之後再切回各自節點的方法。這個方法實用性很差而且風險很大。首先,你怎麼確保數據庫切換一定成功?怎麼保證切過去了能切回來?萬一備份時間太長,沒結束就要往回切了呢?這不亂套了嗎?另外,切換的時候某些版本的Outlook 可能會彈框或者產生延遲。


 綜上所述,我們可以得到如下兩個最優化方案。


 方案一:當你手頭沒有足夠的存儲和服務器的時候。



1.        開啓註冊表來啓用Exchange Store 的VSS Writer
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ExchangeServer\V14\Replay\Parameters.
 Type: DWORD
 name: EnableVSSWriter
 value: 0

重啓 Microsoft exchange replication service

 2.        配置一個計劃任務,在所有備份任務開始前15分鐘運行。
Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
 Switch:
 -NonInteractive -WindowStyle Hidden -command "&'C:\source\balancedb.ps1' -MonitoringContext -ShowDetailedErrors-ErrorAction:Continue"
 (注意上面的路徑可能變化)

腳本balancedb.ps1內容如下
  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

複製代碼
3.        爲了儘量避免備份帶來的IO影響,儘量把備份窗口安排在晚上。

4.        儘量確保每volume一數據庫,然後配置windows backup只備份預設的active copy 所在的那個 volume.

 5.        使用命令行來配置多個備份任務。記得控制好時間間隔,Windows Server Backup 對Exchange備份,同時只支持一個備份任務,不要一個沒結束另外一個就開始了,這樣後面那個任務就會被自動忽略。



 方案二:如果你有足夠的服務器和存儲,推薦下面這個方案



1.        儘量確保每volume一數據庫。
2.        配置一臺備份專用的低配置服務器加入到DAG中,配置這臺服務器上只跑 passive copy 
 3.        同時配置服務器以阻止數據自動切換到這個節點。這將能大大節省備份所需的存儲空間和提高備份的效率,管理起來也方便了許多。
PowerShell 命令:
  1. Set-MailboxServer -Identity <server name> -DatabaseCopyAutoActivationPolicy Blocked

複製代碼
4.        配置一個計劃任務,在所有備份任務開始前15分鐘,運行。
Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
 Switch:
 -NonInteractive -WindowStyle Hidden -command "&'C:\source\balancedb.ps1' -MonitoringContext -ShowDetailedErrors-ErrorAction:Continue"
 (注意上面的路徑可能變化)

腳本balancedb.ps1內容如下
  1. cd $exscripts

  2. RedistributeActiveDatabases.ps1 -DagName NTXDAGPSG01 -BalanceDbsByActivationPreference -Confirm:$False

複製代碼
5.        由於是在passive copy 上備份,生產環境不會受到備份IO的影響,因此可以把備份窗口延長到較長的時間段,甚至是白天的時段。
6.        使用命令行來配置多個備份任務。記得控制好時間間隔,Windows Server Backup 對Exchange備份,同時只支持一個備份任務,不要一個沒結束另外一個就開始了,這樣後面那個任務就會被自動忽略。

 講了這麼多,就是爲了拋磚引玉,歡迎大家討論,覺得有什麼不對或者還可以改善的地方,儘管指出,加分加點。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章