溫馨提示×

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

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

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

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

         相對(duì)于傳統(tǒng)行業(yè)的相對(duì)服務(wù)時(shí)間9x9x6或者9x12x5,因?yàn)榛ヂ?lián)網(wǎng)電子商務(wù)以及互聯(lián)網(wǎng)游戲的實(shí)時(shí)性,所以服務(wù)要求7*24小時(shí),業(yè)務(wù)架構(gòu)不管是應(yīng)用還是數(shù)據(jù)庫(kù),都需要容災(zāi)互備,在mysql的體系中,最好通過(guò)在最開(kāi)始階段的數(shù)據(jù)庫(kù)架構(gòu)階段來(lái)實(shí)現(xiàn)容災(zāi)系統(tǒng)。所以這里從業(yè)務(wù)宏觀角度闡述下mysql架構(gòu)的方方面面。

一,MySQL架構(gòu)設(shè)計(jì)業(yè)務(wù)分析

1)讀多寫少

虛線表示跨機(jī)房部署,比如電子商務(wù)系統(tǒng),一個(gè)Master既有讀也有些寫,對(duì)讀數(shù)據(jù)一致性需要比較重要的,讀要放在Master上面。

M(R)僅僅是一個(gè)備庫(kù),只有M(WR)掛了之后,才會(huì)切換到M(R)上,這個(gè)時(shí)候M(R)就變成了讀寫庫(kù)。比如游戲系統(tǒng),有很多Salve會(huì)掛載后面一個(gè)M(R)上面。

 

2)讀多寫少MMS-電商

如果是電子商務(wù)類型的,這種讀多寫少的,一般是1個(gè)master拖上46個(gè)slave,所有slave掛載在一個(gè)master也足夠了。

切換的時(shí)候,把M1的讀寫業(yè)務(wù)切換到M2上面,然后把所有M1上的slave掛到M2上面去,如下所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解


 

3)讀多寫少MMSS-游戲

如果是游戲行業(yè)的話,讀非常多蠻明顯的,會(huì)出現(xiàn)一般1個(gè)Master都會(huì)掛上10個(gè)以上的Slave的情況,所以這個(gè)時(shí)候,可以把一部分Slave掛載新的M(R)上面。至少會(huì)減少一些壓力,這樣至少服務(wù)器掛掉的時(shí)候,不會(huì)對(duì)所有的slave有影響,還有一部分在M(R)上的slave在繼續(xù),不會(huì)對(duì)所有的slave受到影響,見(jiàn)圖3,

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

3

 

4)讀少寫多

         意味著讀并不會(huì)影響寫的效率,所以讀寫都可以放在一個(gè)M1(WR),而另外一個(gè)不提供讀也不提供寫,只提供standby冗余異地容災(zāi)。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

    這個(gè)異地容災(zāi)是非常重要的,否則如果是單機(jī)的,單邊的業(yè)務(wù),萬(wàn)一idc機(jī)房故障了,一般就會(huì)影響在線業(yè)務(wù)的,這種 造成業(yè)務(wù)2小時(shí)無(wú)法應(yīng)用,對(duì)于在線電子商務(wù)交易來(lái)說(shuō),影響是蠻大的,所以為了最大限度的保證7*24小時(shí),必須要做到異地容災(zāi),MM要跨idc機(jī)房。雖然對(duì)資源有一些要求,但是對(duì)HA來(lái)說(shuō)是不可缺少的,一定要有這個(gè)MM機(jī)制。

         做切換的時(shí)候,把所有的讀寫從M1直接切換到M2上就可以了。

 [MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

5)讀寫平分秋色

讀和寫差不多,但是讀不能影響寫的能力,把讀寫放在M1(WR)上,然后把一部分讀也放在M2(R)上面,當(dāng)然M1M2也是跨機(jī)房部署的。

         切換的時(shí)候,把一部分讀和全部寫從M1切換到M2上就可以了。

 

 

 

二:MySQL架構(gòu)設(shè)計(jì)常見(jiàn)架構(gòu)

1)強(qiáng)一致性

 對(duì)讀一致性的權(quán)衡,如果是對(duì)讀寫實(shí)時(shí)性要求非常高的話,就將讀寫都放在M1上面,M2只是作為standby,就是采取和上面的一(4)的讀少寫多的一樣的架構(gòu)模式。

         比如,訂單處理流程,那么對(duì)讀需要強(qiáng)一致性,實(shí)時(shí)寫實(shí)時(shí)讀,類似這種涉及交易的或者動(dòng)態(tài)實(shí)時(shí)報(bào)表統(tǒng)計(jì)的都要采用這種架構(gòu)模式

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

2)弱一致性

如果是弱一致性的話,可以通過(guò)在M2上面分擔(dān)一些讀壓力和流量,比如一些報(bào)表的讀取以及靜態(tài)配置數(shù)據(jù)的讀取模塊都可以放到M2上面。比如月統(tǒng)計(jì)報(bào)表,比如首頁(yè)推薦商品業(yè)務(wù)實(shí)時(shí)性要求不是很高,完全可以采用這種弱一致性的設(shè)計(jì)架構(gòu)模式。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

3)中間一致性

如果既不是很強(qiáng)的一致性又不是很弱的一致性,那么我們就采取中間的策略,就是在同機(jī)房再部署一個(gè)S1(R),作為備庫(kù),提供讀取服務(wù),減少M1(WR)的壓力,而另外一個(gè)idc機(jī)房的M2只做standby容災(zāi)方式的用途。

當(dāng)然這里會(huì)用到3臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,也許會(huì)增加采購(gòu)壓力,但是我們可以提供更好的對(duì)外數(shù)據(jù)服務(wù)的能力和途徑,實(shí)際中盡可能兩者兼顧。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

4)統(tǒng)計(jì)業(yè)務(wù)

比如PVUV操作、頁(yè)數(shù)的統(tǒng)計(jì)、流量的統(tǒng)計(jì)、數(shù)據(jù)的匯總等等,都可以劃歸為統(tǒng)計(jì)類型的業(yè)務(wù)。

數(shù)據(jù)庫(kù)上做大查詢的統(tǒng)計(jì)是非常消耗資源的。統(tǒng)計(jì)分為實(shí)時(shí)的統(tǒng)計(jì)和非實(shí)時(shí)的統(tǒng)計(jì),由于mysql主從是邏輯sql的模式,所以不能達(dá)到100%的實(shí)時(shí),如果是online要嚴(yán)格的非常實(shí)時(shí)的統(tǒng)計(jì)比如像火車票以及金融異地結(jié)算等的統(tǒng)計(jì),mysql這塊不是它的強(qiáng)項(xiàng),就只有查詢M1主庫(kù)來(lái)實(shí)現(xiàn)了。

 

A,但是對(duì)于不是嚴(yán)格的實(shí)時(shí)性的統(tǒng)計(jì),mysql有個(gè)很好的機(jī)制是binlog,我們可以通過(guò)binlog進(jìn)行解析Parser,解析出來(lái)寫入統(tǒng)計(jì)表進(jìn)行統(tǒng)計(jì)或者發(fā)消息給應(yīng)用端程序來(lái)進(jìn)行統(tǒng)計(jì)。這種是準(zhǔn)實(shí)時(shí)的統(tǒng)計(jì)操作,有一定的短暫的可接受的統(tǒng)計(jì)延遲現(xiàn)象,如果要100%實(shí)時(shí)性統(tǒng)計(jì)只有查詢M1主庫(kù)了。

通過(guò)binlog的方式實(shí)現(xiàn)統(tǒng)計(jì),在互聯(lián)網(wǎng)行業(yè),尤其是電商和游戲這塊,差不多可以解決90%以上的統(tǒng)計(jì)業(yè)務(wù)。有時(shí)候如果用戶或者客戶提出要實(shí)時(shí)read-time了,大家可以溝通一下為什么需要實(shí)時(shí),了解具體的業(yè)務(wù)場(chǎng)景,有些可能真的不需要實(shí)時(shí)統(tǒng)計(jì),需要有所權(quán)衡,需要跟用戶和客戶多次有效溝通,做出比較適合業(yè)務(wù)的統(tǒng)計(jì)架構(gòu)模型。

B還有一種offline統(tǒng)計(jì)業(yè)務(wù),比如月份報(bào)表年報(bào)表統(tǒng)計(jì)等,這種完全可以把數(shù)據(jù)放到數(shù)據(jù)倉(cāng)庫(kù)里面或者第三方Nosql里面進(jìn)行統(tǒng)計(jì)。

 

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

 

5)歷史數(shù)據(jù)遷移

歷史數(shù)據(jù)遷移,需要盡量不影響現(xiàn)在線上的業(yè)務(wù),盡量不影響現(xiàn)在線上的查詢寫入操作,為什么要做歷史數(shù)據(jù)遷移?因?yàn)橛行I(yè)務(wù)的數(shù)據(jù)是有時(shí)效性的,比如電商中的已經(jīng)完成的歷史訂單等,不會(huì)再有更新操作了,只有很簡(jiǎn)單的查詢操作,而且查詢也不會(huì)很頻繁,甚至可能一天都不會(huì)查詢一次。

         如果這時(shí)候歷史數(shù)據(jù)還在online庫(kù)里面或者online表里面,那么就會(huì)影響online的性能,所以對(duì)于這種,可以把數(shù)據(jù)遷移到新的歷史數(shù)據(jù)庫(kù)上,這個(gè)歷史數(shù)據(jù)庫(kù)可以是mysql也可以是nosql,也可以是數(shù)據(jù)倉(cāng)庫(kù)甚至hbase大數(shù)據(jù)等。

         實(shí)現(xiàn)途徑是通過(guò)slave庫(kù)查詢出所有的數(shù)據(jù),然后根據(jù)業(yè)務(wù)規(guī)則比如時(shí)間、某一個(gè)緯度等過(guò)濾篩選出數(shù)據(jù),放入歷史數(shù)據(jù)庫(kù)(History Databases)里面。遷移完了,再回到主庫(kù)M1上,刪除掉這些歷史數(shù)據(jù)。這樣在業(yè)務(wù)層面,查詢就要兼顧現(xiàn)在實(shí)時(shí)數(shù)據(jù)和歷史數(shù)據(jù),可以在filter上面根據(jù)遷移規(guī)則把online查詢和history查詢對(duì)接起來(lái)。比如說(shuō)一個(gè)月之內(nèi)的在online庫(kù)查詢一個(gè)月之前的在history庫(kù)查詢,可以把這個(gè)規(guī)則放在DB的遷移filter層和應(yīng)用查詢業(yè)務(wù)模塊層。如果可以的話,還可以配置更細(xì)化,通過(guò)應(yīng)用查詢業(yè)務(wù)模塊層來(lái)影響DB的遷移filter層,比如以前查詢分為一個(gè)月為基準(zhǔn),現(xiàn)在查詢業(yè)務(wù)變化了,以15天為基準(zhǔn),那么應(yīng)用查詢業(yè)務(wù)模塊層變化會(huì)自動(dòng)讓DBfilter層也變化,實(shí)現(xiàn)半個(gè)自動(dòng)化,更加智能一些。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

6MySQL Sharding

oracle這種基于rac基于共享存儲(chǔ)的方式,不需要sharding只需要擴(kuò)從rac存儲(chǔ)就能實(shí)現(xiàn)了。但是這種代價(jià)相對(duì)會(huì)比較高一些,共享存儲(chǔ)一般都比較貴,隨著業(yè)務(wù)的擴(kuò)展數(shù)據(jù)的爆炸式增長(zhǎng),你會(huì)不停累計(jì)你的成本,甚至達(dá)到一個(gè)天文數(shù)字。

目前這種share disk的方式,除了oracle的業(yè)務(wù)邏輯層做的非常完善之外其他的解決方案都還不是很完美。

Mysqlsharding也有其局限性,sharding之后的數(shù)據(jù)查詢?cè)L問(wèn)以及統(tǒng)計(jì)都會(huì)有很大的問(wèn)題,mysqlsharding是解決share nothing的存儲(chǔ)的一種分布式的方法,大體上分為垂直拆分和水平拆分。

 

6.1)垂直拆分

可以橫向拆分,可以縱向拆分,可以橫向縱向拆分,還可以按照業(yè)務(wù)拆分。

 

6.1.1橫向拆分

Mysql庫(kù)里面的橫向拆分是指,每一個(gè)數(shù)據(jù)庫(kù)實(shí)例里面都有很多個(gè)db庫(kù),每一個(gè)db庫(kù)里面都有AB表,比如db1庫(kù)有AB表,db2庫(kù)里也有A表和B表,那么我們把db1、db2庫(kù)的AB表拆分出來(lái),把一個(gè)庫(kù)分成2個(gè),就拆分成db1、db2、db3、db4,其中db1庫(kù)和db2庫(kù)放A表數(shù)據(jù),db3庫(kù)和db4庫(kù)放B表的數(shù)據(jù),db1db2庫(kù)里面只有A表數(shù)據(jù),db3db4庫(kù)里面只有B表的數(shù)據(jù)。

打個(gè)比方,作為電商來(lái)說(shuō),每個(gè)庫(kù)里面都有日志表和訂單表,假如A表是日志表log表,B表是訂單表Order表,一般說(shuō)來(lái)寫日志和寫訂單沒(méi)有強(qiáng)關(guān)聯(lián)性,我們可以講A表日志表和B表訂單表拆分出來(lái)。那么這個(gè)時(shí)候就做了一次橫向的拆分工作,將A表日志表和B表訂單表拆分開(kāi)來(lái)放在不同的庫(kù),當(dāng)然A表和B表所在的數(shù)據(jù)庫(kù)名也可以保持一致(PS:在不同的實(shí)例里面),如下圖所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

PS:這種拆分主要針對(duì)于不同的業(yè)務(wù)對(duì)表的影響不大,表之間的業(yè)務(wù)關(guān)聯(lián)很弱或者基本上沒(méi)有業(yè)務(wù)關(guān)聯(lián)。拆分的好處是不相關(guān)的數(shù)據(jù)表拆分到不同的實(shí)例里面,對(duì)數(shù)據(jù)庫(kù)的容量擴(kuò)展和性能提高的均衡來(lái)說(shuō),都是蠻有好處的。

 

6.1.2縱向拆分

         把同一個(gè)實(shí)例上的不同的db庫(kù)拆分出來(lái),放入單獨(dú)的不同實(shí)例中。這種拆分的適應(yīng)場(chǎng)景和要求是db1db2是沒(méi)有多少業(yè)務(wù)聯(lián)系的,類似6.1.2里面的A表和B表那樣。如果你用到了跨庫(kù)業(yè)務(wù)同時(shí)使用db1db2的話,個(gè)人建議要重新考慮下業(yè)務(wù),重新梳理下盡量把一個(gè)模塊的表放在一個(gè)庫(kù)里面,不要垮庫(kù)操作。

         這種庫(kù)縱向拆分里面,單獨(dú)的庫(kù)db1,表A和表B是強(qiáng)關(guān)聯(lián)的。如下圖所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

PS看到很多使用mysql的人,總是把很多沒(méi)有業(yè)務(wù)關(guān)聯(lián)性的表放在一個(gè)庫(kù)里面,或者總是把很多個(gè)的db庫(kù)放在同一個(gè)實(shí)例里面,就像使用oracle那樣就一個(gè)instance的概念而已。Mysql的使用一大原則就是簡(jiǎn)單,盡量單一,簡(jiǎn)單的去使用mysql,庫(kù)要嚴(yán)格的分開(kāi);表沒(méi)有關(guān)系的,要嚴(yán)格拆分成庫(kù)。這樣的話擴(kuò)展我們的業(yè)務(wù)就非常方便簡(jiǎn)單了,只需要把業(yè)務(wù)模塊所在的db拆分出來(lái),放入新的數(shù)據(jù)庫(kù)服務(wù)器上即可。

 

6.1.3 橫向縱向拆分

有些剛起步的,開(kāi)始為了快速出產(chǎn)品,就把所以的庫(kù)所有的表都放在一個(gè)實(shí)例上,等業(yè)務(wù)發(fā)展后,就面臨著數(shù)據(jù)拆分,這里就會(huì)把橫向縱向拆分結(jié)合起來(lái),一起實(shí)現(xiàn),如下圖所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

6.1.4 業(yè)務(wù)拆分

         跟水平拆分有點(diǎn)類似,但是有不同的地方。比如一個(gè)供應(yīng)商,可能整個(gè)網(wǎng)站上有10個(gè)供應(yīng)商,一個(gè)網(wǎng)站上面每一個(gè)供應(yīng)商都有一定的量,而且供應(yīng)商之間的數(shù)據(jù)量規(guī)模都差不多的規(guī)模,那么這個(gè)時(shí)候就可以使用供應(yīng)商的緯度來(lái)做拆分。

         比如usern庫(kù)中,a、b、c表都是強(qiáng)關(guān)聯(lián)的,都有完整的業(yè)務(wù)邏輯存在,這里只有用戶(供應(yīng)商)緯度是沒(méi)有關(guān)聯(lián)的,那這個(gè)時(shí)候就可以把數(shù)據(jù)以用戶的緯度來(lái)進(jìn)行拆分。

         就是用戶1和用戶2各自都有一套完整的業(yè)務(wù)邏輯,而且彼此之間不關(guān)聯(lián),所以就可以把用戶1和用戶2數(shù)據(jù)拆分到不同的數(shù)據(jù)庫(kù)實(shí)例上面。目前很多互聯(lián)網(wǎng)公司或者游戲公司有很多業(yè)務(wù)都是以用戶緯度進(jìn)行拆分的,比如qunaer、sohu game、sina等。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

6.2) 水平拆分

         水平拆分相對(duì)要簡(jiǎn)單一些,但是難度偏大,會(huì)導(dǎo)致分布式的情況、跨數(shù)據(jù)的情況、跨事務(wù)的情況可以分為大概三類,1是歷史數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)拆分,2是單庫(kù)多表拆分,3是多庫(kù)多表拆分。

6.2.1 實(shí)時(shí)數(shù)據(jù)歷史數(shù)據(jù)的拆分

和歷史數(shù)據(jù)遷移是一樣的邏輯,就是要將online庫(kù)的數(shù)據(jù)遷移到listory的數(shù)據(jù)庫(kù)里面,對(duì)于實(shí)時(shí)的讀寫來(lái)說(shuō),數(shù)據(jù)是放在online db庫(kù)里面,對(duì)于時(shí)間較遠(yuǎn)的數(shù)據(jù)來(lái)說(shuō),是放在歷史History DB記錄庫(kù)里面的,這里的歷史庫(kù)可以是mysql也可以是別的nosql庫(kù)等。

        [MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解


 

6.2.2 單庫(kù)多表拆分

         主要不是解決容量問(wèn)題,而是解決性能問(wèn)題而擴(kuò)展的,加入當(dāng)前實(shí)例只有一個(gè)DB,有一個(gè)大表,一個(gè)大表就把整個(gè)實(shí)例占滿了,這個(gè)時(shí)候就不能拆分db了,因?yàn)橹挥幸粋€(gè)單表,這個(gè)時(shí)候我們就只能拆表了,拆表的方式主要是解決性能問(wèn)題,因?yàn)閱蝹€(gè)表越大,對(duì)于mysql來(lái)說(shuō)遍歷表的樹(shù)形結(jié)構(gòu)遍歷數(shù)據(jù)會(huì)消耗更多的資源,有時(shí)候一個(gè)簡(jiǎn)單的查詢就可能會(huì)引起整個(gè)db的很多葉子節(jié)點(diǎn)都要變動(dòng)。表的insert、updatedelete操作都會(huì)引起幾乎所有節(jié)點(diǎn)的變更,此時(shí)操作量會(huì)非常大,操作的時(shí)候讀寫性能都會(huì)很低,這個(gè)時(shí)候我們就可以考慮把大表拆分成多個(gè)小表,工作經(jīng)歷中是按照hash取模打散成16個(gè)小表,也有按照id主鍵/50取模打散到50個(gè)小表當(dāng)中,下圖實(shí)例是打散成2個(gè)小表。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

6.2.3 多庫(kù)多表拆分

         在單庫(kù)多表的基礎(chǔ)上,如果單庫(kù)空間資源已經(jīng)不足以提供業(yè)務(wù)支撐的話,可以考慮多庫(kù)多表的方式來(lái)做,解決了空間問(wèn)題和性能問(wèn)題,不過(guò)會(huì)有一個(gè)問(wèn)題就是跨庫(kù)查詢操作,查詢就會(huì)有另外的策略,比如說(shuō)加一個(gè)logic db層來(lái)實(shí)現(xiàn)跨庫(kù)跨實(shí)例自動(dòng)查詢,簡(jiǎn)單如下圖所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

6.2.4水平拆分小結(jié)

水平拆分原則:

-- a. 盡量均勻的拆分維度。

-- b. 盡量避免跨庫(kù)事務(wù)。

-- c. 盡量避免跨庫(kù)查詢。

設(shè)計(jì):

--a根據(jù)拆分維度,做mod進(jìn)行數(shù)據(jù)表拆分,大部分都是取模的拆分機(jī)制,比如hash16模原則等。

--b根據(jù)數(shù)據(jù)容量,劃分?jǐn)?shù)據(jù)庫(kù)拆分

數(shù)據(jù)操作

--a跨事務(wù)操作:分布式事務(wù),通過(guò)預(yù)寫日志的方式來(lái)間接地實(shí)現(xiàn)。

--b跨庫(kù)查詢:數(shù)據(jù)匯總or消息服務(wù)

6.2.5 案例說(shuō)明

u  案例:

–      按照用戶維度進(jìn)行拆分成64個(gè)分庫(kù),1024個(gè)分表

?       user_id%1024 拆分到1024張分表中

?       每個(gè)分庫(kù)中存放1024/64張分表

?       取模的時(shí)候,可以用id的最后4位數(shù)據(jù)或者3位數(shù)字來(lái)取模就可以了。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

u  操作1:采用Configure DB

–      拆分之后的查詢操作,做一個(gè)Configure DB,這個(gè)DB存放的是所有實(shí)例的庫(kù)表的映射關(guān)系,當(dāng)我APP發(fā)來(lái)有一個(gè)請(qǐng)求查詢user1的數(shù)據(jù),那么這個(gè)user1的數(shù)據(jù)是存放在上千個(gè)實(shí)例中的哪一個(gè)庫(kù)表呢?這個(gè)關(guān)聯(lián)信息就在Configure DB里面,APP先去Configure DB里面取得user1的關(guān)聯(lián)系信息(比如是存放在d_01庫(kù)上的t_0016表里面),然后APP根據(jù)關(guān)聯(lián)信息直接去查詢對(duì)應(yīng)的d_01實(shí)例的t_0016表里面取得數(shù)據(jù)。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

u  操作2:采用Proxy

–      拆分之后的查詢操作,做一個(gè)ProxyAPP訪問(wèn)Proxy,Proxy根據(jù)訪問(wèn)規(guī)則就可以直接路由到具體的db實(shí)例,生成新的sql去操作對(duì)應(yīng)的db實(shí)例,然后通過(guò)Proxy協(xié)議進(jìn)行操作把操作結(jié)果返回給APP

–      優(yōu)勢(shì)是Proxydb實(shí)例是在一個(gè)網(wǎng)段,這樣Proxydb實(shí)例的操作的時(shí)間是非常短的。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

u  操作3:采用Data Engine

–      拆分之后的查詢操作,有一個(gè)Data Engine Service,這個(gè)DES里面配置了所有數(shù)據(jù)庫(kù)實(shí)例的映射關(guān)系,需要在APP應(yīng)用端安裝一個(gè)Agent,是同步邏輯,在JDBC層實(shí)現(xiàn),DES可以實(shí)現(xiàn)讀寫分離,原理可以參考TDDL的實(shí)現(xiàn)。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

6.3 集群管理

縱向擴(kuò)容:一個(gè)實(shí)例拆分成多個(gè)實(shí)例,縱向拆分比較簡(jiǎn)單,修改的東西比較少,拆分的時(shí)候要通知到Configure DB或者DES,以免拆分之后查詢不到數(shù)據(jù)或者數(shù)據(jù)錄入不到新的db上面,如下圖所示:

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解

 

橫向擴(kuò)容:比較復(fù)雜,在縱向擴(kuò)容成2個(gè)庫(kù)的基礎(chǔ)之上,再一次對(duì)庫(kù)的表進(jìn)行擴(kuò)容,所以需要及時(shí)通知Configure DBDES更細(xì)庫(kù)和表的路由連接信息。

[MySQL] 從業(yè)務(wù)層面對(duì)MySQL高可用方案進(jìn)行分解


----------------------------------------------------------------------------------------------------------------

<版權(quán)所有,文章允許轉(zhuǎn)載,但必須以鏈接方式注明源地址,否則追究法律責(zé)任!>
原文章地址:http://blog.itpub.net/26230597/viewspace-1289714/

----------------------------------------------------------------------------------------------------------------

PS:來(lái)自學(xué)習(xí)MySQL
MySQL數(shù)據(jù)庫(kù)運(yùn)維課程的收獲。


向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