《數(shù)據(jù)庫(kù)主從一致性架構(gòu)優(yōu)化4種方法》要點(diǎn):
本文介紹了數(shù)據(jù)庫(kù)主從一致性架構(gòu)優(yōu)化4種方法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
導(dǎo)讀:今天看到一篇非常不錯(cuò)的文章,DB主從一致性架構(gòu)優(yōu)化4種方法,整理一下分享給大家,希望對(duì)大家學(xué)習(xí)有所幫助.一、需求緣起大部分互聯(lián)網(wǎng)的業(yè)...
今天看到一篇非常不錯(cuò)的文章,DB主從一致性架構(gòu)優(yōu)化4種方法,整理一下分享給大家,希望對(duì)大家學(xué)習(xí)有所幫助.
一、需求緣起
大部分互聯(lián)網(wǎng)的業(yè)務(wù)都是“讀多寫少”的場(chǎng)景,數(shù)據(jù)庫(kù)層面,讀性能往往成為瓶頸.如下圖:業(yè)界通常采用“一主多從,讀寫分離,冗余多個(gè)讀庫(kù)”的數(shù)據(jù)庫(kù)架構(gòu)來(lái)提升數(shù)據(jù)庫(kù)的讀性能.

這種架構(gòu)的一個(gè)潛在缺點(diǎn)是,業(yè)務(wù)方有可能讀取到并不是最新的舊數(shù)據(jù):

(1)系統(tǒng)先對(duì)DB-master進(jìn)行了一個(gè)寫操作,寫主庫(kù)
(2)很短的時(shí)間內(nèi)并發(fā)進(jìn)行了一個(gè)讀操作,讀從庫(kù),此時(shí)主從同步?jīng)]有完成,故讀取到了一個(gè)舊數(shù)據(jù)
(3)主從同步完成
有沒(méi)有辦法解決或者緩解這類“由于主從延時(shí)導(dǎo)致讀取到舊數(shù)據(jù)”的問(wèn)題呢,這是本文要集中討論的問(wèn)題.
二、方案一(半同步復(fù)制)
不一致是因?yàn)閷懲瓿珊?主從同步有一個(gè)時(shí)間差,假設(shè)是500ms,這個(gè)時(shí)間差有讀請(qǐng)求落到從庫(kù)上產(chǎn)生的.有沒(méi)有辦法做到,等主從同步完成之后,主庫(kù)上的寫請(qǐng)求再返回呢?答案是肯定的,就是大家常說(shuō)的“半同步復(fù)制”semi-sync:

(1)系統(tǒng)先對(duì)DB-master進(jìn)行了一個(gè)寫操作,寫主庫(kù)
(2)等主從同步完成,寫主庫(kù)的請(qǐng)求才返回
(3)讀從庫(kù),讀到最新的數(shù)據(jù)(如果讀請(qǐng)求先完成,寫請(qǐng)求后完成,讀取到的是“當(dāng)時(shí)”最新的數(shù)據(jù))
方案優(yōu)點(diǎn):利用數(shù)據(jù)庫(kù)原生功能,比較簡(jiǎn)單
方案缺點(diǎn):主庫(kù)的寫請(qǐng)求時(shí)延會(huì)增長(zhǎng),吞吐量會(huì)降低
三、方案二(強(qiáng)制讀主庫(kù))
如果不使用“增加從庫(kù)”的方式來(lái)增加提升系統(tǒng)的讀性能,完全可以讀寫都落到主庫(kù),這樣就不會(huì)出現(xiàn)不一致了:

方案優(yōu)點(diǎn):“一致性”上不需要進(jìn)行系統(tǒng)改造
方案缺點(diǎn):只能通過(guò)cache來(lái)提升系統(tǒng)的讀性能,這里要進(jìn)行系統(tǒng)改造
四、方案三(數(shù)據(jù)庫(kù)中間件)
如果有了數(shù)據(jù)庫(kù)中間件,所有的數(shù)據(jù)庫(kù)請(qǐng)求都走中間件,這個(gè)主從不一致的問(wèn)題可以這么解決:

(1)所有的讀寫都走數(shù)據(jù)庫(kù)中間件,通常情況下,寫請(qǐng)求路由到主庫(kù),讀請(qǐng)求路由到從庫(kù)
(2)記錄所有路由到寫庫(kù)的key,在經(jīng)驗(yàn)主從同步時(shí)間窗口內(nèi)(假設(shè)是500ms),如果有讀請(qǐng)求訪問(wèn)中間件,此時(shí)有可能從庫(kù)還是舊數(shù)據(jù),就把這個(gè)key上的讀請(qǐng)求路由到主庫(kù)
(3)經(jīng)驗(yàn)主從同步時(shí)間過(guò)完后,對(duì)應(yīng)key的讀請(qǐng)求繼續(xù)路由到從庫(kù)
方案優(yōu)點(diǎn):能保證絕對(duì)一致
方案缺點(diǎn):數(shù)據(jù)庫(kù)中間件的成本比較高
五、方案四(緩存記錄寫key法)
既然數(shù)據(jù)庫(kù)中間件的成本比較高,有沒(méi)有更低成本的方案來(lái)記錄某一個(gè)庫(kù)的某一個(gè)key上發(fā)生了寫請(qǐng)求呢?很容易想到使用緩存,當(dāng)寫請(qǐng)求發(fā)生的時(shí)候:

(1)將某個(gè)庫(kù)上的某個(gè)key要發(fā)生寫操作,記錄在cache里,并設(shè)置“經(jīng)驗(yàn)主從同步時(shí)間”的cache超時(shí)時(shí)間,例如500ms
(2)修改數(shù)據(jù)庫(kù)
而讀請(qǐng)求發(fā)生的時(shí)候:

(1)先到cache里查看,對(duì)應(yīng)庫(kù)的對(duì)應(yīng)key有沒(méi)有相關(guān)數(shù)據(jù)
(2)如果cache hit,有相關(guān)數(shù)據(jù),說(shuō)明這個(gè)key上剛發(fā)生過(guò)寫操作,此時(shí)需要將請(qǐng)求路由到主庫(kù)讀最新的數(shù)據(jù)
(3)如果cache miss,說(shuō)明這個(gè)key上近期沒(méi)有發(fā)生過(guò)寫操作,此時(shí)將請(qǐng)求路由到從庫(kù),繼續(xù)讀寫分離
方案優(yōu)點(diǎn):相對(duì)數(shù)據(jù)庫(kù)中間件,成本較低
方案缺點(diǎn):為了保證“一致性”,引入了一個(gè)cache組件,并且讀寫數(shù)據(jù)庫(kù)時(shí)都多了一步cache操作
六、總結(jié)
為了解決主從數(shù)據(jù)庫(kù)讀取舊數(shù)據(jù)的問(wèn)題,常用的方案有四種:
(1)半同步復(fù)制
(2)強(qiáng)制讀主
(3)數(shù)據(jù)庫(kù)中間件
(4)緩存記錄寫key
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/5536.html