MySQL InnoDB Cluster 詳解

導(dǎo)讀
本文轉(zhuǎn)載自MySQL解決方案工程師
作者:徐鐵韜
這篇文章將詳細(xì)地介紹MySQL的高可用解決方案—— MySQL InnoDB Cluster暖混。

說到高可用性轮洋,首先要了解一下什么是高可用性硼被?

image

高可用性要求的實(shí)際上是對可靠性的要求食棕,從本質(zhì)上來說呐萌,是通過技術(shù)和工具來提高可靠性馁痴,盡可能長時間保持?jǐn)?shù)據(jù)的可用和系統(tǒng)的正常運(yùn)行時間。實(shí)現(xiàn)高可用性的原則為排除單點(diǎn)故障肺孤、通過冗余實(shí)現(xiàn)快速恢復(fù)罗晕,并且具有容錯機(jī)制。

image

上面一頁主要介紹了幾個關(guān)鍵詞匯赠堵,以及相關(guān)的定義小渊,這些有助于理解可靠性和高可用性。

image

MySQL的高可用性解決方案目前大致分為5種茫叭,按照高可用的級別(99.9999%為最高級)排序依次為酬屉,主從復(fù)制、具有自動故障轉(zhuǎn)移功能的主從復(fù)制揍愁、利用共享存儲梆惯、OS或虛擬化軟件實(shí)現(xiàn)主備架構(gòu)、MySQL Group Replication 群組復(fù)制吗垮,以及MySQL NDB Cluster垛吗。

  • MySQL Replication:允許數(shù)據(jù)從一臺實(shí)例上復(fù)制到一臺或多臺其它的實(shí)例上。

  • MySQL Group Replication:群組復(fù)制提供更好的冗余性烁登、自動恢復(fù)以及寫入擴(kuò)展怯屉。

  • MySQL InnoDB Cluster:基于群組復(fù)制,提供了易于管理的API饵沧、應(yīng)用故障轉(zhuǎn)移和路由锨络、易于配置,提供比群組復(fù)制更高級別的可用性狼牺。

  • MySQL NDB Cluster:容易與MySQL InnoDB Cluster混淆羡儿,是另外一款產(chǎn)品,提供更高級別的可用性和冗余性是钥。適用于分布式計算環(huán)境掠归,使用內(nèi)存型的NDB存儲引擎。關(guān)于這款產(chǎn)品的詳細(xì)內(nèi)容將不會在這里介紹悄泥。

image

在這里簡明介紹一下以復(fù)制為基礎(chǔ)的三種方案的基本原理虏冻。

  • 經(jīng)典的主從復(fù)制是MySQL原生的復(fù)制功能,采用異步方式弹囚,如圖片最上面顯示的原理厨相,主服務(wù)器執(zhí)行更改數(shù)據(jù)的事務(wù)后,會產(chǎn)生binlog,之后binlog會被發(fā)送到從服務(wù)器變成relay log蛮穿,與此同時庶骄,主服務(wù)器會對應(yīng)用提交返回。從服務(wù)器接收到relay log后践磅,會通過一個applier的線程對日志里面的內(nèi)容進(jìn)行施放瓢姻,使產(chǎn)生的數(shù)據(jù)更改寫入從服務(wù)器,之后產(chǎn)生自己的binlog音诈,進(jìn)行提交幻碱。

  • 采用異步的方式,在發(fā)生網(wǎng)絡(luò)問題和服務(wù)器損壞的情況下(從服務(wù)器未接收到日志细溅,主服務(wù)器已經(jīng)提交褥傍,并且提交后主服務(wù)器徹底損壞)會丟失數(shù)據(jù),為了防止數(shù)據(jù)丟失喇聊,半同步復(fù)制在異步的基礎(chǔ)上增加了一個日志確認(rèn)的環(huán)節(jié)恍风,在從服務(wù)器接收到日志后,返回給主服務(wù)器一個應(yīng)答誓篱,之后主服務(wù)器才能對應(yīng)用提交返回朋贬。

  • 作為MySQL目前最新的復(fù)制方式,群組復(fù)制MGR可以通過群組內(nèi)任意服務(wù)器對數(shù)據(jù)進(jìn)行更新窜骄,而不是像前面兩種有主從之分锦募。為此群組復(fù)制增加了一個驗(yàn)證步驟,通過驗(yàn)證的事務(wù)才能進(jìn)行提交邻遏,提交后群組內(nèi)其它成員同樣對日志進(jìn)行施放糠亩,提交。

image

MySQL InnoDB Cluster是一個高可用的框架准验,它由下面這幾個組件構(gòu)成:

  • MySQL Group Replication:提供DB的擴(kuò)展赎线、自動故障轉(zhuǎn)移

  • MySQL Router:輕量級中間件,提供應(yīng)用程序連接目標(biāo)的故障轉(zhuǎn)移

  • MySQL Shell:新的MySQL客戶端糊饱,多種接口模式垂寥。可以設(shè)置群組復(fù)制及Router

  • X DevAPI:一個API通過XProtocol與服務(wù)器通信

  • Admin API:一個特殊的API通過MySQL Shell使用另锋,可以用于對Innodb Cluster進(jìn)行配置管理

image

上圖顯示了InnoDB Cluster的整體架構(gòu)滞项,MySQL Router推薦部署在應(yīng)用端,通過MySQL Shell 對其進(jìn)行管理配置砰蠢,使用MySQL Enterprise Monitor對整體進(jìn)行監(jiān)控蓖扑。

image

InnoDB Cluster目前已經(jīng)實(shí)現(xiàn)了發(fā)展路線圖的第一步——高可用性唉铜,將來的發(fā)展方向?yàn)樽詣幼x取擴(kuò)展和自動寫入擴(kuò)展台舱。最終實(shí)現(xiàn)如下圖的最終目標(biāo):

image

接下來的內(nèi)容,將詳細(xì)介紹一下MySQL Group Replication。

MGR實(shí)現(xiàn)了 Replicated Database State Machine理論竞惋,通信服務(wù)基于Paxos實(shí)現(xiàn)柜去,為MySQL5.7之后的版本提供同步復(fù)制(日志復(fù)制同步,數(shù)據(jù)施放異步)拆宛,并且支持所有的MySQL平臺嗓奢,包括Linux, Windows,Solaris, OSX, FreeBSD。

MGR提供了高可用分布式MySQL數(shù)據(jù)庫服務(wù)浑厚,它可以實(shí)現(xiàn)服務(wù)器自動故障轉(zhuǎn)移股耽,分布式容錯能力,支持多主更新的架構(gòu)钳幅,自動重配置(加入/移除節(jié)點(diǎn)物蝙,崩潰等等)并且可以自動偵測和處理沖突。

MGR適用的場景包括:

  • 彈性復(fù)制-復(fù)制架構(gòu)下敢艰,服務(wù)器的數(shù)量動態(tài)增加或縮減時诬乞,使影響降到最低。

  • 分片的高可用-用戶可以利用MGR實(shí)現(xiàn)單一分片的高可用钠导,每個分片都具有一個復(fù)制組震嫉。

  • 主從復(fù)制的替代選擇-可以使用單主模式避免發(fā)生沖突檢測,以替代傳統(tǒng)的主從復(fù)制牡属。

image

上圖是MGR的架構(gòu)票堵,里面包括:

MySQL Group Replication插件

image

GR插件負(fù)責(zé)執(zhí)行分布式內(nèi)容,偵測和處理沖突逮栅,恢復(fù)分布式集群换衬,推送事務(wù)給其它的組成員,接收其它成員的事務(wù)以及決定事務(wù)最終的結(jié)果证芭。

GCS群組通信系統(tǒng)

GCS API將通信系統(tǒng)的實(shí)現(xiàn)進(jìn)行抽象化瞳浦,并管理這個接口。通信引擎是基于Paxos開發(fā)的废士,是實(shí)現(xiàn)跨服務(wù)器的組件叫潦。

image

MGR在使用時具有兩種模式,包括:

單主模式

image

該模式下官硝,單個MySQL實(shí)例作為數(shù)據(jù)寫入的主節(jié)點(diǎn)矗蕊,其它的節(jié)點(diǎn)用于熱備。這個模式與傳統(tǒng)的主從模式相似氢架,便于現(xiàn)有系統(tǒng)進(jìn)行切換傻咖。

image

多主模式

除了上面的單主模式,群組復(fù)制還具有多主模式岖研,與單主模式的主要區(qū)別在于卿操,群組內(nèi)所有的成員都可以進(jìn)行數(shù)據(jù)寫入警检、讀取操作。

使用多主模式時害淤,由于數(shù)據(jù)的寫入可以在所有的成員節(jié)點(diǎn)上進(jìn)行扇雕,當(dāng)在不同成員上對同一條記錄同時進(jìn)行更新時,就會產(chǎn)生沖突窥摄,此時群組復(fù)制會根據(jù)成員提交的先后次序(嚴(yán)格來講是在群組復(fù)制的一致性校驗(yàn)階段镶奉,取得校驗(yàn)成功的先后次序)進(jìn)行判斷,后提交事務(wù)的執(zhí)行回滾處理崭放。

image

沖突檢測需要使用主鍵哨苛。

image

由于多主模式需要確保數(shù)據(jù)寫入的一致性,所以在使用上有如下限制:

image

當(dāng)配置好MGR以后币砂,需要對其進(jìn)行監(jiān)視和管理移国,通過perforamnce_shcema里面的表和全局變量可以確認(rèn)MGR的成員狀態(tài),當(dāng)前主成員等必要信息道伟。

image

群組復(fù)制的特性之一是提供高可用性迹缀,具有更好的容錯度。每個群組最多具有9個成員(推薦使用不超過7個蜜徽,最低使用3個祝懂。)

故障:(F)所需的服務(wù)器數(shù)量:(N)

N= 2F + 1

9成員的情況下,最多允許4個成員出現(xiàn)故障拘鞋。

image

使用MGR不會出現(xiàn)腦裂問題砚蓬,MGR會檢測網(wǎng)絡(luò)分區(qū)。

image

發(fā)生網(wǎng)絡(luò)分區(qū)時盆色,如果部分成員檢測到大多數(shù)成員丟失灰蛙,連接到這部分成員的數(shù)據(jù)更新處理將被擋住并等待,Select可以執(zhí)行隔躲。如下圖所示摩梧,S1 S2與其余三個成員失去聯(lián)系,對于S1 S2來說他們已經(jīng)丟失了群組中的大部分成員宣旱,因此不能夠在它們上面執(zhí)行數(shù)據(jù)更新處理(S3 S4 S5上面可以進(jìn)行數(shù)據(jù)更新仅父,當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,S1 S2可以從S3 S4 S5上獲取故障期間未更新的數(shù)據(jù))

image

MGR事實(shí)上也是一個分布式集群浑吟,讓我們看一下MGR是如何確保集群范圍內(nèi)的數(shù)據(jù)一致性笙纤。

MGR是通過日志的傳播和施放來進(jìn)行群組內(nèi)所有成員的數(shù)據(jù)同步,因此组力,在某一時間點(diǎn)各個成員上數(shù)據(jù)是會出現(xiàn)不一致的情況(最終會一致)省容。在MySQL8.0.14之后,可以通過使用變量 group_replication_consistency 精確地控制每個節(jié)點(diǎn)上數(shù)據(jù)的一致性燎字。

image

默認(rèn)的值為 EVENTUAL(最終一致)腥椒,如上圖所示阿宅,事務(wù)T1開始在M1上執(zhí)行,之后會將日志傳播到M2 M3寞酿,并對日志內(nèi)容進(jìn)行施放家夺。在日志內(nèi)容施放到M3之前脱柱,T2開始在M3上執(zhí)行伐弹,因此,T2沒有在最新的數(shù)據(jù)快照基礎(chǔ)上執(zhí)行榨为,如果T2與T1執(zhí)行的數(shù)據(jù)沒有關(guān)聯(lián)惨好,則可以采取該模式。

image

當(dāng)變量值設(shè)置為BEFORE時随闺,上圖中 T2使用該值日川,T2在M3上提交時,需要等待T1在全部成員上執(zhí)行完畢才可以執(zhí)行(T2要等待之前的事務(wù)BEFORE在全部成員上執(zhí)行完畢)

image

當(dāng)變量值設(shè)置為AFTER時矩乐,上圖中 T1使用該值龄句,T2在M3上提交時,需要等待T1在全部成員上執(zhí)行完畢才可以執(zhí)行(T1事務(wù)在全部成員上執(zhí)行完畢后,后面的事務(wù)(AFTER)才可以執(zhí)行)

image

如果事務(wù)執(zhí)行需要確保執(zhí)行前后都使用最新的數(shù)據(jù)快照散罕,則可以設(shè)置為BEFORE_AND_AFTER分歇。

MySQL Shell

image

接下來介紹一下MySQL Shell。Shell 是MySQL團(tuán)隊打造的一個統(tǒng)一的客戶端欧漱,它可以對MySQL執(zhí)行數(shù)據(jù)操作和管理职抡。它支持通過JavaScript,Python误甚,SQL對關(guān)系型數(shù)據(jù)模式和文檔型數(shù)據(jù)模式進(jìn)行操作缚甩。使用它可以輕松配置管理 InnoDB Cluster。

image

MySQL Shell里集成了一個特殊的管理API窑邦,可以通過它執(zhí)行DBA常見的操作擅威,后面會有一個詳細(xì)的使用例子介紹給大家。

MySQL Router

image

MySQL Router是一個輕量級的中間件冈钦,可以提供負(fù)載均衡和應(yīng)用連接的故障轉(zhuǎn)移裕寨。它是MySQL團(tuán)隊為MGR量身打造的,通過使用Router 和 Shell派继,用戶可以利用MGR實(shí)現(xiàn)完整的數(shù)據(jù)庫層的解決方案宾袜。如果您在使用MGR,請一定配合使用Router和Shell驾窟,您可以理解為它們是為MGR而生的庆猫,會配合MySQL的開發(fā)路線圖發(fā)展的工具。

InnoDB Cluster管理

讓我們看一下如何對InnoDB Cluster進(jìn)行管理绅络,我將會通過使用MySQL Shell為您展示相關(guān)內(nèi)容月培。

image

使用MySQL Shell創(chuàng)建集群

首先執(zhí)行了配置檢查嘁字,之后連接到mysql1:3306,然后執(zhí)行dba.createCluster()就可以創(chuàng)建一個集群杉畜,最后執(zhí)行cluster.addInstance()就可以將其它成員加入到集群纪蜒。使用起來是不是很簡單?

接下來是關(guān)于集群配置:

image

當(dāng)新成員加入集群時此叠,如果有缺失的事務(wù)纯续,將會進(jìn)行分布式恢復(fù)。

image

恢復(fù)時灭袁,可以采用增量恢復(fù):

image
image
image
image
image
image
image
image
image
image

增量恢復(fù)可能會需要相當(dāng)長的時間猬错,并且當(dāng)群組無法提供全部的binlog時,無法進(jìn)行恢復(fù)茸歧。

image
image

幸好我們有克隆插件倦炒!

image
image
image
image
image
image
image

那么應(yīng)該選擇使用哪種方式進(jìn)行部署呢?

增量恢復(fù):

  • 至少一個成員可以提供給新節(jié)點(diǎn)相同的已處理的事務(wù)集软瞎。

  • 新節(jié)點(diǎn)不存在異于集群的事務(wù)

增量恢復(fù)適用于:

  • 事務(wù)未被清理

  • 新節(jié)點(diǎn)不包含空的GTID集

  • 啟用GTID 和二進(jìn)制日志

image
image
image
image
image

創(chuàng)建配置集群之后逢唤,介紹一下監(jiān)控。

image
image
image
image
image
image
image

此外涤浇,Shell還提供了一個報表框架鳖藕,并且支持用戶自定義報表

image

最后,介紹一下集群的維護(hù)和故障排除芙代。

image
image
image
image
image
image
image
image

“任何可能出錯的地方都會出錯吊奢。”

默認(rèn)情況下纹烹,Shell為用戶提供了有價值的信息页滚。但是有時需要更多信息來進(jìn)行故障排除...

image
image
image

總結(jié):

  • InnoDB cluster 是MySQL內(nèi)置的高可用解決方案

  • MySQL Clone插件將InnoDB集群的可用性提升到了一個全新的高度!

  • InnoDB Cluster功能內(nèi)置了對完整實(shí)例配置的支持

  • MySQL Shell是開發(fā)人員和DBA的統(tǒng)一接口以及InnoDB Cluster的前端管理器

本文比較長铺呵,能看完的都是真愛裹驰!感謝閱讀!

感謝關(guān)注MySQL片挂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幻林,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子音念,更是在濱河造成了極大的恐慌沪饺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷愤,死亡現(xiàn)場離奇詭異整葡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讥脐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門遭居,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啼器,“玉大人,你說我怎么就攤上這事俱萍《丝牵” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵枪蘑,是天一觀的道長损谦。 經(jīng)常有香客問我,道長腥寇,這世上最難降的妖魔是什么成翩? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任觅捆,我火速辦了婚禮赦役,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栅炒。我一直安慰自己掂摔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布赢赊。 她就那樣靜靜地躺著乙漓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪释移。 梳的紋絲不亂的頭發(fā)上叭披,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音玩讳,去河邊找鬼涩蜘。 笑死,一個胖子當(dāng)著我的面吹牛熏纯,可吹牛的內(nèi)容都是我干的同诫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼樟澜,長吁一口氣:“原來是場噩夢啊……” “哼误窖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秩贰,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤霹俺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毒费,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丙唧,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年蝗罗,在試婚紗的時候發(fā)現(xiàn)自己被綠了艇棕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝌戒。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沼琉,靈堂內(nèi)的尸體忽然破棺而出北苟,到底是詐尸還是另有隱情,我是刑警寧澤打瘪,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布友鼻,位于F島的核電站,受9級特大地震影響闺骚,放射性物質(zhì)發(fā)生泄漏彩扔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一僻爽、第九天 我趴在偏房一處隱蔽的房頂上張望虫碉。 院中可真熱鬧,春花似錦胸梆、人聲如沸敦捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兢卵。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仔戈。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窃款,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓滓鸠,卻偏偏與公主長得像雁乡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糜俗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349