假設(shè):1~2億條數(shù)據(jù)需要緩存,請(qǐng)問(wèn)如何設(shè)計(jì)這個(gè)存儲(chǔ)案例
單機(jī)單臺(tái)100%不可能,肯定是分布式存儲(chǔ),用redis如何落地?
一般業(yè)界有3種解決方案。
解決方案
1.哈希取余分區(qū)
2億條記錄就是2億個(gè)k,v,我們單機(jī)不行必須要分布式多機(jī),假設(shè)有3臺(tái)機(jī)器構(gòu)成一個(gè)集群,用戶每次讀寫(xiě)操作都是根據(jù)公式:
hash(key) % N個(gè)機(jī)器臺(tái)數(shù),計(jì)算出哈希值,用來(lái)決定數(shù)據(jù)映射到哪一個(gè)節(jié)點(diǎn)上。
優(yōu)點(diǎn):
簡(jiǎn)單粗暴,直接有效,只需要預(yù)估好數(shù)據(jù)規(guī)劃好節(jié)點(diǎn),例如3臺(tái)、8臺(tái)、10臺(tái),就能保證一段時(shí)間的數(shù)據(jù)支撐。使用Hash算法讓固定的一部分請(qǐng)求落到同一臺(tái)服務(wù)器上,這樣每臺(tái)服務(wù)器固定處理一部分請(qǐng)求(并維護(hù)這些請(qǐng)求的信息),起到負(fù)載均衡+分而治之的作用。
缺點(diǎn):
原來(lái)規(guī)劃好的節(jié)點(diǎn),進(jìn)行擴(kuò)容或者縮容就比較麻煩了額,不管擴(kuò)縮,每次數(shù)據(jù)變動(dòng)導(dǎo)致節(jié)點(diǎn)有變動(dòng),映射關(guān)系需要重新進(jìn)行計(jì)算,在服務(wù)器個(gè)數(shù)固定不變時(shí)沒(méi)有問(wèn)題,如果需要彈性擴(kuò)容或故障停機(jī)的情況下,原來(lái)的取模公式就會(huì)發(fā)生變化:Hash(key)/3會(huì)變成Hash(key) /?。此時(shí)地址經(jīng)過(guò)取余運(yùn)算的結(jié)果將發(fā)生很大變化,根據(jù)公式獲取的服務(wù)器也會(huì)變得不可控。
某個(gè)redis機(jī)器宕機(jī)了,由于臺(tái)數(shù)數(shù)量變化,會(huì)導(dǎo)致hash取余全部數(shù)據(jù)重新洗牌。
?