作者sean72 (.)
看板Soft_Job
標題[請益] rds replication & cache 多問
時間Thu Aug 2 14:19:28 2018
問題一
如果使用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://webptt.com/m.aspx?n=bbs/Soft_Job/M.1533190771.A.429.html
1F:→ meowyih: 我不是搞資料庫的, 不過我有認真看了一遍這篇文章, 唯一 08/02 21:05
2F:→ meowyih: 的疑問是所有的問題都建立在 "cache 機制無法暫時關閉, 08/02 21:06
3F:→ meowyih: 開了就開了" 的前題下。但是為什麼不能暫時關閉? 都能整 08/02 21:07
4F:→ meowyih: 個砍掉了, 寫個判斷機制讓自己後端暫時停止 cache 直到 08/02 21:07
5F:→ meowyih: 資料庫更新完 (像 q1, case 1) 不就好了? 都能整個砍掉了 08/02 21:08
6F:→ meowyih: 暫時停止沒差吧 08/02 21:08
7F:→ meowyih: 所謂的 "暫時停止" 指的是不讓人讀取 cache, 當 cache 不 08/02 21:09
8F:→ meowyih: 存在的意思 08/02 21:09
9F:→ x000032001: 假設cache每秒可處理10k req db每秒只有2k req 08/02 21:28
10F:推 youtuuube000: 想了解+1 08/02 21:29
11F:→ x000032001: 把資料放在cache的目的是避免大量req直接打db 讀資料 08/02 21:29
12F:→ x000032001: 一旦在更新時disable cache, req灌進db 那就失去用 08/02 21:30
13F:→ x000032001: cache緩解req的用意了 08/02 21:31
14F:→ x000032001: 我覺得你的問題其實把 Scaling Memcache at Facebook 08/02 21:47
15F:→ x000032001: 看一看就自然知道惹 08/02 21:47
16F:→ keyut2433: post request的同時給cookie,告訴dns這幾秒內的get會 08/03 05:33
17F:→ keyut2433: 送到master拿最新的data, 等cookie過期時再轉到slave 08/03 05:34
18F:推 x000032001: 其他user因為不可能set的到他的cookie所以還是會從sl 08/03 09:07
19F:→ x000032001: ave拿到old value 08/03 09:07
20F:推 keyut2433: 你沒錯.那只能讓slave抓masterDB的資料了.. 感謝 08/03 10:48
21F:→ twntwn: 若需要Strict Relication Consitency 的Query,從master拿 08/05 23:26
22F:→ twntwn: 其它的可以從Slave拿. 08/05 23:26