[請益] rds replication & cache 多問

看板Soft_Job (軟體人)作者 (.)時間7年前 (2018/08/02 14:19), 編輯推噓3(3019)
留言22則, 5人參與, 7年前最新討論串1/4 (看更多)
問題一 如果使用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

08/02 21:05, 7年前 , 1F
我不是搞資料庫的, 不過我有認真看了一遍這篇文章, 唯一
08/02 21:05, 1F

08/02 21:06, 7年前 , 2F
的疑問是所有的問題都建立在 "cache 機制無法暫時關閉,
08/02 21:06, 2F

08/02 21:07, 7年前 , 3F
開了就開了" 的前題下。但是為什麼不能暫時關閉? 都能整
08/02 21:07, 3F

08/02 21:07, 7年前 , 4F
個砍掉了, 寫個判斷機制讓自己後端暫時停止 cache 直到
08/02 21:07, 4F

08/02 21:08, 7年前 , 5F
資料庫更新完 (像 q1, case 1) 不就好了? 都能整個砍掉了
08/02 21:08, 5F

08/02 21:08, 7年前 , 6F
暫時停止沒差吧
08/02 21:08, 6F

08/02 21:09, 7年前 , 7F
所謂的 "暫時停止" 指的是不讓人讀取 cache, 當 cache 不
08/02 21:09, 7F

08/02 21:09, 7年前 , 8F
存在的意思
08/02 21:09, 8F

08/02 21:28, 7年前 , 9F
假設cache每秒可處理10k req db每秒只有2k req
08/02 21:28, 9F

08/02 21:29, 7年前 , 10F
想了解+1
08/02 21:29, 10F

08/02 21:29, 7年前 , 11F
把資料放在cache的目的是避免大量req直接打db 讀資料
08/02 21:29, 11F

08/02 21:30, 7年前 , 12F
一旦在更新時disable cache, req灌進db 那就失去用
08/02 21:30, 12F

08/02 21:31, 7年前 , 13F
cache緩解req的用意了
08/02 21:31, 13F

08/02 21:47, 7年前 , 14F
我覺得你的問題其實把 Scaling Memcache at Facebook
08/02 21:47, 14F

08/02 21:47, 7年前 , 15F
看一看就自然知道惹
08/02 21:47, 15F

08/03 05:33, 7年前 , 16F
post request的同時給cookie,告訴dns這幾秒內的get會
08/03 05:33, 16F

08/03 05:34, 7年前 , 17F
送到master拿最新的data, 等cookie過期時再轉到slave
08/03 05:34, 17F

08/03 09:07, 7年前 , 18F
其他user因為不可能set的到他的cookie所以還是會從sl
08/03 09:07, 18F

08/03 09:07, 7年前 , 19F
ave拿到old value
08/03 09:07, 19F

08/03 10:48, 7年前 , 20F
你沒錯.那只能讓slave抓masterDB的資料了.. 感謝
08/03 10:48, 20F

08/05 23:26, 7年前 , 21F
若需要Strict Relication Consitency 的Query,從master拿
08/05 23:26, 21F

08/05 23:26, 7年前 , 22F
其它的可以從Slave拿.
08/05 23:26, 22F
文章代碼(AID): #1ROg9pGf (Soft_Job)
文章代碼(AID): #1ROg9pGf (Soft_Job)