主從DB與cache一致性

轉(zhuǎn)載:主從DB與cache一致性

本文主要討論這么幾個(gè)問(wèn)題:

(1)數(shù)據(jù)庫(kù)主從延時(shí)為何會(huì)導(dǎo)致緩存數(shù)據(jù)不一致

(2)優(yōu)化思路與方案

一、需求緣起

上一篇《緩存架構(gòu)設(shè)計(jì)細(xì)節(jié)二三事》中有一個(gè)小優(yōu)化點(diǎn),在只有主庫(kù)時(shí),通過(guò)“串行化”的思路可以解決緩存與數(shù)據(jù)庫(kù)中數(shù)據(jù)不一致。引發(fā)大家熱烈討論的點(diǎn)是“在主從同步,讀寫(xiě)分離的數(shù)據(jù)庫(kù)架構(gòu)下,有可能出現(xiàn)臟數(shù)據(jù)入緩存的情況,此時(shí)串行化方案不再適用了”,這就是本文要討論的主題。

二、為什么數(shù)據(jù)會(huì)不一致

為什么會(huì)讀到臟數(shù)據(jù),有這么幾種情況:

(1)單庫(kù)情況下,服務(wù)層的并發(fā)讀寫(xiě),緩存與數(shù)據(jù)庫(kù)的操作交叉進(jìn)行

雖然只有一個(gè)DB,在上述詭異異常時(shí)序下,也可能臟數(shù)據(jù)入緩存:

1)請(qǐng)求A發(fā)起一個(gè)寫(xiě)操作,第一步淘汰了cache,然后這個(gè)請(qǐng)求因?yàn)楦鞣N原因在服務(wù)層卡住了(進(jìn)行大量的業(yè)務(wù)邏輯計(jì)算,例如計(jì)算了1秒鐘),如上圖步驟1

2)請(qǐng)求B發(fā)起一個(gè)讀操作,讀cache,cache miss,如上圖步驟2

3)請(qǐng)求B繼續(xù)讀DB,讀出來(lái)一個(gè)臟數(shù)據(jù),然后臟數(shù)據(jù)入cache,如上圖步驟3

4)請(qǐng)求A卡了很久后終于寫(xiě)數(shù)據(jù)庫(kù)了,寫(xiě)入了最新的數(shù)據(jù),如上圖步驟4

這種情況雖然少見(jiàn),但理論上是存在的,后發(fā)起的請(qǐng)求B在先發(fā)起的請(qǐng)求A中間完成了。

(2)主從同步,讀寫(xiě)分離的情況下,讀從庫(kù)讀到舊數(shù)據(jù)

在數(shù)據(jù)庫(kù)架構(gòu)做了一主多從,讀寫(xiě)分離時(shí),更多的臟數(shù)據(jù)入緩存是下面這種情況:

1)請(qǐng)求A發(fā)起一個(gè)寫(xiě)操作,第一步淘汰了cache,如上圖步驟1

2)請(qǐng)求A寫(xiě)數(shù)據(jù)庫(kù)了,寫(xiě)入了最新的數(shù)據(jù),如上圖步驟2

3)請(qǐng)求B發(fā)起一個(gè)讀操作,讀cache,cache miss,如上圖步驟3

4)請(qǐng)求B繼續(xù)讀DB,讀的是從庫(kù),此時(shí)主從同步還沒(méi)有完成,讀出來(lái)一個(gè)臟數(shù)據(jù),然后臟數(shù)據(jù)入cache,如上圖步4

5)最后數(shù)據(jù)庫(kù)的主從同步完成了,如上圖步驟5

這種情況請(qǐng)求A和請(qǐng)求B的時(shí)序是完全沒(méi)有問(wèn)題的,是主動(dòng)同步的時(shí)延(假設(shè)延時(shí)1秒鐘)中間有讀請(qǐng)求讀從庫(kù)讀到臟數(shù)據(jù)導(dǎo)致的不一致。

那怎么來(lái)進(jìn)行優(yōu)化呢?

三、不一致優(yōu)化思路

有同學(xué)說(shuō)“那能不能先操作數(shù)據(jù)庫(kù),再淘汰緩存”,這個(gè)是不行的,在《緩存和數(shù)據(jù)庫(kù)先操作誰(shuí)》的文章中介紹過(guò)。

出現(xiàn)不一致的根本原因:

(1)單庫(kù)情況下,服務(wù)層在進(jìn)行1s的邏輯計(jì)算過(guò)程中,可能讀到舊數(shù)據(jù)入緩存

(2)主從庫(kù)+讀寫(xiě)分離情況下,在1s鐘主從同步延時(shí)過(guò)程中,可能讀到舊數(shù)據(jù)入緩存

既然舊數(shù)據(jù)就是在那1s的間隙中入緩存的,是不是可以在寫(xiě)請(qǐng)求完成后,再休眠1s,再次淘汰緩存,就能將這1s內(nèi)寫(xiě)入的臟數(shù)據(jù)再次淘汰掉呢?

答案是可以的。

寫(xiě)請(qǐng)求的步驟由2步升級(jí)為3步:

(1)先淘汰緩存

(2)再寫(xiě)數(shù)據(jù)庫(kù)(這兩步和原來(lái)一樣)

(3)休眠1秒,再次淘汰緩存

這樣的話(huà),1秒內(nèi)有臟數(shù)據(jù)如緩存,也會(huì)被再次淘汰掉,但帶來(lái)的問(wèn)題是:

(1)所有的寫(xiě)請(qǐng)求都阻塞了1秒,大大降低了寫(xiě)請(qǐng)求的吞吐量,增長(zhǎng)了處理時(shí)間,業(yè)務(wù)上是接受不了的

再次分析,其實(shí)第二次淘汰緩存是“為了保證緩存一致”而做的操作,而不是“業(yè)務(wù)要求”,所以其實(shí)無(wú)需等待,用一個(gè)異步的timer,或者利用消息總線異步的來(lái)做這個(gè)事情即可

寫(xiě)請(qǐng)求由2步升級(jí)為2.5步:

(1)先淘汰緩存

(2)再寫(xiě)數(shù)據(jù)庫(kù)(這兩步和原來(lái)一樣)

(2.5)不再休眠1s,而是往消息總線esb發(fā)送一個(gè)消息,發(fā)送完成之后馬上就能返回

這樣的話(huà),寫(xiě)請(qǐng)求的處理時(shí)間幾乎沒(méi)有增加,這個(gè)方法淘汰了緩存兩次,因此被稱(chēng)為“緩存雙淘汰”法。這個(gè)方法付出的代價(jià)是,緩存會(huì)增加1次cache miss(代價(jià)幾乎可以忽略)。

而在下游,有一個(gè)異步淘汰緩存的消費(fèi)者,在接收到消息之后,asy-expire在1s之后淘汰緩存。這樣,即使1s內(nèi)有臟數(shù)據(jù)入緩存,也有機(jī)會(huì)再次被淘汰掉。

上述方案有一個(gè)缺點(diǎn),需要業(yè)務(wù)線的寫(xiě)操作增加一個(gè)步驟,有沒(méi)有方案對(duì)業(yè)務(wù)線的代碼沒(méi)有任何入侵呢,是有的,這個(gè)方案在《細(xì)聊冗余表數(shù)據(jù)一致性》中也提到過(guò),通過(guò)分析線下的binlog來(lái)異步淘汰緩存:

業(yè)務(wù)線的代碼就不需要?jiǎng)恿耍略鲆粋€(gè)線下的讀binlog的異步淘汰模塊,讀取到binlog中的數(shù)據(jù),異步的淘汰緩存。

提問(wèn):為什么上文總是說(shuō)1s,這個(gè)1s是怎么來(lái)的?

回答:1s只是一個(gè)舉例,需要根據(jù)業(yè)務(wù)的數(shù)據(jù)量與并發(fā)量,觀察主從同步的時(shí)延來(lái)設(shè)定這個(gè)值。例如主從同步的時(shí)延為200ms,這個(gè)異步淘汰cache設(shè)置為258ms就是OK的。

四、總結(jié)

在“異常時(shí)序”或者“讀從庫(kù)”導(dǎo)致臟數(shù)據(jù)入緩存時(shí),可以用二次異步淘汰的“緩存雙淘汰”法來(lái)解決緩存與數(shù)據(jù)庫(kù)中數(shù)據(jù)不一致的問(wèn)題,具體實(shí)施至少有三種方案:

(1)timer異步淘汰(本文沒(méi)有細(xì)講,本質(zhì)就是起個(gè)線程專(zhuān)門(mén)異步二次淘汰緩存)

(2)總線異步淘汰

(3)讀binlog異步淘汰

==【完】==

回【冗余】細(xì)聊冗余表數(shù)據(jù)一致性

回【一致】緩存與數(shù)據(jù)庫(kù)一致性保證

回【緩存】緩存架構(gòu)設(shè)計(jì)細(xì)節(jié)二三事

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,083評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,706評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,802評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,983評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,116評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,412評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容