国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

MySQL數(shù)據(jù)庫的高可用性分析

2017-03-22 22:39:54 7680

MySQL數(shù)據(jù)庫是目前開源應(yīng)用最大的關(guān)系型數(shù)據(jù)庫,有海量的應(yīng)用將數(shù)據(jù)存儲(chǔ)在MySQL數(shù)據(jù)庫中。存儲(chǔ)數(shù)據(jù)的安?性和可靠性是生產(chǎn)數(shù)據(jù)庫的關(guān)注重點(diǎn)。本文分析了目前采用較多的保障MySQL可用性方案。

blob.png

MySQL Replication

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

blob.png

圖1. MySQL Replication主從復(fù)制集群

如圖一所示,一個(gè)主實(shí)例(M),三個(gè)從實(shí)例(S),通過replication,Master生成event的binlog,然后發(fā)給slave,Slave將event寫入relaylog,然后將其提交到自身數(shù)據(jù)庫中,實(shí)現(xiàn)主從數(shù)據(jù)同步。對(duì)于數(shù)據(jù)庫之上的業(yè)務(wù)層來說,基于MySQL的主?復(fù)制集群,單點(diǎn)寫入Master,在event同步到Slave后,讀邏輯可以從任何一個(gè)Slave讀取數(shù)據(jù),以讀寫分離的方式,大大降低Master的運(yùn)行負(fù)載,同時(shí)提升了Slave的資源利用。

對(duì)于高可用來說,MySQL Replication有個(gè)重要的缺陷:數(shù)據(jù)復(fù)制的時(shí)延。在通常情況下,MySQL Replication數(shù)據(jù)復(fù)制是異步的,即是MySQL寫binlog后,發(fā)送給Slave并不等待Slave返回確認(rèn)收到,本地事務(wù)就提交了。一旦出現(xiàn)網(wǎng)絡(luò)延遲或中斷,數(shù)據(jù)延遲發(fā)送到Slave側(cè),主從數(shù)據(jù)就會(huì)出現(xiàn)不一致。在這個(gè)階段中,Master一旦宕機(jī),未發(fā)送到Slave的數(shù)據(jù)就丟失了,無法做到數(shù)據(jù)的高可用。

為了解決這個(gè)問題,google提供了解決方案:半同步和同步復(fù)制。在數(shù)據(jù)異步復(fù)制的基礎(chǔ)之上,做了一點(diǎn)修改。半同步復(fù)制是Master等待event寫入Slave的relay后,再提交本地,保證Slave一定收到了需要同步的數(shù)據(jù)。同步復(fù)制不不僅是要求Slave收到數(shù)據(jù),還要求Slave將數(shù)據(jù)commit到數(shù)據(jù)庫中,從而保證每次的數(shù)據(jù)寫入,主從數(shù)據(jù)都是一致的。

基于半同步和同步復(fù)制,MySQL Replication的高可用得到了質(zhì)的提升,特別是同步復(fù)制。基于同步復(fù)制的MySQL Replication集群,每個(gè)實(shí)例讀取的數(shù)?都是一致的,不會(huì)存在Slave幻讀。同時(shí),Master宕機(jī)后,應(yīng)用程序切換到任何一個(gè)Slave都可以保證讀寫數(shù)據(jù)的一致性。但是,同步復(fù)制帶來了重大的性能下降,這里需要做一個(gè)折衷。另外,MySQL Replication的主從切換需要人工介入判斷,同時(shí)需要Slave的replaylog提交完畢,故障恢復(fù)時(shí)間會(huì)比較長。

MySQL Fabric

MySQL Fabric是MySQL社區(qū)提供的管理多個(gè)MySQL服務(wù)的擴(kuò)展。高可用是它設(shè)計(jì)的主要特性之一。

Fabric將兩個(gè)及以上的MySQL實(shí)例劃分為一個(gè)HA Group。其中的一個(gè)是主,其余的都是從。HA Group保證訪問指定HA Group的數(shù)據(jù)總是可用的。其基礎(chǔ)的數(shù)據(jù)復(fù)制是基于MySQL Replication,然后,F(xiàn)abric提供了更多的特性:

失效檢測和恢復(fù):Fabric監(jiān)控HA Group中的主實(shí)例,一旦發(fā)現(xiàn)主實(shí)例失效,F(xiàn)abric會(huì)從HA Group中剩余的從實(shí)例中選擇一個(gè),并將其提升為主實(shí)例。

讀寫均衡:Fabric可以自動(dòng)的處理一個(gè)HA Group的讀寫操作,將寫操作發(fā)送給主實(shí)例,而讀請(qǐng)求在多個(gè)從實(shí)例之間做負(fù)載均衡。

blob.png

圖2. Fabric

MHA

MHA(MySQL-master-ha)是目前廣泛使用的MySQL主從復(fù)制的高可用方案。MHA設(shè)計(jì)目標(biāo)是自動(dòng)實(shí)現(xiàn)主實(shí)例宕機(jī)后,從機(jī)切換為主,并盡量降低切換時(shí)延(通常在10-30s內(nèi)切換完成)。同時(shí),由MHA保證在切換過程中的數(shù)據(jù)一致性。MHA對(duì)MySQL的主從復(fù)制集群非常友好,沒有對(duì)集群做任何侵入性的修改。

MHA的一個(gè)重點(diǎn)?性是:在主實(shí)例宕機(jī)后,MHA可以自動(dòng)的判斷主從復(fù)制集群中哪個(gè)從實(shí)例的relaylog是最新的,并將最新從實(shí)例的差異log應(yīng)用到其余的從實(shí)例中,從而保證每個(gè)實(shí)例的數(shù)據(jù)一致。通常情況下,MHA需要10s左右檢測主實(shí)例異常,并將主實(shí)例關(guān)閉從而避免腦裂。然后再用10s左右將差異的log event同步,并啟用新的Master。整個(gè)MHA的RTO時(shí)間大約在30s。

MySQL Cluster

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

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

blob.png

圖3. MySQL Cluster組成

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

MySQL Cluster采用了新的數(shù)據(jù)分片和容錯(cuò)的方式來實(shí)現(xiàn)數(shù)據(jù)安全和高可用。其由Partition,Replica,Data Node,Node Group構(gòu)成。

Partition:NDB一張表的一個(gè)數(shù)據(jù)分片,包含一張表的一部分?jǐn)?shù)據(jù)。

Replica:一個(gè)Partition的拷貝。一個(gè)Partition可以有一個(gè)或多個(gè)Replica,一個(gè)Partition的所有Replica數(shù)據(jù)都是一致的。

Data Node:Replica的存儲(chǔ)載體,每個(gè)Node存儲(chǔ)一個(gè)或多個(gè)Replica。

Node Group:一個(gè)Data Node的集合。

blob.png

圖4. MySQL Cluster數(shù)據(jù)高可用

一個(gè)MySQL Cluster有4個(gè)Node,被分為了兩個(gè)Grou。Node1和2歸屬于Group0,Node3和4歸屬于Group1,。有一張表被分為4個(gè)Partition,并分別有兩個(gè)Replica。Partition0和Partition2的兩個(gè)Replica,分別存儲(chǔ)在Node1和Node2上,Pratition1和Partition3的兩個(gè)Replica分別存在Node3和Node4上。這樣,對(duì)于一張表的一個(gè)Partition來說,在整個(gè)集群有兩份數(shù)據(jù),并分布在兩個(gè)獨(dú)立的Node上,實(shí)現(xiàn)了數(shù)據(jù)容災(zāi)。同時(shí),每次對(duì)一個(gè)Partition的寫操作,都會(huì)在兩個(gè)Replica上呈現(xiàn),如果Primary Replica異常,那么Backup Replica可以立即提供服務(wù),實(shí)現(xiàn)數(shù)據(jù)的高可用?

小結(jié)

本文分析了目前MySQL使用較多的幾種MySQL數(shù)據(jù)復(fù)制和高可用方案,從使用來看,MySQL Replication是使用最為廣泛的數(shù)據(jù)復(fù)制方案,因?yàn)槭荕ySQL原生支持,針對(duì)其在不同場景下的一些缺陷,衍生出了半同步復(fù)制,強(qiáng)同步復(fù)制等數(shù)據(jù)高可用的方案。在此基礎(chǔ)之上,為了運(yùn)維方便,MySQL Fabric和MHA應(yīng)運(yùn)而生,從不同的方向解決了主從切換時(shí)數(shù)據(jù)一致性問題和流程自動(dòng)化的問題。此外,隨著分布式系統(tǒng)架構(gòu)和方案的逐步成熟。MySQL Cluster設(shè)計(jì)了全新的分布式架構(gòu),采用多副本,Sharding等特性,支持水平擴(kuò)展,做到了5個(gè)9的數(shù)據(jù)庫服務(wù)質(zhì)量保證。


提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問題: