您好,登錄后才能下訂單哦!
案例分享:數(shù)據(jù)庫鏡像故障轉(zhuǎn)移失敗
對于關(guān)鍵性數(shù)據(jù)庫,我們配置了帶有見證服務(wù)器的同步數(shù)據(jù)庫鏡像,來允許自動故障轉(zhuǎn)移。一切運行正常,直到有一次數(shù)據(jù)中心的突然斷電。數(shù)據(jù)庫鏡像執(zhí)行了故障轉(zhuǎn)移,但是運維反饋說應(yīng)用程序掛起了。當(dāng)我們手動切換回來,應(yīng)用程序又正常工作。為什么應(yīng)用程序沒有也故障轉(zhuǎn)移呢?
這是使用數(shù)據(jù)庫鏡像的合理的常見問題,像這樣的生產(chǎn)應(yīng)用失敗,是因為在鏡像部署后沒有做故障轉(zhuǎn)移測試。在失敗的故障轉(zhuǎn)移之后我們感到棘手。
為了避免生產(chǎn)應(yīng)用停機,我們在測試環(huán)境復(fù)制了線上的鏡像環(huán)境。在確認應(yīng)用和數(shù)據(jù)庫鏡像正常工作后,我們將主服務(wù)器關(guān)機,應(yīng)用完全掛起。
我們檢查了,鏡像服務(wù)器已經(jīng)成功初始化了一個故障轉(zhuǎn)移,并在線作為主服務(wù)器。我們也檢查了鏡像數(shù)據(jù)庫為在線狀態(tài),可以被新的主服務(wù)器本地訪問,并且主服務(wù)器也可以像被應(yīng)用程序使用一樣被遠程客戶端訪問。
然后,我們來檢查應(yīng)用程序。和開發(fā)聊了下,他確認應(yīng)用程序是使用ADO.NET來連接SQL Server,并使用顯式客戶端重定向,在SqlConnection的ConnectionString屬性指定鏡像服務(wù)器名。(順便說一句,使用顯式客戶端重定向總是比隱式客戶端重啟定向要好,隱式依賴于客戶端連接建立時自動緩存的鏡像服務(wù)器名)
那為什么應(yīng)用程序沒有故障轉(zhuǎn)移呢?
我深入探究應(yīng)用程序是如何處理連接失敗,發(fā)現(xiàn)根本沒有應(yīng)對存在的連接失敗的代碼!基本上,當(dāng)應(yīng)用程序初始化,應(yīng)用會打開一個到SQL Server的連接,并且絕不嘗試重連。
結(jié)果發(fā)現(xiàn):盡管DBA部署了數(shù)據(jù)庫鏡像,沒有和開發(fā)討論過高可用性,因此應(yīng)用程序代碼沒有改變。在開發(fā)修復(fù)后,應(yīng)用程序連接層可以應(yīng)對連接失敗和執(zhí)行重連邏輯,在數(shù)據(jù)庫故障轉(zhuǎn)移之后可以完美工作。
這個故事告訴我們,需要重新構(gòu)建應(yīng)對發(fā)生的連接失敗和重連,來讓故障轉(zhuǎn)移正確工作。在這個案例中,如果我們在部署在生產(chǎn)環(huán)境之前,在測試環(huán)境嘗試了數(shù)據(jù)庫鏡像故障轉(zhuǎn)移,那客戶端就會發(fā)現(xiàn)這個問題了。
具體原理和應(yīng)用程序的代碼示例,可參考以下文章:
將客戶端連接到數(shù)據(jù)庫鏡像會話(https://msdn.microsoft.com/zh-cn/library/ms175484.aspx)
Implementing Application Failover with Database Mirroring(https://technet.microsoft.com/en-us/library/cc917713.aspx#EDAA)
Sample Application to test database mirroring failover(https://blogs.msdn.microsoft.com/grahamk/2009/01/16/sample-application-to-test-database-mirroring-failover/)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。