一、數(shù)據(jù)庫主從不一致
先回顧下,無緩存時,數(shù)據(jù)庫主從不一致問題。

如上圖,發(fā)生的場景是,寫后立刻讀:
主庫一個寫請求(主從沒同步完成)
從庫接著一個讀請求,讀到了舊數(shù)據(jù)
最后,主從同步完成
導(dǎo)致的結(jié)果是:主動同步完成之前,會讀取到舊數(shù)據(jù)。
可以看到,主從不一致的影響時間很短,在主從同步完成后,就會讀到新數(shù)據(jù)。
二、緩存與數(shù)據(jù)庫不一致
再看,引入緩存后,緩存和數(shù)據(jù)庫不一致問題。
如上圖,發(fā)生的場景也是,寫后立刻讀:
(1+2)先一個寫請求,淘汰緩存,寫數(shù)據(jù)庫
(3+4+5)接著立刻一個讀請求,讀緩存,cache miss,讀從庫,寫緩存放入數(shù)據(jù),以便后續(xù)的讀能夠cache hit(主從同步?jīng)]有完成,緩存中放入了舊數(shù)據(jù))
(6)最后,主從同步完成
導(dǎo)致的結(jié)果是:舊數(shù)據(jù)放入緩存,即使主從同步完成,后續(xù)仍然會從緩存一直讀取到舊數(shù)據(jù)。
可以看到,加入緩存后,導(dǎo)致的不一致影響時間會很長,并且最終也不會達(dá)到一致。
三、問題分析
可以看到,這里提到的緩存與數(shù)據(jù)庫數(shù)據(jù)不一致,根本上是由數(shù)據(jù)庫主從不一致引起的。當(dāng)主庫上發(fā)生寫操作之后,從庫binlog同步的時間間隔內(nèi),讀請求,可能導(dǎo)致有舊數(shù)據(jù)入緩存。
假如主從不一致沒法徹底解決,引入緩存之后,binlog同步時間間隔內(nèi),也無法避免讀舊數(shù)據(jù)。
但是,有沒有辦法做到,即使引入緩存,不一致不會比“不引入緩存”更糟呢?這是更為實際的優(yōu)化目標(biāo)。
思路轉(zhuǎn)化為:在從庫同步完成之后,如果有舊數(shù)據(jù)入緩存,應(yīng)該及時把這個舊數(shù)據(jù)淘汰掉。
四、不一致優(yōu)化
如上圖所述,在并發(fā)讀寫導(dǎo)致緩存中讀入了臟數(shù)據(jù)之后:
(6)主從同步
(7)通過工具訂閱從庫的binlog,這里能夠最準(zhǔn)確的知道,從庫數(shù)據(jù)同步完成的時間
畫外音:本圖畫的訂閱工具是DTS,可以是cannal,也可以自己訂閱和分析binlog
(8)從庫執(zhí)行完寫操作,向緩存再次發(fā)起刪除,淘汰這段時間內(nèi)可能寫入緩存的舊數(shù)據(jù)
如此這般,至少能夠保證,引入緩存之后,主從不一致,不會比沒有引入緩存更壞。
畫外音:即使引入緩存,也只有一個很小的時間間隔,可能讀到舊數(shù)據(jù)。
五、結(jié)尾
問:如何完全避免,主從同步時間差,數(shù)據(jù)的一致性?
答:詳見《數(shù)據(jù)庫主從不一致,怎么解?》。
問:該方案,只能優(yōu)化,并發(fā)讀寫情況下,緩存與數(shù)據(jù)庫一致性問題。如果,緩存與數(shù)據(jù)庫兩次操作,原子性被破壞(例如:修改數(shù)據(jù)庫成功,淘汰緩存失敗,導(dǎo)致的數(shù)據(jù)不一致),如何優(yōu)化數(shù)據(jù)的一致性呢?
-
緩存
+關(guān)注
關(guān)注
1文章
248瀏覽量
27833 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
4088瀏覽量
68598
發(fā)布評論請先 登錄
如何解決數(shù)據(jù)庫與緩存一致性
MAX一直顯示IP不一致怎么解決
如何解決STM32發(fā)送的數(shù)據(jù)與串口助手上面顯示數(shù)據(jù)不一致的問題?
基于偏好不一致熵的偏好決策方法
不一致數(shù)據(jù)上精確決策樹生成算法
感興趣區(qū)域不一致性決策算法
分布式大數(shù)據(jù)不一致性檢測
鋰電池組不一致性的原因及危害是怎樣的
鋰電池組不一致性的原因是什么,它的危害有哪些
緩存與數(shù)據(jù)庫一致性問題如何解決
什么是電芯的不一致性?電芯不一致會造成什么后果?
什么是鋰離子電池不一致性?如何提高鋰離子電池的一致性?
mysql主從復(fù)制數(shù)據(jù)不一致怎么辦
Sybase數(shù)據(jù)恢復(fù)—Sybase數(shù)據(jù)庫無法啟動怎么恢復(fù)數(shù)據(jù)?
緩存與數(shù)據(jù)庫出現(xiàn)不一致的情況如何解決
評論