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

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

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

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

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

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

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

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