溫馨提示×

溫馨提示×

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

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

MySQL中常見的高可用架構(gòu)部署方案有哪些

發(fā)布時間:2023-05-06 16:24:13 來源:億速云 閱讀:259 作者:iii 欄目:開發(fā)技術(shù)

這篇“MySQL中常見的高可用架構(gòu)部署方案有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL中常見的高可用架構(gòu)部署方案有哪些”文章吧。

MySQL 中的集群部署方案

前言

這里來聊聊,MySQL 中常用的部署方案。

MySQL Replication

MySQL Replication 是官方提供的主從同步方案,用于將一個 MySQL 的實例同步到另一個實例中。Replication 為保證數(shù)據(jù)安全做了重要的保證,是目前運用最廣的 MySQL 容災(zāi)方案。Replication 用兩個或以上的實例搭建了 MySQL 主從復(fù)制集群,提供單點寫入,多點讀取的服務(wù),實現(xiàn)了讀的 scale out

MySQL中常見的高可用架構(gòu)部署方案有哪些

上面的栗子,一個主庫(M),三個從庫(S),通過 replication,Master 生成 event 的 binlog,然后發(fā)給 slave,Slave 將 event 寫入 relaylog,然后將其提交到自身數(shù)據(jù)庫中,實現(xiàn)主從數(shù)據(jù)同步。

對于數(shù)據(jù)庫之上的業(yè)務(wù)層來說,基于 MySQL 的主從復(fù)制集群,單點寫入 Master ,在 event 同步到 Slave 后,讀邏輯可以從任何一個 Slave 讀取數(shù)據(jù),以讀寫分離的方式,大大降低 Master 的運行負(fù)載,同時提升了 Slave 的資源利用。

優(yōu)點:

1、通過讀寫分離實現(xiàn)橫向擴展的能力,寫入和更新操作在源服務(wù)器上進(jìn)行,從服務(wù)器中進(jìn)行數(shù)據(jù)的讀取操作,通過增大從服務(wù)器的個數(shù),能夠極大的增強數(shù)據(jù)庫的讀取能力;

2、數(shù)據(jù)安全,因為副本可以暫停復(fù)制過程,所以可以在副本上運行備份服務(wù)而不會破壞相應(yīng)的源數(shù)據(jù);

3、方便進(jìn)行數(shù)據(jù)分析,可以在寫庫中創(chuàng)建實時數(shù)據(jù),數(shù)據(jù)的分析操作在從庫中進(jìn)行,不會影響到源數(shù)據(jù)庫的性能;

實現(xiàn)原理

在主從復(fù)制中,從庫利用主庫上的 binlog 進(jìn)行重播,實現(xiàn)主從同步,復(fù)制的過程中蛀主要使用到了 dump thread,I/O thread,sql thread 這三個線程。

IO thread: 在從庫執(zhí)行 start slave 語句時創(chuàng)建,負(fù)責(zé)連接主庫,請求 binlog,接收 binlog 并寫入 relay-log;

dump thread:用于主庫同步 binlog 給從庫,負(fù)責(zé)響應(yīng)從 IO thread 的請求。主庫會給每個從庫的連接創(chuàng)建一個 dump thread,然后同步 binlog 給從庫;

sql thread:讀取 relay log 執(zhí)行命令實現(xiàn)從庫數(shù)據(jù)的更新。

來看下復(fù)制的流程:

1、主庫收到更新命令,執(zhí)行更新操作,生成 binlog;

2、從庫在主從之間建立長連接;

3、主庫 dump_thread 從本地讀取 binlog 傳送剛給從庫;

4、從庫從主庫獲取到 binlog 后存儲到本地,成為 relay log(中繼日志);

5、sql_thread 線程讀取 relay log 解析、執(zhí)行命令更新數(shù)據(jù)。

不過 MySQL Replication 有個嚴(yán)重的缺點就是主從同步延遲。

因為數(shù)據(jù)是進(jìn)行主從同步的,那么就會遇到主從同步延遲的情況。

為什么會出現(xiàn)主從延遲?

1、從庫機器的性能比主庫差;

2、從庫的壓力大;

大量查詢放在從庫上,可能會導(dǎo)致從庫上耗費了大量的 CPU 資源,進(jìn)而影響了同步速度,造成主從延遲。

3、大事務(wù)的執(zhí)行;

有事務(wù)產(chǎn)生的時候,主庫必須要等待事務(wù)完成之后才能寫入到 binlog,假定執(zhí)行的事務(wù)是一個非常大的數(shù)據(jù)插入,這些數(shù)據(jù)傳輸?shù)綇膸?,從庫同步這些數(shù)據(jù)也需要一定的時間,就會導(dǎo)致從節(jié)點出現(xiàn)數(shù)據(jù)延遲。

4、從庫的復(fù)制能力較差;

如果從庫的復(fù)制能力,低于主庫,那么在主庫寫入壓力很大的情況下,就會造成從庫長時間數(shù)據(jù)延遲的情況出現(xiàn)。

如何解決?

1、優(yōu)化業(yè)務(wù)邏輯,避免出現(xiàn)多線程大事務(wù)的并發(fā)場景;

2、提高從庫的機器性能,減少主庫寫 binlog 和從庫讀 binlog 的效率差;

3、保證主庫和從庫的網(wǎng)絡(luò)連接,避免出現(xiàn)網(wǎng)絡(luò)延遲導(dǎo)致的 binlog 傳輸延遲;

4、強行讀主庫;

5、配合 semi-sync 半同步復(fù)制;

semi-sync 半同步復(fù)制

MySQL 有三種同步模式,分別是:

1、異步復(fù)制:MySQL 中默認(rèn)的復(fù)制是異步的,主庫在執(zhí)行完客戶端提交的事務(wù)后會立即將結(jié)果返回給客戶端,并不關(guān)心從庫是否已經(jīng)接收并且處理。存在問題就是,如果主庫的日志沒有及時同步到從庫,然后主庫宕機了,這時候執(zhí)行故障轉(zhuǎn)移,在從庫沖選主,可能會存在選出的主庫中數(shù)據(jù)不完整;

2、全同步復(fù)制:指當(dāng)主庫執(zhí)行完一個事務(wù),并且等到所有從庫也執(zhí)行完成這個事務(wù)的時候,主庫在提交事務(wù),并且返回數(shù)據(jù)給客戶端。因為要等待所有從庫都同步到主庫中的數(shù)據(jù)才返回數(shù)據(jù),所以能夠保證主從數(shù)據(jù)的一致性,但是數(shù)據(jù)庫的性能必然受到影響;

3、半同步復(fù)制:是介于全同步和全異步同步的一種,主庫至少需要等待一個從庫接收并寫入到 Relay Log 文件即可,主庫不需要等待所有從庫給主庫返回 ACK。主庫收到 ACK ,標(biāo)識這個事務(wù)完成,返回數(shù)據(jù)給客戶端。

MySQL 中默認(rèn)的復(fù)制是異步的,所以主庫和從庫的同步會存在一定的延遲,更重要的是異步復(fù)制還可能引起數(shù)據(jù)的丟失。全同步復(fù)制的性能又太差了,所以從 MySQL 5.5 開始,MySQL 以插件的形式支持 semi-sync 半同步復(fù)制。

半同步復(fù)制潛在的問題

在傳統(tǒng)的半同步復(fù)制中,主庫寫數(shù)據(jù)到 binlog,并且執(zhí)行 commit 提交事務(wù)后,會一直等待一個從庫的 ACK。從庫會在寫入 Relay Log 后,將數(shù)據(jù)落盤,然后回復(fù)給主庫 ACK,主庫收到這個 ACK 才能給客戶端事務(wù)完成的確認(rèn)。

這樣會存在問題就是,主庫已經(jīng)將該事務(wù)的 commit 存儲到了引擎層,應(yīng)用已經(jīng)可以看到數(shù)據(jù)的變化了,只是在等待從庫的返回,如果此時主庫宕機,可能從庫還沒有寫入 Relay Log,就會發(fā)生主從庫數(shù)據(jù)不一致。

為了解決這個問題,MySQL 5.7 引入了增強半同步復(fù)制。主庫寫入數(shù)據(jù)到 binlog 后,就開始等待從庫的應(yīng)答 ACK,直到至少一個從庫寫入 Relay Log 后,并將數(shù)據(jù)落盤,然后返回給主庫 ACK,通知主庫可以進(jìn)行 commit 操作,然后主庫再將事務(wù)提交到事務(wù)引擎,應(yīng)用此時才能看到數(shù)據(jù)的變化。

不過看下來增強半同步復(fù)制,在同步給從庫之后,因為自己的數(shù)據(jù)還沒有提交,然后宕機了,主庫中也是會存在數(shù)據(jù)的丟失,不過應(yīng)該想到的是,這時候主庫宕機了,是會重新在從庫中選主的,這樣新選出的主庫數(shù)據(jù)是沒有發(fā)生丟失的。

MySQL Group Replication

MySQL Group Replication 組復(fù)制,又稱為 MGR。是 Oracle MySQL 于 2016 年 12 月發(fā)布 MySQL 5.7.17 推出的一個全新高可用和高擴展的解決方案。

引入復(fù)制組主要是為了解決傳統(tǒng)異步復(fù)制和半同步復(fù)制可能產(chǎn)生數(shù)據(jù)不一致的問題。

MGR 由若干個節(jié)點共同組成一個復(fù)制組,一個事務(wù)的提交,必須經(jīng)過組內(nèi)大多數(shù)節(jié)點 (N / 2 + 1) 決議并通過,才能得以提交。

當(dāng)客戶端發(fā)起一個更新事務(wù)時,該事務(wù)先在本地執(zhí)行,執(zhí)行完成之后就要發(fā)起對事務(wù)的提交操作。在還沒有真正提交之前,需要將產(chǎn)生的復(fù)制寫集廣播出去,復(fù)制到其它成員。因為事務(wù)是通過原子廣播發(fā)送的,所以組中的成員要么都接收事務(wù),要么都不接收事務(wù)。如果組中的所有成員收到了該廣播消息(事務(wù)),那么他們會按照之前發(fā)送事務(wù)的相同順序收到該廣播消息。因此,所有組成員都以相同的順序接收事務(wù)的寫集,并為事務(wù)建立全局順序。因此,所有組成員都以相同的順序接收事務(wù)的寫集,并為事務(wù)建立全局順序。

在不同組成員并發(fā)執(zhí)行的事務(wù)可能存在沖突。沖突是通過檢查和比較兩個不同并發(fā)事務(wù)的 write set 來驗證的,這個過程稱為認(rèn)證。在認(rèn)證期間,沖突檢測在行級別執(zhí)行的:如果在不同組成員上執(zhí)行的兩個并發(fā)事務(wù)更新了同一行數(shù)據(jù),則存在沖突。根據(jù)沖突認(rèn)證檢測機制判斷,按照順序,第一次提交的會正常執(zhí)行,第二次提交的事務(wù)會在事務(wù)發(fā)起的原始組成員上執(zhí)行回滾,,組中的其他成員對該事務(wù)執(zhí)行刪除。如果兩個事務(wù)經(jīng)常發(fā)生沖突,那么最好將這兩個事務(wù)放在同一個組成員中執(zhí)行,這樣它們在本地鎖管理器的協(xié)調(diào)下將都有機會提交成功,而不至于因為處在兩個不同的組成員中由于沖突認(rèn)證而導(dǎo)致其中一個事務(wù)被頻繁回滾。

最終,所有組內(nèi)成員以相同的順序接收同一組事務(wù)。因此組內(nèi)成員以相同的順序應(yīng)用相同的修改,保證組內(nèi)數(shù)據(jù)強一致性。

MySQL中常見的高可用架構(gòu)部署方案有哪些

有下面的幾種特性:

1、避免腦裂:MGR 中不會出現(xiàn)腦裂的現(xiàn)象;

2、數(shù)據(jù)一致性保障:MGR 的冗余能力很好,能夠保證 Binlog Event 至少被復(fù)制到超過一半的成員上,只要同時宕機的成員不超過半數(shù)便不會導(dǎo)致數(shù)據(jù)丟失。MGR還保證只要 Binlog Event 沒有被傳輸?shù)桨霐?shù)以上的成員,本地成員不會將事務(wù)的 Binlog Event 寫入 Binlog 文件和提交事務(wù),從而保證宕機的服務(wù)器上不會有組內(nèi)在線成員上不存在的數(shù)據(jù)。因此,宕機的服務(wù)器重啟后,不再需要特殊的處理就可以加入組;

3、多節(jié)點寫入支持:多寫模式下支持集群中的所有節(jié)點都可以寫入。

組復(fù)制的應(yīng)用場景

1、彈性復(fù)制:需要非常靈活的復(fù)制基礎(chǔ)設(shè)施的環(huán)境,其中MySQL Server的數(shù)量必須動態(tài)增加或減少,并且在增加或減少Server的過程中,對業(yè)務(wù)的副作用盡可能少。例如,云數(shù)據(jù)庫服務(wù);

2、高可用分片:分片是實現(xiàn)寫擴展的一種流行方法。基于 組復(fù)制 實現(xiàn)的高可用分片,其中每個分片都會映射到一個復(fù)制組上(邏輯上需要一一對應(yīng),但在物理上,一個復(fù)制組可以承載多個分片);

3、替代主從復(fù)制:在某些情況下,使用一個主庫會造成單點爭用。在某些情況下,向整個組內(nèi)的多個成員同時寫入數(shù)據(jù),對應(yīng)用來說可能伸縮性更強;

4、自治系統(tǒng):可以利用組復(fù)制內(nèi)置的自動故障轉(zhuǎn)移、數(shù)據(jù)在不同組成員之間的原子廣播和最終數(shù)據(jù)一致性的特性來實現(xiàn)一些運維自動化。

InnoDB Cluster

InnoDB Cluster 是官方提供的高可用方案,是 MySQL 的一種高可用性(HA)解決方案,它通過使用 MySQL Group Replication 來實現(xiàn)數(shù)據(jù)的自動復(fù)制和高可用性,InnoDB Cluster 通常包含下面三個關(guān)鍵組件:

MySQL中常見的高可用架構(gòu)部署方案有哪些

1、MySQL Shell: 它是 MySQL 的高級管理客戶端;

2、MySQL ServerMGR,使得一組 MySQL 實例能夠提供高可用性,對于 MGR,Innodb Cluster 提供了一種更加易于編程的方式來處理 MGR;

3、MySQL Router,一種輕量級中間件,主要進(jìn)行路由請求,將客戶端發(fā)送過來的請求路由到不同的 MySQL 服務(wù)器節(jié)點。

MySQL Server 基于 MySQL Group Replication 構(gòu)建,提供自動成員管理,容錯,自動故障轉(zhuǎn)移動能等。InnoDB Cluster 通常以單主模式運行,一個讀寫實例和多個只讀實例。不過也可以選用多主模式。

優(yōu)點:

1、高可用性:通過 MySQL Group Replication,InnoDB Cluster 能夠?qū)崿F(xiàn)數(shù)據(jù)在集群中的自動復(fù)制,從而保證數(shù)據(jù)的可用性;

2、簡單易用:InnoDB Cluster 提供了一個簡單易用的管理界面,使得管理員可以快速部署和管理集群;

3、全自動故障轉(zhuǎn)移: InnoDB Cluster 能夠自動檢測和診斷故障,并進(jìn)行必要的故障轉(zhuǎn)移,使得數(shù)據(jù)可以繼續(xù)可用。

缺點:

1、復(fù)雜性:InnoDB Cluster 的部署和管理比較復(fù)雜,需要對 MySQL 的工作原理有一定的了解;

2、性能影響:由于自動復(fù)制和高可用性的要求,InnoDB Cluster 可能對 MySQL 的性能造成一定的影響;

3、限制:InnoDB Cluster 的功能對于一些特殊的應(yīng)用場景可能不夠靈活,需要更多的定制。

InnoDB ClusterSet

MySQL InnoDB ClusterSet 通過將主 InnoDB Cluster 與其在備用位置(例如不同數(shù)據(jù)中心)的一個或多個副本鏈接起來,為 InnoDB Cluster 部署提供容災(zāi)能力。

InnoDB ClusterSet 使用專用的 ClusterSet 復(fù)制通道自動管理從主集群到副本集群的復(fù)制。如果主集群由于數(shù)據(jù)中心損壞或網(wǎng)絡(luò)連接丟失而變得無法使用,用戶可以激活副本集群以恢復(fù)服務(wù)的可用性。

MySQL中常見的高可用架構(gòu)部署方案有哪些

InnoDB ClusterSet 的特點:

1、主集群和副本集群之間的緊急故障轉(zhuǎn)移可以由管理員通過 MySQL Shell,使用 AdminAPI 進(jìn)行操作;

2、InnoDB ClusterSet 部署中可以擁有的副本集群的數(shù)量沒有定義的限制;

3、異步復(fù)制通道將事務(wù)從主集群復(fù)制到副本集群。clusterset_replicationInnoDB ClusterSet 創(chuàng)建過程中,在每個集群上都設(shè)置了名為 ClusterSet 的復(fù)制通道,當(dāng)集群是副本時,它使用該通道從主集群復(fù)制事務(wù)。底層組復(fù)制技術(shù)管理通道并確保復(fù)制始終在主集群的主服務(wù)器(作為發(fā)送方)和副本集群的主服務(wù)器(作為接收方)之間進(jìn)行;

4、每個 InnoDB ClusterSet 集群,只有主集群能夠接收寫請求,大多數(shù)的讀請求流量也會被路由到主集群,不過也可以指定讀請求到其他的集群;

InnoDB ClusterSet 的限制:

1、InnoDB ClusterSet 只支持異步復(fù)制,不能使用半同步復(fù)制,無法避免異步復(fù)制的缺陷:數(shù)據(jù)延遲、數(shù)據(jù)一致性等;

2、InnoDB ClusterSet 僅支持Cluster實例的單主模式,不支持多主模式。 即只能包含一個讀寫主集群, 所有副本集群都是只讀的, 不允許具有多個主集群的雙活設(shè)置,因為在集群發(fā)生故障時無法保證數(shù)據(jù)一致性;

3、已有的 InnoDB Cluster 不能用作 InnoDB ClusterSet 部署中的副本集群。副本集群必須從單個服務(wù)器實例啟動,作為新的 InnoDB 集群;

4、只支持 MySQL 8.0。

InnoDB ReplicaSet

InnoDB ReplicaSet 是 MySQL 團隊在 2020 年推出的一款產(chǎn)品,用來幫助用戶快速部署和管理主從復(fù)制,在數(shù)據(jù)庫層仍然使用的是主從復(fù)制技術(shù)。

InnoDB ReplicaSet 由單個主節(jié)點和多個輔助節(jié)點(傳統(tǒng)上稱為 MySQL 復(fù)制源和副本)組成。

InnoDB cluster 類似, MySQL Router 支持針對 InnoDB ReplicaSet 的引導(dǎo), 這意味著可以自動配置 MySQL Router 以使用 InnoDB ReplicaSet, 而無需手動配置文件. 這使得 InnoDB ReplicaSet 成為一種快速簡便的方法, 可以啟動和運行 MySQL 復(fù)制和 MySQL Router, 非常適合擴展讀取, 并在不需要 InnoDB 集群提供高可用性的用例中提供手動故障轉(zhuǎn)移功能。

MySQL中常見的高可用架構(gòu)部署方案有哪些

InnoDB ReplicaSet 的限制:

1、沒有自動故障轉(zhuǎn)移,在主節(jié)點不可用的情況下,需要使用 AdminAPI 手動觸發(fā)故障轉(zhuǎn)移,然后才能再次進(jìn)行任何更改。但是,輔助實例仍可用于讀??;

2、由于意外停止或不可用,無法防止部分?jǐn)?shù)據(jù)丟失:在意外停止時未完成的事務(wù)可能會丟失;

3、在意外退出或不可用后無法防止不一致。如果手動故障轉(zhuǎn)移提升了一個輔助實例,而前一個主實例仍然可用,例如,由于網(wǎng)絡(luò)分區(qū),裂腦情況可能會導(dǎo)致數(shù)據(jù)不一致;

4、InnoDB ReplicaSet 不支持多主模式。允許寫入所有成員的經(jīng)典復(fù)制拓?fù)錈o法保證數(shù)據(jù)一致性;

5、讀取橫向擴展是有限的。InnoDB ReplicaSet 基于異步復(fù)制,因此無法像 Group Replication 那樣調(diào)整流量控制;

6、一個 ReplicaSet 最多由一個主實例組成。支持一個或多個輔助。盡管可以添加到 ReplicaSet 的輔助節(jié)點的數(shù)量沒有限制,但是連接到 ReplicaSet 的每個 MySQL Router 都必須監(jiān)視每個實例。因此,一個 ReplicaSet 中加入的實例越多,監(jiān)控就越多。

使用 InnoDB ReplicaSets 的主要原因是你有更好的寫性能。使用 InnoDB ReplicaSets 的另一個原因是它們允許在不穩(wěn)定或慢速網(wǎng)絡(luò)上部署,而 InnoDB Cluster 則不允許。

MMM

MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM 使用 Perl 語言開發(fā),主要用來監(jiān)控和管理 MySQL Master-Master(雙主)復(fù)制,可以說是 MySQL 主主復(fù)制管理器。

雙主模式,業(yè)務(wù)上同一時刻只能一個主庫進(jìn)行數(shù)據(jù)的寫入。另一個主備庫,會在主服務(wù)器失效時,進(jìn)行主備切換和故障轉(zhuǎn)移。

MMM 中是通過一個 VIP(虛擬 IP) 的機制來保證集群的高可用的。整個集群中,在主節(jié)點會提供一個 VIP 地址來提供數(shù)據(jù)讀寫服務(wù),當(dāng)出現(xiàn)故障的時候,VIP 就會從原來的主節(jié)點便宜到其他節(jié)點,由其他節(jié)點提供服務(wù)。

MySQL中常見的高可用架構(gòu)部署方案有哪些

MMM無法完全的保證數(shù)據(jù)一致性,所以適用于對數(shù)據(jù)的一致性要求不是很高的場景。(因為主備上的數(shù)據(jù)不一定是最新的,可能還沒從庫的新。解決方法:開啟半同步)。

MMM 的優(yōu)缺點

優(yōu)點:高可用性,擴展性好,出現(xiàn)故障自動切換,對于主主同步,在同一時間只提供一臺數(shù)據(jù)庫寫操作,保證數(shù)據(jù)的一致性。

缺點:無法完全保數(shù)據(jù)的一致性,建議采用半同步復(fù)制方式,減少失敗的概率;目前 MMM 社區(qū)已經(jīng)缺少維護(hù),不支持基于 GTID 的復(fù)制。

適用場景:

MMM的適用場景為數(shù)據(jù)庫訪問量大,業(yè)務(wù)增長快,并且能實現(xiàn)讀寫分離的場景。

MHA

Master High Availability Manager and Tools for MySQL,簡稱 MHA 。是一套優(yōu)秀的作為 MySQL 高可用性環(huán)境下故障切換和主從提升的高可用軟件。

這個工具專門用于監(jiān)控主庫的狀態(tài),當(dāng)發(fā)現(xiàn) master 節(jié)點故障的時候,會自動提升其中擁有新數(shù)據(jù)的 slave 節(jié)點成為新的 master 節(jié)點,在此期間,MHA 會通過其他從節(jié)點獲取額外的信息來避免數(shù)據(jù)一致性問題。MHA 還提供了 mater 節(jié)點的在線切換功能,即按需切換 master-slave 節(jié)點。MHA 能夠在30秒內(nèi)實現(xiàn)故障切換,并能在故障切換過程中,最大程度的保證數(shù)據(jù)一致性。

MySQL中常見的高可用架構(gòu)部署方案有哪些

MHA 由兩部分組成;

MHA Manager(管理節(jié)點)和MHA Node(數(shù)據(jù)節(jié)點)。

MHA Manager 可以單獨部署在一臺獨立的機器上管理多個 master-slave 集群,也可以部署在一臺 slave節(jié)點上。MHA Node 運行在每臺 MySQL 服務(wù)器上,MHA Manager 會定時探測集群中的 master 節(jié)點,當(dāng) master 出現(xiàn)故障時,它可以自動將最新數(shù)據(jù)的 slave 提升為新的 master,然后將所有其他的 slave 重新指向新的 master。

整個故障轉(zhuǎn)移過程對應(yīng)用程序完全透明。

在 MHA 自動故障切換過程中,MHA 試圖從宕機的主服務(wù)器上最大限度的保存二進(jìn)制日志,最大程度的保證數(shù)據(jù)的不丟失,但這并不總是可行的。例如,主服務(wù)器硬件故障或無法通過 ssh 訪問,MHA 沒法保存二進(jìn)制日志,只進(jìn)行故障轉(zhuǎn)移而丟失了最新的數(shù)據(jù)。

使用 MySQL 5.5 開始找支持的半同步復(fù)制,可以大大降低數(shù)據(jù)丟失的風(fēng)險。MHA可以與半同步復(fù)制結(jié)合起來。如果只有一個 slave 已經(jīng)收到了最新的二進(jìn)制日志,MHA 可以將最新的二進(jìn)制日志應(yīng)用于其他所有的 slave 服務(wù)器上,因此可以保證所有節(jié)點的數(shù)據(jù)一致性。

目前 MHA 主要支持一主多從的架構(gòu),要搭建 MHA,要求一個復(fù)制集群中必須最少有三臺數(shù)據(jù)庫服務(wù)器 ,一主二從,即一臺 master,一臺充當(dāng)備用 master,另外一臺充當(dāng)從庫,因為至少需要三臺服務(wù)器。

MHA 工作原理總結(jié)如下:

1、從宕機崩潰的 master 保存二進(jìn)制日志事件(binlog events);

2、識別最新更新的 slave;

3、應(yīng)用差異的中繼日志(relay log) 到其他slave;

4、應(yīng)用從master保存的二進(jìn)制日志事件(binlog events);

5、提升一個 slave 為新master;

6、使用其他的 slave 連接新的 master 進(jìn)行復(fù)制。

優(yōu)點:

1、可以支持基于 GTID 的復(fù)制模式;

2、MHA 在進(jìn)行故障轉(zhuǎn)移時更不易產(chǎn)生數(shù)據(jù)丟失;

3、同一個監(jiān)控節(jié)點可以監(jiān)控多個集群。

缺點:

1、需要編寫腳本或利用第三方工具來實現(xiàn) Vip 的配置;

2、MHA 啟動后只會對主數(shù)據(jù)庫進(jìn)行監(jiān)控;

3、需要基于 SSH 免認(rèn)證配置,存在一定的安全隱患。

Galera Cluster

Galera Cluster 是由 Codership 開發(fā)的MySQL多主集群,包含在 MariaDB 中,同時支持 Percona xtradb、MySQL,是一個易于使用的高可用解決方案,在數(shù)據(jù)完整性、可擴展性及高性能方面都有可接受的表現(xiàn)。

其本身具有 multi-master 特性,支持多點寫入,Galera Cluster 中每個實例都是對等的,互為主從。當(dāng)客戶端讀寫數(shù)據(jù)的時候,可以選擇任一 MySQL 實例,對于讀操作,每個實例讀取到的數(shù)據(jù)都是相同的。對于寫操作,當(dāng)數(shù)據(jù)寫入某一節(jié)點后,集群會將其同步到其它節(jié)點。這種架構(gòu)不共享任何數(shù)據(jù),是一種高冗余架構(gòu)。

MySQL中常見的高可用架構(gòu)部署方案有哪些

主要功能

1、同步復(fù)制;

2、真正的 multi-master,即所有節(jié)點可以同時讀寫數(shù)據(jù)庫;

3、自動的節(jié)點成員控制,失效節(jié)點自動被清除;

4、新節(jié)點加入數(shù)據(jù)自動復(fù)制;

5、真正的并行復(fù)制,行級;

6、用戶可以直接連接集群,使用感受上與 MySQL 完全一致。

優(yōu)勢

1、數(shù)據(jù)一致:同步復(fù)制保證了整個集群的數(shù)據(jù)一致性,無論何時在任何節(jié)點執(zhí)行相同的select查詢,結(jié)果都一樣;

2、高可用性:由于所有節(jié)點數(shù)據(jù)一致,單個節(jié)點崩潰不需要執(zhí)行復(fù)雜耗時的故障切換,也不會造成丟失數(shù)據(jù)或停止服務(wù);

3、性能改進(jìn):同步復(fù)制允許在集群中的所有節(jié)點上并行執(zhí)行事務(wù),從而提高讀寫性能;

4、更小的客戶端延遲;

5、同時具有讀和寫的擴展能力。

分析下原理

Galera Cluster 中主要用到了同步復(fù)制,主庫中的單個更新事務(wù)需要在所有從庫中同步更新,當(dāng)主庫提交事務(wù),集群中的所有節(jié)點數(shù)據(jù)保持一致。

異步復(fù)制,主庫將數(shù)據(jù)更新傳播給從庫后立即提交事務(wù),而不論從庫是否成功讀取或重放數(shù)據(jù)變化,所以異步復(fù)制會存在短暫的,主從數(shù)據(jù)同步不一致的情況出現(xiàn)。

不過同步復(fù)制的缺點也是很明顯的,同步復(fù)制協(xié)議通常使用兩階段提交或分布式鎖協(xié)調(diào)不同節(jié)點的操作,也及時說節(jié)點越多需要協(xié)調(diào)的節(jié)點也就越多,那么事務(wù)沖突和死鎖的概率也就會隨之增加。

我們知道 MGR 組復(fù)制的引入也是為了解決傳統(tǒng)異步復(fù)制和半同步復(fù)制可能產(chǎn)生數(shù)據(jù)不一致的問題,MGR 中的組復(fù)制,基于 Paxos 協(xié)議,原則上事務(wù)的提交,主要大多數(shù)節(jié)點 ACK 就可以提交了。

Galera Cluster 中的同步需要同步數(shù)據(jù)到所有節(jié)點,保證所有節(jié)點都成功?;趯S型ㄐ沤M系統(tǒng) GCommon ,所有節(jié)點都必須有 ACK。

Galera 復(fù)制是一種基于驗證的復(fù)制,基于驗證的復(fù)制使用通信和排序技術(shù)實現(xiàn)同步復(fù)制,通過廣播并發(fā)事務(wù)之間建立的全局總序來協(xié)調(diào)事務(wù)提交。簡單的講就是事務(wù)必須以相同的順序應(yīng)用于所有實例。

事務(wù)現(xiàn)在本地執(zhí)行,然后發(fā)送的其他節(jié)點做沖突驗證,沒有沖突的時候所有節(jié)點提交事務(wù),否則在所有節(jié)點回滾。

MySQL中常見的高可用架構(gòu)部署方案有哪些

當(dāng)客戶端發(fā)出 commit 命令時,在實際提交之前,對數(shù)據(jù)所做的更改都會收集到一個寫集合中,寫集合中包含事務(wù)信息和所更改行的主鍵,數(shù)據(jù)庫將寫集發(fā)送到其它節(jié)點。

節(jié)點用寫集中的主鍵與當(dāng)前節(jié)點中未完成事務(wù)的所有寫集的主鍵比較,確定節(jié)點是否可以提交事務(wù),同時滿足下面三個條件會被任務(wù)存在沖突,驗證失?。?/p>

1、兩個事務(wù)來源于不同節(jié)點;

2、兩個事務(wù)包含相同的主鍵;

3、老事務(wù)對新事務(wù)不可見,即老事務(wù)未提交完成。新老事務(wù)的劃定依賴于全局事務(wù)總序,即 GTID。

驗證失敗,節(jié)點將刪除寫集,集群將回滾原始事務(wù),對于所有的節(jié)點都是如此,每個節(jié)點單獨進(jìn)行驗證。因為所有節(jié)點都以相同的順序接收事務(wù),它們對事務(wù)的結(jié)果都會做出相同的決定,要么全成功,要么都失敗。成功后自然就提交了,所有的節(jié)點又會重新達(dá)到數(shù)據(jù)一致的狀態(tài)。節(jié)點之間不交換“是否沖突”的信息,各個節(jié)點獨立異步處理事務(wù)。

MySQL Cluster

MySQL Cluster 是一個高度可擴展的,兼容 ACID 事務(wù)的實時數(shù)據(jù)庫,基于分布式架構(gòu)不存在單點故障,MySQL Cluster 支持自動水平擴容,并能做自動的讀寫負(fù)載均衡。

MySQL Cluster 使用了一個叫 NDB 的內(nèi)存存儲引擎來整合多個 MySQL 實例,提供一個統(tǒng)一的服務(wù)集群。

NDB 是一種內(nèi)存性的存儲引擎,使用 Sarding-Nothing 的無共享的架構(gòu)。Sarding-Nothing 指的是每個節(jié)點有獨立的處理器,磁盤和內(nèi)存,節(jié)點之間沒有共享資源完全獨立互不干擾,節(jié)點之間通過告訴網(wǎng)絡(luò)組在一起,每個節(jié)點相當(dāng)于是一個小型的數(shù)據(jù)庫,存儲部分?jǐn)?shù)據(jù)。這種架構(gòu)的好處是可以利用節(jié)點的分布性并行處理數(shù)據(jù),調(diào)高整體的性能,還有就是有很高的水平擴展性能,只需要增加節(jié)點就能增加數(shù)據(jù)的處理能力。

MySQL中常見的高可用架構(gòu)部署方案有哪些

MySql Cluster 中包含三種節(jié)點,分別是管理節(jié)點(NDB Management Server)、數(shù)據(jù)節(jié)點(Data Nodes)和 SQL查詢節(jié)點(SQL Nodes) 。

SQL Nodes 是應(yīng)用程序的接口,像普通的 mysqld 服務(wù)一樣,接受用戶的 SQL 輸入,執(zhí)行并返回結(jié)果。Data Nodes 是數(shù)據(jù)存儲節(jié)點,NDB Management Server 用來管理集群中的每個 node。

其中數(shù)據(jù)節(jié)點會存儲集群中的數(shù)據(jù)分區(qū)和分區(qū)的副本,來看下 MySql Cluster 是如何對數(shù)據(jù)進(jìn)行分片的操作的,首先來了解下下面幾個概念

節(jié)點組(Node Group): 一組數(shù)據(jù)節(jié)點的集合。節(jié)點組的個數(shù)=節(jié)點數(shù) / 副本數(shù);

比如有集群中 4 個節(jié)點,副本數(shù)為 2(對應(yīng) NoOfReplicas 的設(shè)置),那么節(jié)點組個數(shù)為2。

另外,在可用性方面,數(shù)據(jù)的副本在組內(nèi)交叉分配,一個節(jié)點組內(nèi)只有要一臺機器可用,就可以保證整個集群的數(shù)據(jù)完整性,實現(xiàn)服務(wù)的整體可用。

分區(qū)(Partition):MySql Cluster 是一個分布式的存儲系統(tǒng),數(shù)據(jù)按照 分區(qū) 劃分成多份存儲在各數(shù)據(jù)節(jié)點中,分區(qū)個數(shù)由系統(tǒng)自動計算,分區(qū)數(shù) = 數(shù)據(jù)節(jié)點數(shù) / LDM 線程數(shù);

副本(Replica):分區(qū)數(shù)據(jù)的備份,有幾個分區(qū)就有幾個副本,為了避免單點,保證 MySql Cluster 集群的高可用,原始數(shù)據(jù)對應(yīng)的分區(qū)和副本通常會保存在不同的主機上,在一個節(jié)點組內(nèi)進(jìn)行交叉?zhèn)浞荨?/p>

MySQL中常見的高可用架構(gòu)部署方案有哪些

栗如,上面的例子,有四個數(shù)據(jù)節(jié)點(使用ndbd),副本數(shù)為2的集群,節(jié)點組被分為2組(4/2),數(shù)據(jù)被分為4個分區(qū),數(shù)據(jù)分配情況如下:

分區(qū)0(Partition 0)保存在節(jié)點組 0(Node Group 0)中,分區(qū)數(shù)據(jù)(主副本 — Primary Replica)保存在節(jié)點1(node 1) 中,備份數(shù)據(jù)(備份副本,Backup Replica)保存在節(jié)點2(node 2) 中;

分區(qū)1(Partition 1)保存在節(jié)點組 1(Node Group 1)中,分區(qū)數(shù)據(jù)(主副本 — Primary Replica)保存在節(jié)點3(node 3) 中,備份數(shù)據(jù)(備份副本,Backup Replica)保存在節(jié)點4(node 4) 中;

分區(qū)2(Partition 2)保存在節(jié)點組 0(Node Group 0)中,分區(qū)數(shù)據(jù)(主副本 — Primary Replica)保存在節(jié)點2(node 2) 中,備份數(shù)據(jù)(備份副本,Backup Replica)保存在節(jié)點1(node 1) 中;

分區(qū)3(Partition 2)保存在節(jié)點組 1(Node Group 1)中,分區(qū)數(shù)據(jù)(主副本 — Primary Replica)保存在節(jié)點4(node 4) 中,備份數(shù)據(jù)(備份副本,Backup Replica)保存在節(jié)點3(node 3) 中;

這樣,對于一張表的一個 Partition 來說,在整個集群有兩份數(shù)據(jù),并分布在兩個獨立的 Node 上,實現(xiàn)了數(shù)據(jù)容災(zāi)。同時,每次對一個 Partition 的寫操作,都會在兩個 Replica 上呈現(xiàn),如果 Primary Replica 異常,那么 Backup Replica 可以立即提供服務(wù),實現(xiàn)數(shù)據(jù)的高可用。

mysql cluster 的優(yōu)點

1、99.999%的高可用性;

2、快速的自動失效切換;

3、靈活的分布式體系結(jié)構(gòu),沒有單點故障;

4、高吞吐量和低延遲;

5、可擴展性強,支持在線擴容。

mysql cluster 的缺點

1、存在很多限制,比如:不支持外鍵,數(shù)據(jù)行不能超過8K(不包括BLOB和text中的數(shù)據(jù));

2、部署、管理、配置很復(fù)雜;

3、占用磁盤空間大,內(nèi)存大;

4、備份和恢復(fù)不方便;

5、重啟的時候,數(shù)據(jù)節(jié)點將數(shù)據(jù) load 到內(nèi)存需要很長時間。

MySQL Fabric

MySQL Fabric 會組織多個 MySQL 數(shù)據(jù)庫,將大的數(shù)據(jù)分散到多個數(shù)據(jù)庫中,即數(shù)據(jù)分片(Data Shard),同時同一個分片數(shù)據(jù)庫中又是一個主從結(jié)構(gòu),F(xiàn)abric 會挑選合適的庫作為主庫,當(dāng)主庫掛掉的時候,又會重新在從庫中選出一個主庫。

MySQL Fabric 的特點:

1、高可用;

2、使用數(shù)據(jù)分片的橫向功能。

MySQL Fabric-aware 連接器把從 MySQL Fabric 獲取的路由信息存儲到緩存中,然后憑借該信息將事務(wù)或查詢發(fā)送給正確的 MySQL 服務(wù)器。

同時,每一個分片組,可以又多個一個服務(wù)器組成,構(gòu)成主從結(jié)構(gòu),當(dāng)主庫掛掉的時候,又會重新在從庫中選出一個主庫。保證節(jié)點的高可用。

HA Group 保證訪問指定 HA Group 的數(shù)據(jù)總是可用的,同時其基礎(chǔ)的數(shù)據(jù)復(fù)制是基于 MySQL Replication 實現(xiàn)的。

MySQL中常見的高可用架構(gòu)部署方案有哪些

缺點

事務(wù)及查詢只支持在同一個分片內(nèi),事務(wù)中更新的數(shù)據(jù)不能跨分片,查詢語句返回的數(shù)據(jù)也不能跨分片。

以上就是關(guān)于“MySQL中常見的高可用架構(gòu)部署方案有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

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

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

AI