redis熱點(diǎn)Key發(fā)現(xiàn)及常見解決方案是怎樣的,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
成都創(chuàng)新互聯(lián)一直通過網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都做網(wǎng)站、成都網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營(yíng)銷服務(wù)為核心業(yè)務(wù)。十年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
在日常工作生活中一些突發(fā)的的事件,例如:雙十一期間某些熱門商品的降價(jià)促銷,當(dāng)這其中的某一件商品被數(shù)萬(wàn)次點(diǎn)擊瀏覽或者購(gòu)買時(shí),會(huì)形成一個(gè)較大的需求量,這種情況下就會(huì)造成熱點(diǎn)問題。
同理,被大量刊發(fā)、瀏覽的熱點(diǎn)新聞、熱點(diǎn)評(píng)論、明星直播等,這些典型的讀多寫少的場(chǎng)景也會(huì)產(chǎn)生熱點(diǎn)問題。
在服務(wù)端讀數(shù)據(jù)進(jìn)行訪問時(shí),往往會(huì)對(duì)數(shù)據(jù)進(jìn)行分片切分,此過程中會(huì)在某一主機(jī) Server 上對(duì)相應(yīng)的 Key 進(jìn)行訪問,當(dāng)訪問超過 Server 極限時(shí),就會(huì)導(dǎo)致熱點(diǎn) Key 問題的產(chǎn)生。
1、流量集中,達(dá)到物理網(wǎng)卡上限。
2、請(qǐng)求過多,緩存分片服務(wù)被打垮。
3、DB 擊穿,引起業(yè)務(wù)雪崩。
如前文講到的,當(dāng)某一熱點(diǎn) Key 的請(qǐng)求在某一主機(jī)上超過該主機(jī)網(wǎng)卡上限時(shí),由于流量的過度集中,會(huì)導(dǎo)致服務(wù)器中其它服務(wù)無(wú)法進(jìn)行。
如果熱點(diǎn)過于集中,熱點(diǎn) Key 的緩存過多,超過目前的緩存容量時(shí),就會(huì)導(dǎo)致緩存分片服務(wù)被打垮現(xiàn)象的產(chǎn)生。
當(dāng)緩存服務(wù)崩潰后,此時(shí)再有請(qǐng)求產(chǎn)生,會(huì)緩存到后臺(tái) DB 上,由于DB 本身性能較弱,在面臨大請(qǐng)求時(shí)很容易發(fā)生請(qǐng)求穿透現(xiàn)象,會(huì)進(jìn)一步導(dǎo)致雪崩現(xiàn)象,嚴(yán)重影響設(shè)備的性能。
首先 Client 會(huì)將請(qǐng)求發(fā)送至 Server 上,而 Server 又是一個(gè)多線程的服務(wù),本地就具有一個(gè)基于 Cache LRU 策略的緩存空間。
當(dāng) Server 本身就擁堵時(shí),Server 不會(huì)將請(qǐng)求進(jìn)一步發(fā)送給 DB 而是直接返回,只有當(dāng) Server 本身暢通時(shí)才會(huì)將 Client 請(qǐng)求發(fā)送至 DB,并且將該數(shù)據(jù)重新寫入到緩存中。
此時(shí)就完成了緩存的訪問跟重建。
但該方案也存在以下問題:
該方案通過在客戶端單獨(dú)部署緩存的方式來解決熱點(diǎn) Key 問題。
使用過程中 Client 首先訪問服務(wù)層,再對(duì)同一主機(jī)上的緩存層進(jìn)行訪問。
該種解決方案具有就近訪問、速度快、沒有帶寬限制的優(yōu)點(diǎn),但是同時(shí)也存在以下問題:
使用本地緩存則存在以下問題:
傳統(tǒng)的熱點(diǎn)解決方案都存在各種各樣的問題,那么究竟該如何解決熱點(diǎn)問題呢?
架構(gòu)中各節(jié)點(diǎn)的作用如下:
實(shí)際過程中 Client 將請(qǐng)求傳到 SLB,SLB 又將其分發(fā)至多個(gè) Proxy 內(nèi),通過 Proxy 對(duì)請(qǐng)求的識(shí)別,將其進(jìn)行分類發(fā)送。
例如,將同為 Write 的請(qǐng)求發(fā)送到 Master 模塊內(nèi),而將 Read 的請(qǐng)求發(fā)送至 ReadOnly 模塊。
而模塊中的只讀節(jié)點(diǎn)可以進(jìn)一步擴(kuò)充,從而有效解決熱點(diǎn)讀的問題。
讀寫分離同時(shí)具有可以靈活擴(kuò)容讀熱點(diǎn)能力、可以存儲(chǔ)大量熱點(diǎn)Key、對(duì)客戶端友好等優(yōu)點(diǎn)。
該方案通過主動(dòng)發(fā)現(xiàn)熱點(diǎn)并對(duì)其進(jìn)行存儲(chǔ)來解決熱點(diǎn) Key 的問題。
首先 Client 也會(huì)訪問 SLB,并且通過 SLB 將各種請(qǐng)求分發(fā)至 Proxy 中,Proxy 會(huì)按照基于路由的方式將請(qǐng)求轉(zhuǎn)發(fā)至后端的 Redis 中。
在熱點(diǎn) key 的解決上是采用在服務(wù)端增加緩存的方式進(jìn)行。
具體來說就是在 Proxy 上增加本地緩存,本地緩存采用 LRU 算法來緩存熱點(diǎn)數(shù)據(jù),后端 db 節(jié)點(diǎn)增加熱點(diǎn)數(shù)據(jù)計(jì)算模塊來返回?zé)狳c(diǎn)數(shù)據(jù)。
Proxy 架構(gòu)的主要有以下優(yōu)點(diǎn):
在熱點(diǎn) Key 的處理上主要分為寫入跟讀取兩種形式,在數(shù)據(jù)寫入過程當(dāng) SLB 收到數(shù)據(jù) K1 并將其通過某一個(gè) Proxy 寫入一個(gè) Redis,完成數(shù)據(jù)的寫入。
假若經(jīng)過后端熱點(diǎn)模塊計(jì)算發(fā)現(xiàn) K1 成為熱點(diǎn) key 后, Proxy 會(huì)將該熱點(diǎn)進(jìn)行緩存,當(dāng)下次客戶端再進(jìn)行訪問 K1 時(shí),可以不經(jīng) Redis。
最后由于 proxy 是可以水平擴(kuò)充的,因此可以任意增強(qiáng)熱點(diǎn)數(shù)據(jù)的訪問能力。
對(duì)于 db 上熱點(diǎn)數(shù)據(jù)的發(fā)現(xiàn),首先會(huì)在一個(gè)周期內(nèi)對(duì) Key 進(jìn)行請(qǐng)求統(tǒng)計(jì),在達(dá)到請(qǐng)求量級(jí)后會(huì)對(duì)熱點(diǎn) Key 進(jìn)行熱點(diǎn)定位,并將所有的熱點(diǎn) Key 放入一個(gè)小的 LRU 鏈表內(nèi),在通過 Proxy 請(qǐng)求進(jìn)行訪問時(shí),若 Redis 發(fā)現(xiàn)待訪點(diǎn)是一個(gè)熱點(diǎn),就會(huì)進(jìn)入一個(gè)反饋階段,同時(shí)對(duì)該數(shù)據(jù)進(jìn)行標(biāo)記。
DB 計(jì)算熱點(diǎn)時(shí),主要運(yùn)用的方法和優(yōu)勢(shì)有:
通過上述對(duì)比分析可以看出,在解決熱點(diǎn) Key 上較傳統(tǒng)方法相比都有較大的提高,無(wú)論是基于讀寫分離方案還是熱點(diǎn)數(shù)據(jù)解決方案,在實(shí)際處理環(huán)境中都可以做靈活的水平能力擴(kuò)充、都對(duì)客戶端透明、都有一定的數(shù)據(jù)不一致性。
此外讀寫分離模式可以存儲(chǔ)更大量的熱點(diǎn)數(shù)據(jù),而基于 Proxy 的模式有成本上的優(yōu)勢(shì)。
看完上述內(nèi)容,你們掌握Redis熱點(diǎn)Key發(fā)現(xiàn)及常見解決方案是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!