W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
大部分互聯(lián)網(wǎng)的業(yè)務(wù)都是“讀多寫少”的場景,數(shù)據(jù)庫層面,讀性能往往成為瓶頸。如下圖:業(yè)界通常采用“一主多從,讀寫分離,冗余多個(gè)讀庫”的數(shù)據(jù)庫架構(gòu)來提升數(shù)據(jù)庫的讀性能。
(1)系統(tǒng)先對(duì)DB-master進(jìn)行了一個(gè)寫操作,寫主庫
(2)很短的時(shí)間內(nèi)并發(fā)進(jìn)行了一個(gè)讀操作,讀從庫,此時(shí)主從同步?jīng)]有完成,故讀取到了一個(gè)舊數(shù)據(jù)
(3)主從同步完成
不一致是因?yàn)閷懲瓿珊?,主從同步有一個(gè)時(shí)間差,假設(shè)是500ms,這個(gè)時(shí)間差有讀請(qǐng)求落到從庫上產(chǎn)生的。有沒有辦法做到,等主從同步完成之后,主庫上的寫請(qǐng)求再返回呢?答案是肯定的,就是大家常說的“半同步復(fù)制”semi-sync:
(1)系統(tǒng)先對(duì)DB-master進(jìn)行了一個(gè)寫操作,寫主庫
(2)等主從同步完成,寫主庫的請(qǐng)求才返回
(3)讀從庫,讀到最新的數(shù)據(jù)(如果讀請(qǐng)求先完成,寫請(qǐng)求后完成,讀取到的是“當(dāng)時(shí)”最新的數(shù)據(jù))
方案優(yōu)點(diǎn):利用數(shù)據(jù)庫原生功能,比較簡單
方案缺點(diǎn):主庫的寫請(qǐng)求時(shí)延會(huì)增長,吞吐量會(huì)降低
如果不使用“增加從庫”的方式來增加提升系統(tǒng)的讀性能,完全可以讀寫都落到主庫,這樣就不會(huì)出現(xiàn)不一致了:
方案優(yōu)點(diǎn):“一致性”上不需要進(jìn)行系統(tǒng)改造
方案缺點(diǎn):只能通過cache來提升系統(tǒng)的讀性能,這里要進(jìn)行系統(tǒng)改造
如果有了數(shù)據(jù)庫中間件,所有的數(shù)據(jù)庫請(qǐng)求都走中間件,這個(gè)主從不一致的問題可以這么解決:
(1)所有的讀寫都走數(shù)據(jù)庫中間件,通常情況下,寫請(qǐng)求路由到主庫,讀請(qǐng)求路由到從庫
(2)記錄所有路由到寫庫的key,在經(jīng)驗(yàn)主從同步時(shí)間窗口內(nèi)(假設(shè)是500ms),如果有讀請(qǐng)求訪問中間件,此時(shí)有可能從庫還是舊數(shù)據(jù),就把這個(gè)key上的讀請(qǐng)求路由到主庫
(3)經(jīng)驗(yàn)主從同步時(shí)間過完后,對(duì)應(yīng)key的讀請(qǐng)求繼續(xù)路由到從庫
方案優(yōu)點(diǎn):能保證絕對(duì)一致
方案缺點(diǎn):數(shù)據(jù)庫中間件的成本比較高
既然數(shù)據(jù)庫中間件的成本比較高,有沒有更低成本的方案來記錄某一個(gè)庫的某一個(gè)key上發(fā)生了寫請(qǐng)求呢?很容易想到使用緩存,當(dāng)寫請(qǐng)求發(fā)生的時(shí)候:
(1)將某個(gè)庫上的某個(gè)key要發(fā)生寫操作,記錄在cache里,并設(shè)置“經(jīng)驗(yàn)主從同步時(shí)間”的cache超時(shí)時(shí)間,例如500ms
(2)修改數(shù)據(jù)庫
(1)先到cache里查看,對(duì)應(yīng)庫的對(duì)應(yīng)key有沒有相關(guān)數(shù)據(jù)
(2)如果cache hit,有相關(guān)數(shù)據(jù),說明這個(gè)key上剛發(fā)生過寫操作,此時(shí)需要將請(qǐng)求路由到主庫讀最新的數(shù)據(jù)
(3)如果cache miss,說明這個(gè)key上近期沒有發(fā)生過寫操作,此時(shí)將請(qǐng)求路由到從庫,繼續(xù)讀寫分離
方案優(yōu)點(diǎn):相對(duì)數(shù)據(jù)庫中間件,成本較低
方案缺點(diǎn):為了保證“一致性”,引入了一個(gè)cache組件,并且讀寫數(shù)據(jù)庫時(shí)都多了一步cache操作
為了解決主從數(shù)據(jù)庫讀取舊數(shù)據(jù)的問題,常用的方案有四種:
(1)半同步復(fù)制
(2)強(qiáng)制讀主
(3)數(shù)據(jù)庫中間件
(4)緩存記錄寫key
前3個(gè)方案在今年數(shù)據(jù)庫大會(huì)(DTCC2016)上share過,相關(guān)的材料在網(wǎng)上能下載到。第4個(gè)方案是大會(huì)現(xiàn)場有其他同學(xué)share的一個(gè)好方法,感謝這位同學(xué)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: