SQLSERVER 2012之AlwaysOn -- 一次硬體升級引發的問題

來源:互聯網
上載者:User

標籤:

原文:SQLSERVER 2012之AlwaysOn -- 一次硬體升級引發的問題

這是上周遇到的一個案例:對已有的硬體進行升級而引發的問題,期間還觸發了一個比較嚴重的BUG,可謂多災多難;不過值得慶幸的是,在一連串聯鎖問題出現的時候,並沒有出現人工操作失誤(這往往是在處理故障中風險最高、影響最大的問題)而擴大故障影響範圍;

 

==========================華麗麗的分割線==========================

    先說一下環境:

    我做的是跨機房3節點alwayson:

    部署方面:3個節點中,兩個位於主機房,同步模式,另外一個位於異地機房,跨子網非同步模式;

    軟體方面:windows 2012+SQLSERVER 2012 SP2+CU3;

    硬體方面:由於該系統上線時間較早,除了本地硬碟(RAID 10)用於存放必要的安裝程式包外,每個節點各配置了一塊IO卡用於存放資料、記錄檔以及備份

 

    此前該系統在使用時,應用側經常出現提交事務抖動(本地機房兩節點同步),改為非同步模式後應用側效能表現良好;我們知道,在同步模式下,由於應用端需要等待在同步secondary節點完成日誌固化(harden)後才能收到提交或復原資訊,因此兩節點間的網路環境,以及磁碟IO能力就成為上述影響的關鍵;

    而在此之前,我們已經對網路進行了最佳化(詳見:《SQLServer 2012之AlwaysOn —— 指定資料同步鏈路,消除網路抖動導致的提交延遲問題》),因此可以排除網路影響;另外,我們通過對磁碟IO效能的監控(尤其是checkpoint時的影響),最終定位到磁碟IO確實存在壓力,最後決定更換IO卡;

    在申請裝置的時候,我們發現,由於此前的IO卡為第一代產品,與目前最新採購的第三代產品有相容性問題(無法同時安裝),因此需要先將secondary節點從alwayson環境中踢出,重新安裝後重新初始化資料,並添加回alwayson環境;這一步按照標準步驟執行,十分順利;

    其次,我們準備切換AG到已更新硬體的節點(此處我們叫他Node_B),結果發現切換過程很順利(手動容錯移轉),但切換後不能進行備份(由於後續需要將另外一個節點進行同樣的更新硬體操作,不能備份就意味著在重新加回alwayson環境時,不能初始化資料),隨即又將服務切回Node_A上(最初的master節點);

    隨後,我們檢查了Node_B的errorlog,發現其中出現如下錯誤資訊:

Information 29-Apr-2014 3:17:24 PM MSSQL$PRD 9012 Server There have been 25958400 misaligned log IOs which required falling back to synchronous IO. The current IO is on file W:\MOUNTLOG\PRDLOG\PRDLOG1.ldf. Information 29-Apr-2014 3:17:17 PM MSSQL$PRD 9012 Server There have been 25958144 misaligned log IOs which required falling back to synchronous IO. The current IO is on file W:\MOUNTLOG\PRDLOG\PRDLOG1.ldf.

    其實從Node_B更換完硬體,並添加回alwayson環境後,就一直再報類似的錯誤,只是切換比較順利,我們都忽略了檢查errorlog這一關鍵的步驟;

    繼續來說上面的錯誤資訊,misaligned是個針對於IO方向的警示,具體的原理可以參考以下文章

http://blogs.msdn.com/b/saponsqlserver/archive/2014/10/02/message-misaligned-log-ios-which-required-falling-back-to-synchronous-io-in-sql-server-error-log.aspx

    而導致misaligned的原因,是由於兩個節點的IO卡,其物理扇區大小不一致(Node_A為512,Node_B為4096;此處的物理扇區是存放裝置底層設定的,與作業系統中format 4K~64K不是一個概念,作業系統格式化的定義是配置單位大小,或稱之為簇)。上述連結中對9012錯誤進行了詳細的分析,再此不再贅述;

    另一方面,是由於misaligned而導致了切換節點後無法進行備份嗎?第二天,我又搭了一套類似的環境進行測試,但問題沒有重現;於是我們準備用另一套方案進行升級:

    既然由於AG中兩個節點的物理扇區大小不等導致misaligned,我們準備先在現有AG中再增加一個物理扇區大小為4096的節點(Node_C),然後再切換AG到Node_B後,踢掉Node_A。這樣AG中有兩個同步關係的節點(Node_A、Node_C,且物理扇區大小均為4096),或許可以實現備份。

 

==========================華麗麗的分割線==========================

    按照上述方案,我們又安排了一次停機。但這次在切換服務並踢掉Node_A後,不但備份問題沒有解決,連AG組也變成正在解析的情況

 

 

 

    從中,AG組中只能識別到當前節點;

   

 

 

 

 

 

 

    但Node_B仍可以正常的訪問(讀寫正常,listener IP也可以正常使用),而Node_C則無法訪問;這種狀態極為不合理;

    此外,在errorlog中,發現大量remote harden of transaction的報錯

   

 

 

 

 

 

 

      執行備份(spid=509)被checkpoint進程阻塞(spid=23),又被DB STARTUP進程阻塞(spid=35)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    根據微軟工程的分析“這是最近剛剛發現的一個SQL 的bug,只發生在SP2 CU3和CU4上面。即便不做BACKUP,也會發生這樣的阻塞。”

    這可能是由於SQL Server內部發生了死結,建議儘快再所有節點上安裝以下這個補丁。

    http://support.microsoft.com/en-us/kb/3033492

    http://support.microsoft.com/en-us/kb/3034679

    您可以單獨安裝hotfix,或者安裝SQL 2012 SP2CU5,我們建議您對於所有打過SP2 CU3(5556)和CU4(5569)並且配有AlwaysOn的環境,都儘快打上CU5

    http://support.microsoft.com/en-us/kb/3037255/en-us

 

    但目前的情況是需要先保證alwayson恢複正常,於是我們準備通過停機複製資料檔案的方式將資料庫遷移到其他alwayson環境下;但在停止sqlserver服務的時候hang住

 

 

 

 

 

 

 

    無奈,只能重啟伺服器。但神奇的是,重啟大法在這裡居然是最完美的解決方案。重啟後,各種服務均恢複正常;

 

 

 

 

 

 

 

總結:這個案例比較特殊,在切換過程中遇到了另一個BUG,但好在BUG中出現的內部進程的死結通過重啟得到了釋放。另外,對於第一部分提到的misaligned的問題,最好在安裝硬體後,先檢查一下物理扇區的大小是否一致,以免出現效能問題;

SQLSERVER 2012之AlwaysOn -- 一次硬體升級引發的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.