DDBS 分布式DB與Cache一致性

上一節(jié)的文章,我們是基于單一業(yè)務(wù)(請求)來討論的烁涌,也就是一個串行的結(jié)果苍碟。實際上,業(yè)務(wù)可能不只一個烹玉,在主從同步驰怎,讀寫分離的數(shù)據(jù)庫架構(gòu)下,有可能出現(xiàn)臟數(shù)據(jù)入緩存的情況二打,此時串行化方案不再適用了。

為什么數(shù)據(jù)會不一致

單庫情況下掂榔,服務(wù)層的并發(fā)讀寫继效,緩存與數(shù)據(jù)庫的操作交叉進行:


雖然只有一個DB症杏,在上述詭異異常時序下,也可能臟數(shù)據(jù)入緩存:
1)請求A發(fā)起一個寫操作瑞信,第一步淘汰了cache厉颤,然后這個請求因為各種原因在服務(wù)層卡住了(進行大量的業(yè)務(wù)邏輯計算,例如計算了1秒鐘)凡简,如上圖步驟1
2)請求B發(fā)起一個讀操作逼友,讀cache,cache miss秤涩,如上圖步驟2
3)請求B繼續(xù)讀DB帜乞,讀出來一個臟數(shù)據(jù),然后臟數(shù)據(jù)入cache筐眷,如上圖步驟3
4)請求A卡了很久后終于寫數(shù)據(jù)庫了黎烈,寫入了最新的數(shù)據(jù),如上圖步驟4
這種情況雖然少見匀谣,但理論上是存在的照棋, 后發(fā)起的請求B在先發(fā)起的請求A中間完成了。

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


1)請求A發(fā)起一個寫操作,第一步淘汰了cache宝恶,如上圖步驟1
2)請求A寫數(shù)據(jù)庫了符隙,寫入了最新的數(shù)據(jù),如上圖步驟2
3)請求B發(fā)起一個讀操作卑惜,讀cache膏执,cache miss,如上圖步驟3
4)請求B繼續(xù)讀DB露久,讀的是從庫更米,此時主從同步還沒有完成,讀出來一個臟數(shù)據(jù)毫痕,然后臟數(shù)據(jù)入cache征峦,如上圖步4
5)最后數(shù)據(jù)庫的主從同步完成了,如上圖步驟5

這種情況請求A和請求B的時序是完全沒有問題的消请,是主動同步的時延(假設(shè)延時1秒鐘)中間有讀請求讀從庫讀到臟數(shù)據(jù)導(dǎo)致的不一致栏笆。

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

出現(xiàn)不一致的根本原因:
(1)單庫情況下,服務(wù)層在進行1s的邏輯計算過程中臊泰,可能讀到舊數(shù)據(jù)入緩存
(2)主從庫+讀寫分離情況下蛉加,在1s鐘主從同步延時過程中,可能讀到舊數(shù)據(jù)入緩存

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

答案是可以的筷凤。

寫請求的步驟由2步升級為3步:
(1)先淘汰緩存
(2)再寫數(shù)據(jù)庫(這兩步和原來一樣)
(3)休眠1秒,再次淘汰緩存
這樣的話苞七,1秒內(nèi)有臟數(shù)據(jù)如緩存藐守,也會被再次淘汰掉,但帶來的問題是:
所有的寫請求都阻塞了1秒蹂风,大大降低了寫請求的吞吐量卢厂,增長了處理時間,業(yè)務(wù)上是接受不了的硫眨。

這里的1秒是為了方便理解足淆,實際上需要根據(jù)業(yè)務(wù)的數(shù)據(jù)量與并發(fā)量,觀察主從同步的時延來設(shè)定這個值礁阁。例如主從同步的時延為200ms巧号,這個異步淘汰cache設(shè)置為258ms就是OK的。



再次分析姥闭,其實第二次淘汰緩存是“為了保證緩存一致”而做的操作丹鸿,而不是“業(yè)務(wù)要求”,所以其實無需等待棚品,用一個異步的timer靠欢,或者利用消息總線異步的來做這個事情即可:

寫請求由2步升級為2.5步:
(1)先淘汰緩存
(2)再寫數(shù)據(jù)庫(這兩步和原來一樣)
(2.5)不再休眠1s,而是往消息總線esb發(fā)送一個消息铜跑,發(fā)送完成之后馬上就能返回

這樣的話门怪,寫請求的處理時間幾乎沒有增加,這個方法淘汰了緩存兩次锅纺,因此被稱為“緩存雙淘汰”法掷空。這個方法付出的代價是,緩存會增加1次cache miss(代價幾乎可以忽略)囤锉。

而在下游坦弟,有一個異步淘汰緩存的消費者,在接收到消息之后官地,asy-expire在1s之后淘汰緩存酿傍。這樣,即使1s內(nèi)有臟數(shù)據(jù)入緩存驱入,也有機會再次被淘汰掉赤炒。

上述方案有一個缺點氯析,需要業(yè)務(wù)線的寫操作增加一個步驟,有沒有方案對業(yè)務(wù)線的代碼沒有任何入侵呢可霎?
通過分析線下的binlog來異步淘汰緩存


業(yè)務(wù)線的代碼就不需要動了魄鸦,新增一個線下的讀binlog的異步淘汰模塊宴杀,讀取到binlog中的數(shù)據(jù)癣朗,異步的淘汰緩存。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旺罢,一起剝皮案震驚了整個濱河市旷余,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扁达,老刑警劉巖正卧,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跪解,居然都是意外死亡炉旷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門叉讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窘行,“玉大人,你說我怎么就攤上這事图仓」蘅” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵救崔,是天一觀的道長惶看。 經(jīng)常有香客問我,道長六孵,這世上最難降的妖魔是什么纬黎? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮劫窒,結(jié)果婚禮上本今,老公的妹妹穿的比我還像新娘。我一直安慰自己烛亦,他們只是感情好诈泼,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著煤禽,像睡著了一般铐达。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檬果,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天瓮孙,我揣著相機與錄音唐断,去河邊找鬼。 笑死杭抠,一個胖子當著我的面吹牛脸甘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偏灿,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丹诀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翁垂?” 一聲冷哼從身側(cè)響起铆遭,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沿猜,沒想到半個月后枚荣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡啼肩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年橄妆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈坠。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡害碾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颁虐,到底是詐尸還是另有隱情蛮原,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布另绩,位于F島的核電站儒陨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笋籽。R本人自食惡果不足惜蹦漠,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望车海。 院中可真熱鬧笛园,春花似錦、人聲如沸侍芝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州叠。三九已至棵红,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咧栗,已是汗流浹背逆甜。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工虱肄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人交煞。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓咏窿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親素征。 傳聞我的和親對象是個殘疾皇子集嵌,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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