五大常見的MySQL高可用方案

1. 概述

我們?cè)诳紤]MySQL數(shù)據(jù)庫(kù)的高可用的架構(gòu)時(shí)狱庇,主要要考慮如下幾方面:

如果數(shù)據(jù)庫(kù)發(fā)生了宕機(jī)或者意外中斷等故障塘娶,能盡快恢復(fù)數(shù)據(jù)庫(kù)的可用性约巷,盡可能的減少停機(jī)時(shí)間,保證業(yè)務(wù)不會(huì)因?yàn)閿?shù)據(jù)庫(kù)的故障而中斷司训。

用作備份构捡、只讀副本等功能的非主節(jié)點(diǎn)的數(shù)據(jù)應(yīng)該和主節(jié)點(diǎn)的數(shù)據(jù)實(shí)時(shí)或者最終保持一致。

當(dāng)業(yè)務(wù)發(fā)生數(shù)據(jù)庫(kù)切換時(shí)壳猜,切換前后的數(shù)據(jù)庫(kù)內(nèi)容應(yīng)當(dāng)一致勾徽,不會(huì)因?yàn)閿?shù)據(jù)缺失或者數(shù)據(jù)不一致而影響業(yè)務(wù)。

關(guān)于對(duì)高可用的分級(jí)在這里我們不做詳細(xì)的討論统扳,這里只討論常用高可用方案的優(yōu)缺點(diǎn)以及高可用方案的選型捂蕴。

2. 高可用方案

2.1. 主從或主主半同步復(fù)制

使用雙節(jié)點(diǎn)數(shù)據(jù)庫(kù),搭建單向或者雙向的半同步復(fù)制闪幽。在5.7以后的版本中啥辨,由于lossless replication、logical多線程復(fù)制等一些列新特性的引入盯腌,使得MySQL原生半同步復(fù)制更加可靠溉知。

常見架構(gòu)如下:

通常會(huì)和proxy、keepalived等第三方軟件同時(shí)使用腕够,即可以用來(lái)監(jiān)控?cái)?shù)據(jù)庫(kù)的健康级乍,又可以執(zhí)行一系列管理命令。如果主庫(kù)發(fā)生故障帚湘,切換到備庫(kù)后仍然可以繼續(xù)使用數(shù)據(jù)庫(kù)玫荣。

優(yōu)點(diǎn):

架構(gòu)比較簡(jiǎn)單,使用原生半同步復(fù)制作為數(shù)據(jù)同步的依據(jù)大诸;

雙節(jié)點(diǎn)捅厂,沒(méi)有主機(jī)宕機(jī)后的選主問(wèn)題,直接切換即可资柔;

雙節(jié)點(diǎn)焙贷,需求資源少,部署簡(jiǎn)單贿堰;

缺點(diǎn):

完全依賴于半同步復(fù)制辙芍,如果半同步復(fù)制退化為異步復(fù)制,數(shù)據(jù)一致性無(wú)法得到保證;

需要額外考慮haproxy故硅、keepalived的高可用機(jī)制庶灿。

2.2. 半同步復(fù)制優(yōu)化

半同步復(fù)制機(jī)制是可靠的。如果半同步復(fù)制一直是生效的吃衅,那么便可以認(rèn)為數(shù)據(jù)是一致的往踢。但是由于網(wǎng)絡(luò)波動(dòng)等一些客觀原因,導(dǎo)致半同步復(fù)制發(fā)生超時(shí)而切換為異步復(fù)制捐晶,那么這時(shí)便不能保證數(shù)據(jù)的一致性菲语。所以盡可能的保證半同步復(fù)制妄辩,便可提高數(shù)據(jù)的一致性惑灵。

該方案同樣使用雙節(jié)點(diǎn)架構(gòu),但是在原有半同復(fù)制的基礎(chǔ)上做了功能上的優(yōu)化眼耀,使半同步復(fù)制的機(jī)制變得更加可靠英支。

可參考的優(yōu)化方案如下:


2.2.1. 雙通道復(fù)制

半同步復(fù)制由于發(fā)生超時(shí)后,復(fù)制斷開哮伟,當(dāng)再次建立起復(fù)制時(shí)干花,同時(shí)建立兩條通道,其中一條半同步復(fù)制通道從當(dāng)前位置開始復(fù)制楞黄,保證從機(jī)知道當(dāng)前主機(jī)執(zhí)行的進(jìn)度池凄。另外一條異步復(fù)制通道開始追補(bǔ)從機(jī)落后的數(shù)據(jù)。當(dāng)異步復(fù)制通道追趕到半同步復(fù)制的起始位置時(shí)鬼廓,恢復(fù)半同步復(fù)制肿仑。


2.2.2. binlog文件服務(wù)器

搭建兩條半同步復(fù)制通道,其中連接文件服務(wù)器的半同步通道正常情況下不啟用碎税,當(dāng)主從的半同步復(fù)制發(fā)生網(wǎng)絡(luò)問(wèn)題退化后尤慰,啟動(dòng)與文件服務(wù)器的半同步復(fù)制通道。當(dāng)主從半同步復(fù)制恢復(fù)后雷蹂,關(guān)閉與文件服務(wù)器的半同步復(fù)制通道伟端。

優(yōu)點(diǎn):

雙節(jié)點(diǎn),需求資源少匪煌,部署簡(jiǎn)單责蝠;

架構(gòu)簡(jiǎn)單,沒(méi)有選主的問(wèn)題萎庭,直接切換即可;

相比于原生復(fù)制玛歌,優(yōu)化后的半同步復(fù)制更能保證數(shù)據(jù)的一致性。

缺點(diǎn):

需要修改內(nèi)核源碼或者使用mysql通信協(xié)議擎椰。需要對(duì)源碼有一定的了解支子,并能做一定程度的二次開發(fā)。

依舊依賴于半同步復(fù)制达舒,沒(méi)有從根本上解決數(shù)據(jù)一致性問(wèn)題值朋。

2.3. 高可用架構(gòu)優(yōu)化

將雙節(jié)點(diǎn)數(shù)據(jù)庫(kù)擴(kuò)展到多節(jié)點(diǎn)數(shù)據(jù)庫(kù)叹侄,或者多節(jié)點(diǎn)數(shù)據(jù)庫(kù)集群∽虻牵可以根據(jù)自己的需要選擇一主兩從趾代、一主多從或者多主多從的集群。

由于半同步復(fù)制丰辣,存在接收到一個(gè)從機(jī)的成功應(yīng)答即認(rèn)為半同步復(fù)制成功的特性撒强,所以多從半同步復(fù)制的可靠性要優(yōu)于單從半同步復(fù)制的可靠性。并且多節(jié)點(diǎn)同時(shí)宕機(jī)的幾率也要小于單節(jié)點(diǎn)宕機(jī)的幾率笙什,所以多節(jié)點(diǎn)架構(gòu)在一定程度上可以認(rèn)為高可用性是好于雙節(jié)點(diǎn)架構(gòu)飘哨。

但是由于數(shù)據(jù)庫(kù)數(shù)量較多,所以需要數(shù)據(jù)庫(kù)管理軟件來(lái)保證數(shù)據(jù)庫(kù)的可維護(hù)性琐凭⊙柯。可以選擇MMM、MHA或者各個(gè)版本的proxy等等统屈。常見方案如下:


2.3.1. MHA+多節(jié)點(diǎn)集群

MHA Manager會(huì)定時(shí)探測(cè)集群中的master節(jié)點(diǎn)胚吁,當(dāng)master出現(xiàn)故障時(shí),它可以自動(dòng)將最新數(shù)據(jù)的slave提升為新的master愁憔,然后將所有其他的slave重新指向新的master腕扶,整個(gè)故障轉(zhuǎn)移過(guò)程對(duì)應(yīng)用程序完全透明。

MHA Node運(yùn)行在每臺(tái)MySQL服務(wù)器上吨掌,主要作用是切換時(shí)處理二進(jìn)制日志半抱,確保切換盡量少丟數(shù)據(jù)。

MHA也可以擴(kuò)展到如下的多節(jié)點(diǎn)集群:

優(yōu)點(diǎn):

可以進(jìn)行故障的自動(dòng)檢測(cè)和轉(zhuǎn)移;

可擴(kuò)展性較好思犁,可以根據(jù)需要擴(kuò)展MySQL的節(jié)點(diǎn)數(shù)量和結(jié)構(gòu);

相比于雙節(jié)點(diǎn)的MySQL復(fù)制代虾,三節(jié)點(diǎn)/多節(jié)點(diǎn)的MySQL發(fā)生不可用的概率更低

缺點(diǎn):

至少需要三節(jié)點(diǎn),相對(duì)于雙節(jié)點(diǎn)需要更多的資源;

邏輯較為復(fù)雜激蹲,發(fā)生故障后排查問(wèn)題棉磨,定位問(wèn)題更加困難;

數(shù)據(jù)一致性仍然靠原生半同步復(fù)制保證,仍然存在數(shù)據(jù)不一致的風(fēng)險(xiǎn);

可能因?yàn)榫W(wǎng)絡(luò)分區(qū)發(fā)生腦裂現(xiàn)象;

2.3.2. zookeeper+proxy

Zookeeper使用分布式算法保證集群數(shù)據(jù)的一致性学辱,使用zookeeper可以有效的保證proxy的高可用性乘瓤,可以較好的避免網(wǎng)絡(luò)分區(qū)現(xiàn)象的產(chǎn)生。

優(yōu)點(diǎn):

較好的保證了整個(gè)系統(tǒng)的高可用性策泣,包括proxy衙傀、MySQL;

擴(kuò)展性較好,可以擴(kuò)展為大規(guī)模集群;

缺點(diǎn):

數(shù)據(jù)一致性仍然依賴于原生的mysql半同步復(fù)制;

引入zk萨咕,整個(gè)系統(tǒng)的邏輯變得更加復(fù)雜;

2.4. 共享存儲(chǔ)

共享存儲(chǔ)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)服務(wù)器和存儲(chǔ)設(shè)備的解耦统抬,不同數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步不再依賴于MySQL的原生復(fù)制功能,而是通過(guò)磁盤數(shù)據(jù)同步的手段,來(lái)保證數(shù)據(jù)的一致性聪建。

2.4.1. SAN共享儲(chǔ)存

SAN的概念是允許存儲(chǔ)設(shè)備和處理器(服務(wù)器)之間建立直接的高速網(wǎng)絡(luò)(與LAN相比)連接钙畔,通過(guò)這種連接實(shí)現(xiàn)數(shù)據(jù)的集中式存儲(chǔ)。常用架構(gòu)如下:

使用共享存儲(chǔ)時(shí)金麸,MySQL服務(wù)器能夠正常掛載文件系統(tǒng)并操作擎析,如果主庫(kù)發(fā)生宕機(jī),備庫(kù)可以掛載相同的文件系統(tǒng)挥下,保證主庫(kù)和備庫(kù)使用相同的數(shù)據(jù)揍魂。

優(yōu)點(diǎn):

兩節(jié)點(diǎn)即可,部署簡(jiǎn)單棚瘟,切換邏輯簡(jiǎn)單现斋;

很好的保證數(shù)據(jù)的強(qiáng)一致性;

不會(huì)因?yàn)镸ySQL的邏輯錯(cuò)誤發(fā)生數(shù)據(jù)不一致的情況解取;

缺點(diǎn):

需要考慮共享存儲(chǔ)的高可用步责;

價(jià)格昂貴返顺;

2.4.2. DRBD磁盤復(fù)制

DRBD是一種基于軟件禀苦、基于網(wǎng)絡(luò)的塊復(fù)制存儲(chǔ)解決方案,主要用于對(duì)服務(wù)器之間的磁盤遂鹊、分區(qū)振乏、邏輯卷等進(jìn)行數(shù)據(jù)鏡像,當(dāng)用戶將數(shù)據(jù)寫入本地磁盤時(shí)秉扑,還會(huì)將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中另一臺(tái)主機(jī)的磁盤上慧邮,這樣的本地主機(jī)(主節(jié)點(diǎn))與遠(yuǎn)程主機(jī)(備節(jié)點(diǎn))的數(shù)據(jù)就可以保證實(shí)時(shí)同步。常用架構(gòu)如下:

當(dāng)本地主機(jī)出現(xiàn)問(wèn)題舟陆,遠(yuǎn)程主機(jī)上還保留著一份相同的數(shù)據(jù)误澳,可以繼續(xù)使用,保證了數(shù)據(jù)的安全秦躯。

DRBD是linux內(nèi)核模塊實(shí)現(xiàn)的快級(jí)別的同步復(fù)制技術(shù)忆谓,可以與SAN達(dá)到相同的共享存儲(chǔ)效果。

優(yōu)點(diǎn):

兩節(jié)點(diǎn)即可踱承,部署簡(jiǎn)單倡缠,切換邏輯簡(jiǎn)單;

相比于SAN儲(chǔ)存網(wǎng)絡(luò)茎活,價(jià)格低廉昙沦;

保證數(shù)據(jù)的強(qiáng)一致性;

缺點(diǎn):

對(duì)io性能影響較大载荔;

從庫(kù)不提供讀操作盾饮;

2.5. 分布式協(xié)議

分布式協(xié)議可以很好解決數(shù)據(jù)一致性問(wèn)題。比較常見的方案如下:

2.5.1. MySQL cluster

MySQL cluster是官方集群的部署方案,通過(guò)使用NDB存儲(chǔ)引擎實(shí)時(shí)備份冗余數(shù)據(jù)丘损,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的高可用性和數(shù)據(jù)一致性芍碧。

優(yōu)點(diǎn):

全部使用官方組件,不依賴于第三方軟件号俐;

可以實(shí)現(xiàn)數(shù)據(jù)的強(qiáng)一致性泌豆;

缺點(diǎn):

國(guó)內(nèi)使用的較少;

配置較復(fù)雜吏饿,需要使用NDB儲(chǔ)存引擎踪危,與MySQL常規(guī)引擎存在一定差異;

至少三節(jié)點(diǎn)猪落;

2.5.2. Galera

基于Galera的MySQL高可用集群贞远, 是多主數(shù)據(jù)同步的MySQL集群解決方案,使用簡(jiǎn)單笨忌,沒(méi)有單點(diǎn)故障蓝仲,可用性高。常見架構(gòu)如下:

優(yōu)點(diǎn):

多主寫入官疲,無(wú)延遲復(fù)制袱结,能保證數(shù)據(jù)強(qiáng)一致性;

有成熟的社區(qū)途凫,有互聯(lián)網(wǎng)公司在大規(guī)模的使用垢夹;

自動(dòng)故障轉(zhuǎn)移,自動(dòng)添加维费、剔除節(jié)點(diǎn)果元;

缺點(diǎn):

需要為原生MySQL節(jié)點(diǎn)打wsrep補(bǔ)丁

只支持innodb儲(chǔ)存引擎

至少三節(jié)點(diǎn);

2.5.3. POAXS

Paxos 算法解決的問(wèn)題是一個(gè)分布式系統(tǒng)如何就某個(gè)值(決議)達(dá)成一致犀盟。這個(gè)算法被認(rèn)為是同類算法中最有效的而晒。Paxos與MySQL相結(jié)合可以實(shí)現(xiàn)在分布式的MySQL數(shù)據(jù)的強(qiáng)一致性。常見架構(gòu)如下:

優(yōu)點(diǎn):

多主寫入阅畴,無(wú)延遲復(fù)制倡怎,能保證數(shù)據(jù)強(qiáng)一致性;

有成熟理論基礎(chǔ)恶阴;

自動(dòng)故障轉(zhuǎn)移诈胜,自動(dòng)添加、剔除節(jié)點(diǎn)冯事;

缺點(diǎn):

只支持innodb儲(chǔ)存引擎

至少三節(jié)點(diǎn)焦匈;

3. 總結(jié)

隨著人們對(duì)數(shù)據(jù)一致性的要求不斷的提高,越來(lái)越多的方法被嘗試用來(lái)解決分布式數(shù)據(jù)一致性的問(wèn)題昵仅,如MySQL自身的優(yōu)化缓熟、MySQL集群架構(gòu)的優(yōu)化累魔、Paxos、Raft够滑、2PC算法的引入等等垦写。

而使用分布式算法用來(lái)解決MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的問(wèn)題的方法,也越來(lái)越被人們所接受彰触,一系列成熟的產(chǎn)品如PhxSQL梯投、MariaDB Galera Cluster、Percona XtraDB Cluster等越來(lái)越多的被大規(guī)模使用况毅。

隨著官方MySQL Group Replication的GA分蓖,使用分布式協(xié)議來(lái)解決數(shù)據(jù)一致性問(wèn)題已經(jīng)成為了主流的方向。期望越來(lái)越多優(yōu)秀的解決方案被提出尔许,MySQL高可用問(wèn)題可以被更好的解決么鹤。


【轉(zhuǎn)載】Android開發(fā)中文站 ? 五大常見的MySQL高可用方案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市味廊,隨后出現(xiàn)的幾起案子蒸甜,更是在濱河造成了極大的恐慌,老刑警劉巖余佛,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠新,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衙熔,警方通過(guò)查閱死者的電腦和手機(jī)登颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門搅荞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)红氯,“玉大人,你說(shuō)我怎么就攤上這事咕痛×「剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵茉贡,是天一觀的道長(zhǎng)塞栅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腔丧,這世上最難降的妖魔是什么放椰? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮愉粤,結(jié)果婚禮上砾医,老公的妹妹穿的比我還像新娘。我一直安慰自己衣厘,他們只是感情好如蚜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布压恒。 她就那樣靜靜地躺著,像睡著了一般错邦。 火紅的嫁衣襯著肌膚如雪探赫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天撬呢,我揣著相機(jī)與錄音伦吠,去河邊找鬼。 笑死魂拦,一個(gè)胖子當(dāng)著我的面吹牛讨勤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晨另,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼潭千,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了借尿?” 一聲冷哼從身側(cè)響起刨晴,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路翻,沒(méi)想到半個(gè)月后狈癞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茂契,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蝶桶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉冶。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡真竖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厌小,到底是詐尸還是另有隱情恢共,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布璧亚,位于F島的核電站讨韭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏癣蟋。R本人自食惡果不足惜透硝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疯搅。 院中可真熱鬧濒生,春花似錦、人聲如沸秉撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至规阀,卻和暖如春恒序,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谁撼。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工歧胁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厉碟。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓喊巍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箍鼓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崭参,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/25960208 1. 概述 我們?cè)诳紤]MySQL...
    嚴(yán)國(guó)華閱讀 694評(píng)論 0 19
  • 概述我們?cè)诳紤]MySQL數(shù)據(jù)庫(kù)的高可用的架構(gòu)時(shí),主要要考慮如下幾方面:如果數(shù)據(jù)庫(kù)發(fā)生了宕機(jī)或者意外中斷等故障款咖,能盡...
    arickxuan閱讀 538評(píng)論 0 3
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,947評(píng)論 2 89
  • 不要打我铐殃,不要打我海洼。 你只是一只丑小鴨,還想和我們一起玩富腊,你活膩歪了吧坏逢。狠以后別來(lái)煩我們。 為什么赘被,所有人都不喜歡...
    青詭閱讀 214評(píng)論 0 1
  • 這件事情雖然已經(jīng)過(guò)去一周有余是整,但依然就像剛剛發(fā)生一樣,清晰地浮現(xiàn)在我的眼前帘腹,揮之不去贰盗。 今天,又是一個(gè)寒風(fēng)...
    杏林煮酒閱讀 419評(píng)論 1 4