【編者按】 PagerDuty是一家新興的互聯網創業公司,它是一款能夠在服務器出問題是發送提醒的產品,包括屏幕顯示、電話呼叫、短信通知、電郵通知等。目前AdMob、37Signals、StackOverflow、Instagram等均采用了PagerDuty作為消息通知以及突發事件處理工具。本文作者Doug Barth分享了PagerDuty是如何成功地把現有系統MySQL遷移至XtraDB集群,以及在這一過程中遇到的利與弊。
在半年前,PagerDuty公司成功地把現有系統從MySQL遷移至XtraDB集群,并在其上運行亞馬遜EC2。
舊系統配置分析
從配置上看,這是一個非常典型的MySQL環境:
存在的問題
兢兢業業的舊系統服務多年后,面對日益突出的可靠性問題,開始顯現出力不從心了。此外,每次進行主服務器切換,無疑于是一場悲?。阂M行DRBD主機切換,首先得在主服務器上中斷MySQL,脫機DRBD卷,把從服務器狀態變更為主服務器,重新載入DRBD,最后重啟MySQL。而這一整套過程會導致服務中斷,因為MySQL在由中斷到重啟的過程中,我們設置了一個冷卻緩沖池,在系統服務重回正軌前這個冷卻機制需要時間預熱。
我們嘗試通過Percona的緩沖池恢復(buffer-pool-restore)功能來減少中斷時間,但這相對于我們體型龐大的緩沖池來說如同蚍蜉撼樹。同時該功能會增加額外的系統資源開銷。還有個問題是,一旦發生意外的主服務器切換,異步從服務器將停止運作,必須手動重啟。
擁抱XtraDB集群的原因
XtraDB集群的特色:相校于之前的雙機系統,集群中采用的是三機同時運作,兩兩進行同步備份。因此連接切換時間大為減少。
支持多主服務器同時在線,每個主服務器擁有一個熱緩沖池。異步從服務器可以選擇任何節點作為主機,節點間的轉移不會中斷備份復制進程。
自動化的節點機制與我們目前的自動化系統配合良好。配置新節點后,我們只需提交一個節點地址,新節點將會自動收到一個數據備份集,同步數據后會加載到主服務器群中。
前期準備
將XtraDB集群接入現行系統,需要進行一定的前期準備。部分是簡單的MySQL微調,其余的是一些基礎化的操作。
在MySQL上的操作:
除上述MySQL端的操作,為了能在DRBD服務器上進行獨立的測試,應用系統端需要進行如下的變更:
模式變更的選擇
在XtraDB集群中進行模式變動是牽一發而動全身的。在集群有兩種實現方式,一種是total order isolation (TOI,總序分離式),另外一種是rolling schema upgrade (RSU,滾動模式升級)。
在RSU模式下,允許單獨地對節點進行更新。當執行DDL語句時,按序同步各個節點,執行完畢后再重新加入集群。但是這個功能會招致不穩定性,同時數據的大量刷新動作引起的系統問題是不可避免的,由于RSU需要等待DDL語句執行完畢才能進行緩存刷新。
相比之下,TOI的更新操作是一次性同步所有節點,阻斷集群通信直到更新完成。我們衡量一番后,決定采用TOI模式。由于系統中斷時間較短,所以這次沒有對集群進行阻斷。
遷移過程
首先,我們在現系統中建立一個集群作為現DRBD數據庫的一個從屬。當該從屬數據庫接收到所有寫入操作時,我們可以進行壓力測試,看看它的承載能力如何;同時會進行相關數據收集和分析。
在進行一系列相關基準測試后,我們發現了兩點技術細節是能夠幫助實現遷移前后的系統性能趨于一致:
進行一番測試后,XtraDB集群的各項指標令人滿意,我們接下來開始著手進行實際切換。
首先把所有測試環境下的配置進行備份。因為一旦cluster出現宕機,我們可以快速恢復其至一個單一節點cluster。我們編寫了具體的操作程序以及進行了相關壓力測試。
在對現有系統的兩個DRBD服務器進行從屬服務器設置后,我們還設置了其余服務器的從屬設置(例如:災難恢復,備份等)。一切就緒后,我們執行了一次常規的從屬升級操作把系統切換到新環境中。
切換前后的架構變化如下圖所示:
切換后的優點分析
對正在運行的cluster進行重啟和更新時,成功避免了之前造成的通信中斷影響。成功以TOI模式(pt-online-schema-change)進行模式變更。寫入沖突處理能力得到優化提升。當發現一個沖突后,XtraDB Cluster會返回一個死鎖錯誤信息,在以TOI模式執行DDL語句時同樣可觸發該錯誤信息返回。之后,沖突錯誤會導致應用程序服務器返回一個503錯誤,而我們的負載平衡層設置會捕獲該錯誤,隨后會嘗試在另外的服務器上重新遞交寫入請求。切換后的缺點分析
部分cluster的關鍵狀態計數器是按狀態改變的,例如在執行顯示全局狀態指令后(SHOW GLOBAL STATUS),其值會重設為0。這樣會造成很難根據計數器來進行重要的狀態監控,例如流控制,因為其值的頻繁變更會造成無法準確監控系統的狀態(在使用XtraDB Cluster 5.6的Galera 3.x系統中,該問題已得到解決)。當一寫入操作沖突發生時,MySQL動態記錄適配器會忽略來自交互語句拋出的異常。英文出自: Highscalability