看板 Soft_Job 關於我們 聯絡資訊
問題一 如果使用memcache 寫db的時候 1. 先invalidate cache 再寫db 2. 先寫db 再invaludate cache 3. update cache 然後 update db 4. update db 然後 update cache 我以為這個動作有標準做法,但是問了在亞馬和snapchat的朋友 也看了幾個tech talk 竟然答案不同,請問大家怎麼分析? 我上了一個網路課程的課,他說2是最佳解 case3 & 4 如果某一個update fail都會造成cache裡面髒數據的情況 case1: user1 invalidate cache, while updating db(未完成) user2 此時讀資料,cache miss,去讀資料庫,得到舊數據, 並用舊數據update cache user1 完成db更新 此時cache存著舊數據,db新數據,cache髒數據 case2: user1 update db (未完成) user2 此時讀資料,在cache讀了舊資料,離開 user1 finish db and update cache 以後的user都可以讀到最新數據,只有user2讀了舊數據,但僅只一次,無傷大雅 問題二 還有一個問題,關於db consistency 如果用relational db, such as MySQL , Master Slave write to master, read from slave 寫到master之後(假設user update一個url link),並且invalid cache 這時候replication還沒完成,假設有5秒的延遲 這個時候如果來了一個read,cache miss 按照邏輯,這時候應該slave read , 但這時候slave data是舊的 那我的client要怎麼處理? reddit founder 他說當初他們碰到這情況 很多slave裡面的link都是404 very bad user experience 所以他寫db的時候,同時寫到cache https://youtu.be/cDL7ny_hvio?t=50s
但如果同時寫DB & cache 如果其中一個操作失敗了,那就造成髒數據了,不是嗎? 又如果 我採用問題一的方式 先寫db 然後invalidate cache, write to master db , 5 sec replication time 這時候一個read進來, cache miss, read from slave取得舊數據 順便update cache 五秒後slave完成replica,但這時候也造成了數據不一致。 replication latency的問題該怎麼解決呢? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 172.89.32.145 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1533190771.A.429.html
meowyih: 我不是搞資料庫的, 不過我有認真看了一遍這篇文章, 唯一 08/02 21:05
meowyih: 的疑問是所有的問題都建立在 "cache 機制無法暫時關閉, 08/02 21:06
meowyih: 開了就開了" 的前題下。但是為什麼不能暫時關閉? 都能整 08/02 21:07
meowyih: 個砍掉了, 寫個判斷機制讓自己後端暫時停止 cache 直到 08/02 21:07
meowyih: 資料庫更新完 (像 q1, case 1) 不就好了? 都能整個砍掉了 08/02 21:08
meowyih: 暫時停止沒差吧 08/02 21:08
meowyih: 所謂的 "暫時停止" 指的是不讓人讀取 cache, 當 cache 不 08/02 21:09
meowyih: 存在的意思 08/02 21:09
x000032001: 假設cache每秒可處理10k req db每秒只有2k req 08/02 21:28
youtuuube000: 想了解+1 08/02 21:29
x000032001: 把資料放在cache的目的是避免大量req直接打db 讀資料 08/02 21:29
x000032001: 一旦在更新時disable cache, req灌進db 那就失去用 08/02 21:30
x000032001: cache緩解req的用意了 08/02 21:31
x000032001: 我覺得你的問題其實把 Scaling Memcache at Facebook 08/02 21:47
x000032001: 看一看就自然知道惹 08/02 21:47
keyut2433: post request的同時給cookie,告訴dns這幾秒內的get會 08/03 05:33
keyut2433: 送到master拿最新的data, 等cookie過期時再轉到slave 08/03 05:34
x000032001: 其他user因為不可能set的到他的cookie所以還是會從sl 08/03 09:07
x000032001: ave拿到old value 08/03 09:07
keyut2433: 你沒錯.那只能讓slave抓masterDB的資料了.. 感謝 08/03 10:48
twntwn: 若需要Strict Relication Consitency 的Query,從master拿 08/05 23:26
twntwn: 其它的可以從Slave拿. 08/05 23:26