溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL高可用方案的一些思考

發(fā)布時(shí)間:2020-08-10 13:25:10 來(lái)源:ITPUB博客 閱讀:216 作者:jeanron100 欄目:MySQL數(shù)據(jù)庫(kù)

我在去年QCon和Gdevops廣州站的時(shí)候,講到MySQL和Oracle的現(xiàn)狀和發(fā)展時(shí),簡(jiǎn)單總結(jié)了下一個(gè)常見(jiàn)的使用誤區(qū):把MySQL當(dāng)Oracle用,或者把Oracle當(dāng)做MySQL用。

在我們身邊這種情況太多,以至于很多重度依賴Oracle的人覺(jué)得MySQL太弱,MySQL的人覺(jué)得Oracle的方案擴(kuò)展性不夠好。其實(shí)可以從幾個(gè)維度來(lái)看,我們今天就著重從MySQL的一些技術(shù)點(diǎn)來(lái)說(shuō)起吧。

MySQL的高可用其實(shí)如果延展開(kāi)來(lái),可以從三個(gè)維度來(lái)考慮,應(yīng)用層,數(shù)據(jù)庫(kù)層,系統(tǒng)層(包含網(wǎng)絡(luò)層)。假設(shè)數(shù)據(jù)庫(kù)層面已經(jīng)能夠做到最好了,數(shù)據(jù)層面可以保持?jǐn)?shù)據(jù)業(yè)務(wù)的訪問(wèn),從網(wǎng)絡(luò)層面來(lái)說(shuō),我們需要DNS的支持能夠滿足兩個(gè)層面的高可用,一個(gè)是同城機(jī)房(或者同機(jī)房)的DNS高可用,另外一個(gè)是跨機(jī)房(跨區(qū)域)的DNS高可用,從數(shù)據(jù)庫(kù)的業(yè)務(wù)訴求和網(wǎng)絡(luò)規(guī)劃來(lái)說(shuō),使用的DNS是不對(duì)外服務(wù)的,所以可以理解是local DNS的角色,這樣一來(lái),我們都不需要刻意去維護(hù)VIP的切換,網(wǎng)絡(luò)層或者中間件層足夠強(qiáng)大,我們只需要格外關(guān)注數(shù)據(jù)庫(kù)服務(wù)的可用性和數(shù)據(jù)一致性就可以了。

如果往上層來(lái)看,就是應(yīng)用層面,其實(shí)應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)使用域名,他壓根不需要知道對(duì)應(yīng)的IP是什么,就跟我們?cè)L問(wèn)谷歌只需要知道是google.com就可以了。如果有了網(wǎng)絡(luò)層面的高可用,保證一個(gè)DNS的生效策略,比如10秒,1分鐘等,那么應(yīng)用層需要的改造就是短連接或者是應(yīng)用重連機(jī)制,因?yàn)楹翢o(wú)疑問(wèn)程序端會(huì)有一層緩存,長(zhǎng)連接很容易出現(xiàn)“迷失在過(guò)去狀態(tài)”的情況。

所以一個(gè)較為完整的方案應(yīng)該是系統(tǒng)層,網(wǎng)絡(luò)層,數(shù)據(jù)庫(kù)層和應(yīng)用層來(lái)共同配合,才能保證一個(gè)基本的高可用方案。

如果要實(shí)現(xiàn)更為復(fù)雜的高可用,比如已經(jīng)不局限于容災(zāi),做雙活多活等,其實(shí)整個(gè)架構(gòu)的復(fù)雜度會(huì)高很多。

我就拋磚引玉,來(lái)說(shuō)說(shuō)MySQL高可用方案的一些想法。

大家知道MHA是MySQL DBA非常喜歡用的高可用方案,因?yàn)榇_實(shí)非常經(jīng)典,我看了下代碼的實(shí)現(xiàn),邏輯的部分是非常的完善的,很多我們沒(méi)有考慮到的點(diǎn)在代碼層都做了校驗(yàn)。所以說(shuō)MHA是一個(gè)非常成熟的方案,在大家的各種應(yīng)用場(chǎng)景中發(fā)展壯大起來(lái)了。如果是早一些的版本使用MHA就是一個(gè)標(biāo)準(zhǔn)動(dòng)作,大家知道MHA后期也有一些變化,一個(gè)是自0.56的版本開(kāi)始引入了binlog server,在這個(gè)基礎(chǔ)上有了0.57的版本,之后在github上就沒(méi)有了版本更新。如果大家細(xì)細(xì)看看0.56和0.57的改進(jìn),主要的改動(dòng)就是在數(shù)據(jù)完整性上的一個(gè)補(bǔ)充,當(dāng)然這種架構(gòu)方式對(duì)已有的快捷恢復(fù)來(lái)說(shuō)會(huì)有一定的侵入性。所以我們很多公司用MHA,其實(shí)還是沒(méi)有用binlog server的。MHA還有一個(gè)比較特別的地方就是對(duì)于網(wǎng)絡(luò)異常的處理,其實(shí)0.56和0.57是有一些差別的,當(dāng)然在細(xì)節(jié)測(cè)試的時(shí)候,其實(shí)碰到有些異常情況比較糾結(jié),好像怎么解釋都可以,所以以0.56和0.57為分水嶺,對(duì)于網(wǎng)絡(luò)的處理的差異來(lái)看,我是更傾向于0.56版本的,所以我們迭代測(cè)試了0.56,0.57然后又折回來(lái)補(bǔ)充了0.56的場(chǎng)景。

當(dāng)然這個(gè)過(guò)程的收獲是比較大的,也妝模作樣的看了下MHA的一些代碼,理了一下思路。但是我發(fā)現(xiàn)一個(gè)問(wèn)題,相信很多朋友都有類(lèi)似的感覺(jué),那就是MHA是perl寫(xiě)的,實(shí)在是讓很多人感到非常的陌生和別扭,因?yàn)閜erl語(yǔ)言本身的群體和易讀性上是存在一些落差的,所以我們其實(shí)更傾向于用Python來(lái)實(shí)現(xiàn)這個(gè)事情,當(dāng)然用其他的語(yǔ)言也可以,至少群體要大一些。

其實(shí)我在調(diào)研MHA的細(xì)節(jié)時(shí),是打算在年后做MHA的代碼python化工作的,但是我理了下自己的思路,發(fā)現(xiàn)這個(gè)事情其實(shí)做起來(lái)很有技術(shù)價(jià)值,但是投入和付出的成本落差是很大的,一來(lái)改造的難度很大,我得把Perl搞明白,然后用Python重寫(xiě)一遍或者理解了原來(lái)的邏輯,整理出缺點(diǎn)來(lái),重新構(gòu)建,我想了比較多的細(xì)節(jié),對(duì)于MHA的缺點(diǎn)等等,這是技術(shù)上的投入,很大,而且很有難度,對(duì)個(gè)人成長(zhǎng)是大有幫助的,但是從另外三個(gè)角度來(lái)說(shuō),我覺(jué)得可能實(shí)踐意義不是很大了,第一是目前的技術(shù)方案MHA其實(shí)已經(jīng)沒(méi)有明顯的優(yōu)勢(shì)了,第二我改造的版本如果足夠好,公司內(nèi)怎么推行,如果跑起來(lái)一直不出問(wèn)題,那么實(shí)踐意義其實(shí)不夠大;第三我推廣到社區(qū)里,大家是否能夠接受,因?yàn)槲颐鎸?duì)的不是很多年前的一個(gè)狀態(tài),如何保證我寫(xiě)的足夠好,或者說(shuō)寫(xiě)正確了,這不是個(gè)拍腦袋的問(wèn)題,一定是大量的細(xì)致測(cè)試才有說(shuō)服力。

所以很多大公司其實(shí)在很早之前就把這個(gè)事情做了,當(dāng)然可能只是不對(duì)外而已。當(dāng)然對(duì)于MySQL的高可用,雙活方案其實(shí)一直以來(lái)大家都有很多的解決方案,或者看起來(lái)行得通的經(jīng)驗(yàn)。

比如雙主,漏斗形的架構(gòu)設(shè)計(jì),其實(shí)在很多公司早期確實(shí)是這么干的,看起來(lái)這個(gè)方案沒(méi)有特別的難點(diǎn),但是處理這些臨界點(diǎn)的問(wèn)題的時(shí)候,還是要投入不小的功夫。這個(gè)方案我不打算多說(shuō),更多是在異常的處理上。

然后來(lái)說(shuō)說(shuō)MGR,其實(shí)完整說(shuō)來(lái),應(yīng)該是InnoDB Cluster,我非常看好這個(gè)方案,可能很多人對(duì)此比較陌生,其實(shí)最先大家熟悉的是MGR, 如果把InnoDB Cluster比作三駕馬車(chē),那么是由MySQL Shell, MySQL Router,MySQL Group Replication三個(gè)組件共同組成,其中的核心組件就是MGR了。他的基因是真正的分布式,基于paxos協(xié)議。當(dāng)然從數(shù)據(jù)架構(gòu)的角度來(lái)說(shuō),基于復(fù)制的方案,可用性和完整性是有保證的,但是性能上是要衰減的,所以MGR干脆就限制了節(jié)點(diǎn)個(gè)數(shù)。這個(gè)和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的節(jié)點(diǎn)的概念就不同了。

如果你留意下Windows安裝版本的話,你會(huì)發(fā)現(xiàn)InnoDB Cluster已經(jīng)打包成為了默認(rèn)的安裝服務(wù)了,里面提供了全面的安裝配置過(guò)程,可以參考如下的鏈接:

一種快速安裝InnoDB Cluster的方法

有很多人說(shuō)InnoDB Cluster的方案要落入生產(chǎn)實(shí)踐還有待考驗(yàn),這個(gè)絕對(duì)沒(méi)錯(cuò),但是從方向上來(lái)說(shuō),他已經(jīng)對(duì)早期的方案是一個(gè)很好的補(bǔ)充和改進(jìn)了。他的三大組件,其實(shí)MySQL Router目前是一個(gè)短板,但是一旦這個(gè)短板不成為瓶頸,有了sharding等功能,那對(duì)于MySQL開(kāi)源社區(qū)的影響是深遠(yuǎn)的。所以方案可以改進(jìn),就如同技術(shù)發(fā)展一樣。我贊同那句話,沒(méi)有最好的方案,只有最合適的方案。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI