廖琴 文成玉
摘 要:文章分析了MYSQL數(shù)據(jù)庫(kù)高可用性的需求和實(shí)現(xiàn)方案,介紹了同步復(fù)制的工作原理、故障自動(dòng)切換的原理與實(shí)現(xiàn),并用keepalived,來(lái)實(shí)現(xiàn)虛擬IP的漂移,使服務(wù)器在故障切換時(shí)不用更改IP,來(lái)減少管理員的工作。
關(guān)鍵詞:同步復(fù)制;自動(dòng)切換;keepalived
數(shù)據(jù)庫(kù)是現(xiàn)代企業(yè)的應(yīng)用核心,它存儲(chǔ)了組織機(jī)構(gòu)中的重要信息,例如訂單信息、客戶信息、產(chǎn)品信息等等。另外,組織機(jī)構(gòu)的關(guān)鍵業(yè)務(wù)應(yīng)用的運(yùn)行還依賴于數(shù)據(jù)庫(kù)。這時(shí)數(shù)據(jù)庫(kù)的高可用性是需要考慮的事情。構(gòu)建一個(gè)具有高可用性的IT基礎(chǔ)架構(gòu),對(duì)一個(gè)對(duì)于一個(gè)希望取得成功的企業(yè)來(lái)說(shuō)是至關(guān)重要的。
1 同步復(fù)制
MySQL的主從同步復(fù)制時(shí)基于主服務(wù)器中的二進(jìn)制日志中記錄所有對(duì)數(shù)據(jù)庫(kù)的操作(包括創(chuàng)建、刪除、更新等等)。而每個(gè)從服務(wù)器從主服務(wù)器中接受其已經(jīng)記錄到的二進(jìn)制日子的保存的更新,從而使得從服務(wù)器可以對(duì)主服務(wù)器的數(shù)據(jù)拷貝來(lái)執(zhí)行相同的更新。然后封鎖并等待主服務(wù)器通知新的更新,從服務(wù)器在執(zhí)行備份時(shí)不會(huì)干擾主服務(wù)器跟蹤對(duì)數(shù)據(jù)庫(kù)的操作,在備份過(guò)程中主服務(wù)器依然可以繼續(xù)處理更新。
2 故障自動(dòng)切換
當(dāng)主服務(wù)器發(fā)生宕機(jī)時(shí),為了避免系統(tǒng)出現(xiàn)錯(cuò)誤,MySQL數(shù)據(jù)庫(kù)要實(shí)現(xiàn)故障自動(dòng)切換。本文介紹的故障切換方案為MHA[ 1 ]。MHA是一位日本人用Perl寫(xiě)的一套關(guān)于MySQL的故障切換方案,來(lái)保證數(shù)據(jù)庫(kù)的高可用性。在主服務(wù)器宕機(jī)時(shí),MHA能夠在較短時(shí)間內(nèi)實(shí)現(xiàn)自動(dòng)故障檢測(cè)和故障切換。通常在10-30秒以內(nèi),能夠很好地解決在復(fù)制過(guò)程中數(shù)據(jù)一致性的問(wèn)題。由于不需要在現(xiàn)有的replication中添加額外的服務(wù)器,僅需要一個(gè)manager節(jié)點(diǎn),而一個(gè)Manager能管理多套復(fù)制,所以能大大地節(jié)約服務(wù)器的數(shù)量;另外,安裝簡(jiǎn)單,無(wú)性能損耗,以及不需要修改現(xiàn)有的復(fù)制部署也是它的優(yōu)勢(shì)之處。MHA除了能實(shí)現(xiàn)自動(dòng)故障檢測(cè)和切換外,還可以被定義成交互式(手動(dòng))故障切換、非交互式故障切換和在線切換Master到不同主機(jī)。
3 keepalived
利用虛擬路由冗余協(xié)議(vrrp)技術(shù)[ 2 ],實(shí)現(xiàn)LVS(Linux Virtual Server)和HA(High Aviailabitity)。VRRP(Virtual Router Redundancy Protocol,虛擬路由冗余協(xié)議)是一種容錯(cuò)協(xié)議,這個(gè)協(xié)議內(nèi)的所有路由分為主備,平時(shí)數(shù)據(jù)都是由主節(jié)點(diǎn)的IP接口接收轉(zhuǎn)發(fā),一旦主節(jié)點(diǎn)故障,就自動(dòng)啟動(dòng)備用節(jié)點(diǎn),奪取主節(jié)點(diǎn)的IP,接管主節(jié)點(diǎn)的所有轉(zhuǎn)發(fā)工作。本文主要介紹HA(高可用性)的應(yīng)用。Keepalive的設(shè)計(jì)結(jié)構(gòu)[ 3 ]如圖1所示。
有圖可知,兩個(gè)子進(jìn)程都被系統(tǒng)WatchDog看管,兩個(gè)子進(jìn)程各自復(fù)雜自己的事,healthchecker子進(jìn)程復(fù)雜檢查各自服務(wù)器的健康程度,例如HTTP,LVS等等,如果healthchecker子進(jìn)程檢查到MASTER上服務(wù)不可用了,就會(huì)通知本機(jī)上的兄弟VRRP子進(jìn)程,讓他刪除通告,并且去掉虛擬IP,轉(zhuǎn)換為BACKUP狀。
4 應(yīng)用與實(shí)現(xiàn)
為了實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的高可用性,采用了在主從同步復(fù)制的框架下,用MHA實(shí)現(xiàn)故障自動(dòng)切換并用keepalived實(shí)現(xiàn)虛擬IP的漂移。主服務(wù)器宕機(jī)后,其二進(jìn)制日志被從服務(wù)器接受,此時(shí)會(huì)選中應(yīng)用二進(jìn)制日志最全的一臺(tái)從服務(wù)器作為新的主服務(wù)器。但是主服務(wù)器上還有幾條記錄還沒(méi)有同步到二進(jìn)制日志中,所以從服務(wù)器也沒(méi)有接收到這個(gè)事件,如果發(fā)生切換,將會(huì)丟失這個(gè)事件。但是如果切換發(fā)生在主從同步復(fù)制的框架下,極大的減少了此類的風(fēng)險(xiǎn)。
Keepalived將檢測(cè)到服務(wù)器的狀態(tài),如果有一臺(tái)服務(wù)器出現(xiàn)故障時(shí),keepalived將被檢測(cè)到并發(fā)出警告給指定的郵箱。設(shè)置一個(gè)虛擬的IP地址,在切換時(shí),keepalived實(shí)現(xiàn)這個(gè)虛擬IP的漂移,這樣大大的減少了管理人員的工作。因?yàn)閗eepalived非常輕量級(jí),速度非???,配置簡(jiǎn)單,所以受到眾多企業(yè)運(yùn)維人員青睞。
針對(duì)上文提到的高可用性需求,搭建并測(cè)試,結(jié)果如下表所示:
5 結(jié)論
經(jīng)過(guò)多年的發(fā)展,MySQL作為一款開(kāi)源軟件,已經(jīng)形成了很多套的高可用性方案。根據(jù)不同拓?fù)洵h(huán)境和要求下,做出相應(yīng)的改變,來(lái)解決一些實(shí)際的問(wèn)題。本文在故障切換的需求下,通過(guò)同步復(fù)制、MHA和keepalived實(shí)現(xiàn)了預(yù)期的目標(biāo)。
參考文獻(xiàn):
[1] MHA官方文檔翻譯,2014.
[2] 錢(qián)景輝,廖鋰.基于keepalived的動(dòng)態(tài)浮動(dòng)IP集群實(shí)現(xiàn)[J].化工自動(dòng)化及儀表,2012,39(7):926-928.
[3] Keepalived原理與實(shí)戰(zhàn)精講,2011.