大型高并發(fā)與高可用的三層緩存架構(gòu)總結(jié)

對(duì)于高并發(fā)架構(gòu)陨簇,毫無(wú)疑問(wèn)緩存是最重要的一環(huán)外邓,對(duì)于大量的高并發(fā)袋马,可以采用三層緩存架構(gòu)來(lái)實(shí)現(xiàn)戳护,nginx+redis+ehcache

nginx

對(duì)于中間件nginx常用來(lái)做流量的分發(fā)非凌,同時(shí)nginx本身也有自己的緩存(容量有限)举农,我們可以用來(lái)緩存熱點(diǎn)數(shù)據(jù),讓用戶(hù)的請(qǐng)求直接走緩存并返回敞嗡,減少流向服務(wù)器的流量

一.模板引擎

通常我們可以配合使用freemaker/velocity等模板引擎來(lái)抗住大量的請(qǐng)求

1.小型系統(tǒng)可能直接在服務(wù)器端渲染出所有的頁(yè)面并放入緩存颁糟,之后的相同頁(yè)面請(qǐng)求就可以直接返回,不用去查詢(xún)數(shù)據(jù)源或者做數(shù)據(jù)邏輯處理

2.對(duì)于頁(yè)面非常之多的系統(tǒng)喉悴,當(dāng)模板有改變棱貌,上述方法就需要重新渲染所有的頁(yè)面模板,毫無(wú)疑問(wèn)是不可取的箕肃。因此配合nginx+lua(OpenResty)婚脱,將模板單獨(dú)保存在nginx緩存中,同時(shí)對(duì)于用來(lái)渲染的數(shù)據(jù)也存在nginx緩存中勺像,但是需要設(shè)置一個(gè)緩存過(guò)期的時(shí)間障贸,以盡可能保證模板的實(shí)時(shí)性

二.雙層nginx來(lái)提升緩存命中率

對(duì)于部署多個(gè)nginx而言,如果不加入一些數(shù)據(jù)的路由策略吟宦,那么可能導(dǎo)致每個(gè)nginx的緩存命中率很低篮洁。因此可以部署雙層nginx

1.分發(fā)層nginx負(fù)責(zé)流量分發(fā)的邏輯和策略,根據(jù)自己定義的一些規(guī)則殃姓,比如根據(jù)productId進(jìn)行hash袁波,然后對(duì)后端nginx數(shù)量取模將某一個(gè)商品的訪(fǎng)問(wèn)請(qǐng)求固定路由到一個(gè)nginx后端服務(wù)器上去

2.后端nginx用來(lái)緩存一些熱點(diǎn)數(shù)據(jù)到自己的緩存區(qū)(分發(fā)層只能配置1個(gè)嗎)

redis

用戶(hù)的請(qǐng)求瓦阐,在nginx沒(méi)有緩存相應(yīng)的數(shù)據(jù),那么會(huì)進(jìn)入到redis緩存中锋叨,redis可以做到全量數(shù)據(jù)的緩存垄分,通過(guò)水平擴(kuò)展能夠提升并發(fā)、高可用的能力

一.持久化機(jī)制:將redis內(nèi)存中的數(shù)據(jù)持久化到磁盤(pán)中娃磺,然后可以定期將磁盤(pán)文件上傳至S3(AWS)或者ODPS(阿里云)等一些云存儲(chǔ)服務(wù)上去薄湿。

如果同時(shí)使用RDB和AOF兩種持久化機(jī)制,那么在redis重啟的時(shí)候偷卧,會(huì)使用AOF來(lái)重新構(gòu)建數(shù)據(jù)豺瘤,因?yàn)锳OF中的數(shù)據(jù)更加完整,建議將兩種持久化機(jī)制都開(kāi)啟听诸,用AO F來(lái)保證數(shù)據(jù)不丟失坐求,作為數(shù)據(jù)恢復(fù)的第一選擇;用RDB來(lái)作不同程度的冷備晌梨,在AOF文件都丟失或損壞不可用的時(shí)候來(lái)快速進(jìn)行數(shù)據(jù)的恢復(fù)桥嗤。

實(shí)戰(zhàn)踩坑:對(duì)于想從RDB恢復(fù)數(shù)據(jù),同時(shí)AOF開(kāi)關(guān)也是打開(kāi)的仔蝌,一直無(wú)法正撤毫欤恢復(fù),因?yàn)槊看味紩?huì)優(yōu)先從AOF獲取數(shù)據(jù)(如果臨時(shí)關(guān)閉AOF敛惊,就可以正吃ㄐ恢復(fù))。此時(shí)首先停止redis瞧挤,然后關(guān)閉AOF锡宋,拷貝RDB到相應(yīng)目錄,啟動(dòng)redis之后熱修改配置參數(shù)redis config set appendonly yes特恬,此時(shí)會(huì)自動(dòng)生成一個(gè)當(dāng)前內(nèi)存數(shù)據(jù)的AOF文件执俩,然后再次停止redis,打開(kāi)AOF配置癌刽,再次啟動(dòng)數(shù)據(jù)就正常啟動(dòng)

1.RDB

對(duì)redis中的數(shù)據(jù)執(zhí)行周期性的持久化役首,每一刻持久化的都是全量數(shù)據(jù)的一個(gè)快照。對(duì)redis性能影響較小妒穴,基于RDB能夠快速異常恢復(fù)

2.AOF

以append-only的模式寫(xiě)入一個(gè)日志文件中摊崭,在redis重啟的時(shí)候可以通過(guò)回放AOF日志中的寫(xiě)入指令來(lái)重新構(gòu)建整個(gè)數(shù)據(jù)集讼油。(實(shí)際上每次寫(xiě)的日志數(shù)據(jù)會(huì)先到linux os cache,然后redis每隔一秒調(diào)用操作系統(tǒng)fsync將os cache中的數(shù)據(jù)寫(xiě)入磁盤(pán))呢簸。對(duì)redis有一定的性能影響矮台,能夠盡量保證數(shù)據(jù)的完整性乏屯。redis通過(guò)rewrite機(jī)制來(lái)保障AOF文件不會(huì)太龐大,基于當(dāng)前內(nèi)存數(shù)據(jù)并可以做適當(dāng)?shù)闹噶钪貥?gòu)瘦赫。

二.redis集群

1.replication

一主多從架構(gòu)辰晕,主節(jié)點(diǎn)負(fù)責(zé)寫(xiě),并且將數(shù)據(jù)同步到其他salve節(jié)點(diǎn)(異步執(zhí)行)确虱,從節(jié)點(diǎn)負(fù)責(zé)讀含友,主要就是用來(lái)做讀寫(xiě)分離的橫向擴(kuò)容架構(gòu)。這種架構(gòu)的master節(jié)點(diǎn)數(shù)據(jù)一定要做持久化校辩,否則窘问,當(dāng)master宕機(jī)重啟之后內(nèi)存數(shù)據(jù)清空,那么就會(huì)將空數(shù)據(jù)復(fù)制到slave宜咒,導(dǎo)致所有數(shù)據(jù)消失

2.sentinal哨兵

哨兵是redis集群架構(gòu)中很重要的一個(gè)組件惠赫,負(fù)責(zé)監(jiān)控redis master和slave進(jìn)程是否正常工作,當(dāng)某個(gè)redis實(shí)例故障時(shí)故黑,能夠發(fā)送消息報(bào)警通知給管理員儿咱,當(dāng)master node宕機(jī)能夠自動(dòng)轉(zhuǎn)移到slave node上,如果故障轉(zhuǎn)移發(fā)生來(lái)场晶,會(huì)通知client客戶(hù)端新的master地址混埠。sentinal至少需要3個(gè)實(shí)例來(lái)保證自己的健壯性,并且能夠更好地進(jìn)行quorum投票以達(dá)到majority來(lái)執(zhí)行故障轉(zhuǎn)移峰搪。

前兩種架構(gòu)方式最大的特點(diǎn)是岔冀,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是相同的,無(wú)法存取海量的數(shù)據(jù)概耻。因此哨兵集群的方式使用與數(shù)據(jù)量不大的情況

3.redis cluster

redis cluster支撐多master node使套,每個(gè)master node可以?huà)燧d多個(gè)slave node,如果mastre掛掉會(huì)自動(dòng)將對(duì)應(yīng)的某個(gè)slave切換成master鞠柄。需要注意的是redis cluster架構(gòu)下slave節(jié)點(diǎn)主要是用來(lái)做高可用侦高、故障主備切換的,如果一定需要slave能夠提供讀的能力厌杜,修改配置也可以實(shí)現(xiàn)(同時(shí)也需要修改jedis源碼來(lái)支持該情況下的讀寫(xiě)分離操作)奉呛。redis cluster架構(gòu)下,master就是可以任意擴(kuò)展的夯尽,直接橫向擴(kuò)展master即可提高讀寫(xiě)吞吐量瞧壮。slave節(jié)點(diǎn)能夠自動(dòng)遷移(讓master節(jié)點(diǎn)盡量平均擁有slave節(jié)點(diǎn)),對(duì)整個(gè)架構(gòu)過(guò)載冗余的slave就可以保障系統(tǒng)更高的可用性匙握。

ehcache

tomcat jvm堆內(nèi)存緩存咆槽,主要是抗redis出現(xiàn)大規(guī)模災(zāi)難。如果redis出現(xiàn)了大規(guī)模的宕機(jī)圈纺,導(dǎo)致nginx大量流量直接涌入數(shù)據(jù)生產(chǎn)服務(wù)秦忿,那么最后的tomcat堆內(nèi)存緩存也可以處理部分請(qǐng)求麦射,避免所有請(qǐng)求都直接流向DB

針對(duì)上面的技術(shù)我特意整理了一下,有很多技術(shù)不是靠幾句話(huà)能講清楚灯谣,所以干脆找朋友錄制了一些視頻潜秋,很多問(wèn)題其實(shí)答案很簡(jiǎn)單,但是背后的思考和邏輯不簡(jiǎn)單胎许,要做到知其然還要知其所以然峻呛。如果想學(xué)習(xí)Java工程化、高性能及分布式呐萨、深入淺出杀饵。微服務(wù)、Spring谬擦,MyBatis切距,Netty源碼分析的朋友可以加我的Java進(jìn)階群:694549689,群里有阿里大牛直播講解技術(shù)惨远,以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家谜悟。

緩存數(shù)據(jù)更新策略

1.對(duì)時(shí)效性要求高的緩存數(shù)據(jù),當(dāng)發(fā)生變更的時(shí)候北秽,直接采取數(shù)據(jù)庫(kù)和redis緩存雙寫(xiě)的方案葡幸,讓緩存時(shí)效性最高。

2.對(duì)時(shí)效性不高的數(shù)據(jù)贺氓,當(dāng)發(fā)生變更之后蔚叨,采取MQ異步通知的方式,通過(guò)數(shù)據(jù)生產(chǎn)服務(wù)來(lái)監(jiān)聽(tīng)MQ消息辙培,然后異步去拉取服務(wù)的數(shù)據(jù)更新tomcat jvm緩存和redis緩存蔑水,對(duì)于nginx本地緩存過(guò)期之后就可以從redis中拉取新的數(shù)據(jù)并更新到nginx本地。

經(jīng)典的緩存+數(shù)據(jù)庫(kù)讀寫(xiě)的模式扬蕊,cache aside pattern

1.讀的時(shí)候搀别,先讀緩存,緩存沒(méi)有的話(huà)尾抑,那么就讀數(shù)據(jù)庫(kù)歇父,然后取出數(shù)據(jù)后放入緩存,同時(shí)返回響應(yīng)

2.更新的時(shí)候再愈,先刪除緩存榜苫,然后再更新數(shù)據(jù)庫(kù),之所以更新的時(shí)候只是刪除緩存翎冲,因?yàn)閷?duì)于一些復(fù)雜有邏輯的緩存數(shù)據(jù)垂睬,每次數(shù)據(jù)變更都更新一次緩存會(huì)造成額外的負(fù)擔(dān),只是刪除緩存,讓該數(shù)據(jù)下一次被使用的時(shí)候再去執(zhí)行讀的操作來(lái)重新緩存羔飞,這里采用的是懶加載的策略。舉個(gè)例子檐春,一個(gè)緩存涉及的表的字段逻淌,在1分鐘內(nèi)就修改了20次,或者是100次,那么緩存跟新20次,100次殿遂;但是這個(gè)緩存在1分鐘內(nèi)就被讀取了1次巫湘,因此每次更新緩存就會(huì)有大量的冷數(shù)據(jù),對(duì)于緩存符合28黃金法則泰演,20%的數(shù)據(jù),占用了80%的訪(fǎng)問(wèn)量

數(shù)據(jù)庫(kù)和redis緩存雙寫(xiě)不一致的問(wèn)題

1. 最初級(jí)的緩存不一致問(wèn)題以及解決方案

問(wèn)題:如果先修改數(shù)據(jù)庫(kù)再刪除緩存,那么當(dāng)緩存刪除失敗來(lái)擎鸠,那么會(huì)導(dǎo)致數(shù)據(jù)庫(kù)中是最新數(shù)據(jù),緩存中依舊是舊數(shù)據(jù)缘圈,造成數(shù)據(jù)不一致劣光。

解決方案:可以先刪除緩存,再修改數(shù)據(jù)庫(kù)糟把,如果刪除緩存成功但是數(shù)據(jù)庫(kù)修改失敗绢涡,那么數(shù)據(jù)庫(kù)中是舊數(shù)據(jù),緩存是空不會(huì)出現(xiàn)不一致

2.比較復(fù)雜的數(shù)據(jù)不一致問(wèn)題分析

問(wèn)題:對(duì)于數(shù)據(jù)發(fā)生來(lái)變更遣疯,先刪除緩存雄可,然后去修改數(shù)據(jù)庫(kù),此時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)還沒(méi)有修改成功缠犀,并發(fā)的讀請(qǐng)求到來(lái)去讀緩存發(fā)現(xiàn)是空数苫,進(jìn)而去數(shù)據(jù)庫(kù)查詢(xún)到此時(shí)的舊數(shù)據(jù)放到緩存中,然后之前對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的修改成功來(lái)夭坪,就會(huì)造成數(shù)據(jù)不一致

解決方案:將數(shù)據(jù)庫(kù)與緩存更新與讀取操作進(jìn)行異步串行化文判。當(dāng)更新數(shù)據(jù)的時(shí)候,根據(jù)數(shù)據(jù)的唯一標(biāo)識(shí)室梅,將更新數(shù)據(jù)操作路由到一個(gè)jvm內(nèi)部的隊(duì)列中戏仓,一個(gè)隊(duì)列對(duì)應(yīng)一個(gè)工作線(xiàn)程,線(xiàn)程串行拿到隊(duì)列中的操作一條一條地執(zhí)行亡鼠。當(dāng)執(zhí)行隊(duì)列中的更新數(shù)據(jù)操作赏殃,刪除緩存,然后去更新數(shù)據(jù)庫(kù)间涵,此時(shí)還沒(méi)有完成更新的時(shí)候過(guò)來(lái)一個(gè)讀請(qǐng)求仁热,讀到了空的緩存那么可以先將緩存更新的請(qǐng)求發(fā)送至路由之后的隊(duì)列中,此時(shí)會(huì)在隊(duì)列積壓勾哩,然后同步等待緩存更新完成抗蠢,一個(gè)隊(duì)列中多個(gè)相同數(shù)據(jù)緩存更新請(qǐng)求串在一起是沒(méi)有意義的举哟,因此可以做過(guò)濾處理。等待前面的更新數(shù)據(jù)操作完成數(shù)據(jù)庫(kù)操作之后迅矛,才會(huì)去執(zhí)行下一個(gè)緩存更新的操作妨猩,此時(shí)會(huì)從數(shù)據(jù)庫(kù)中讀取最新的數(shù)據(jù),然后寫(xiě)入緩存中秽褒,如果請(qǐng)求還在等待時(shí)間范圍內(nèi)壶硅,不斷輪詢(xún)發(fā)現(xiàn)可以取到緩存中值就可以直接返回(此時(shí)可能會(huì)有對(duì)這個(gè)緩存數(shù)據(jù)的多個(gè)請(qǐng)求正在這樣處理);如果請(qǐng)求等待事件超過(guò)一定時(shí)長(zhǎng)销斟,那么這一次的請(qǐng)求直接讀取數(shù)據(jù)庫(kù)中的舊值

對(duì)于這種處理方式需要注意一些問(wèn)題:

1.讀請(qǐng)求長(zhǎng)時(shí)阻塞:由于讀請(qǐng)求進(jìn)行來(lái)非常輕度的異步化庐椒,所以對(duì)超時(shí)的問(wèn)題需要格外注意,超過(guò)超時(shí)時(shí)間會(huì)直接查詢(xún)DB蚂踊,處理不好會(huì)對(duì)DB造成壓力约谈,因此需要測(cè)試系統(tǒng)高峰期QPS來(lái)調(diào)整機(jī)器數(shù)以及對(duì)應(yīng)機(jī)器上的隊(duì)列數(shù)最終決定合理的請(qǐng)求等待超時(shí)時(shí)間

2.多實(shí)例部署的請(qǐng)求路由:可能這個(gè)服務(wù)會(huì)部署多個(gè)實(shí)例,那么必須保證對(duì)應(yīng)的請(qǐng)求都通過(guò)nginx服務(wù)器路由到相同的服務(wù)實(shí)例上

3.熱點(diǎn)數(shù)據(jù)的路由導(dǎo)師請(qǐng)求的傾斜:因?yàn)橹挥性谏唐窋?shù)據(jù)更新的時(shí)候才會(huì)清空緩存犁钟,然后才會(huì)導(dǎo)致讀寫(xiě)并發(fā)窗宇,所以更新頻率不是太高的話(huà),這個(gè)問(wèn)題的影響并不是特別大特纤,但是的確可能某些機(jī)器的負(fù)載會(huì)高一些

分布式緩存重建并發(fā)沖突解決方案

對(duì)于緩存生產(chǎn)服務(wù)军俊,可能部署在多臺(tái)機(jī)器,當(dāng)redis和ehcache對(duì)應(yīng)的緩存數(shù)據(jù)都過(guò)期不存在時(shí)捧存,此時(shí)可能nginx過(guò)來(lái)的請(qǐng)求和kafka監(jiān)聽(tīng)的請(qǐng)求同時(shí)到達(dá)粪躬,導(dǎo)致兩者最終都去拉取數(shù)據(jù)并且存入redis中,因此可能產(chǎn)生并發(fā)沖突的問(wèn)題昔穴,可以采用redis或者zookeeper類(lèi)似的分布式鎖來(lái)解決镰官,讓請(qǐng)求的被動(dòng)緩存重建與監(jiān)聽(tīng)主動(dòng)的緩存重建操作避免并發(fā)的沖突,當(dāng)存入緩存的時(shí)候通過(guò)對(duì)比時(shí)間字段廢棄掉舊的數(shù)據(jù)吗货,保存最新的數(shù)據(jù)到緩存

緩存冷啟動(dòng)以及緩存預(yù)熱解決方案

當(dāng)系統(tǒng)第一次啟動(dòng)泳唠,大量請(qǐng)求涌入,此時(shí)的緩存為空宙搬,可能會(huì)導(dǎo)致DB崩潰笨腥,進(jìn)而讓系統(tǒng)不可用,同樣當(dāng)redis所有緩存數(shù)據(jù)異常丟失勇垛,也會(huì)導(dǎo)致該問(wèn)題脖母。因此,可以提前放入數(shù)據(jù)到redis避免上述冷啟動(dòng)的問(wèn)題闲孤,當(dāng)然也不可能是全量數(shù)據(jù)谆级,可以根據(jù)類(lèi)似于當(dāng)天的具體訪(fǎng)問(wèn)情況,實(shí)時(shí)統(tǒng)計(jì)出訪(fǎng)問(wèn)頻率較高的熱數(shù)據(jù),這里熱數(shù)據(jù)也比較多肥照,需要多個(gè)服務(wù)并行的分布式去讀寫(xiě)到redis中(所以要基于zk分布式鎖)

通過(guò)nginx+lua將訪(fǎng)問(wèn)流量上報(bào)至kafka中脚仔,storm從kafka中消費(fèi)數(shù)據(jù),實(shí)時(shí)統(tǒng)計(jì)處每個(gè)商品的訪(fǎng)問(wèn)次數(shù)舆绎,訪(fǎng)問(wèn)次數(shù)基于LRU(apache commons collections LRUMap)內(nèi)存數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)方案玻侥,使用LRUMap去存放是因?yàn)閮?nèi)存中的性能高,沒(méi)有外部依賴(lài)亿蒸,每個(gè)storm task啟動(dòng)的時(shí)候基于zk分布式鎖將自己的id寫(xiě)入zk同一個(gè)節(jié)點(diǎn)中,每個(gè)storm task負(fù)責(zé)完成自己這里的熱數(shù)據(jù)的統(tǒng)計(jì)掌桩,每隔一段時(shí)間就遍歷一下這個(gè)map边锁,然后維護(hù)一個(gè)前1000的數(shù)據(jù)list,然后去更新這個(gè)list波岛,最后開(kāi)啟一個(gè)后臺(tái)線(xiàn)程茅坛,每隔一段時(shí)間比如一分鐘都將排名的前1000的熱數(shù)據(jù)list同步到zk中去,存儲(chǔ)到這個(gè)storm task對(duì)應(yīng)的一個(gè)znode中去

部署多個(gè)實(shí)例的服務(wù)则拷,每次啟動(dòng)的時(shí)候就會(huì)去拿到上述維護(hù)的storm task id列表的節(jié)點(diǎn)數(shù)據(jù)贡蓖,然后根據(jù)taskid,一個(gè)一個(gè)去嘗試獲取taskid對(duì)應(yīng)的znode的zk分布式鎖煌茬,如果能夠獲取到分布式鎖斥铺,再去獲取taskid status的鎖進(jìn)而查詢(xún)預(yù)熱狀態(tài),如果沒(méi)有被預(yù)熱過(guò)坛善,那么就將這個(gè)taskid對(duì)應(yīng)的熱數(shù)據(jù)list取出來(lái)晾蜘,從而從DB中查詢(xún)出來(lái)寫(xiě)入緩存中,如果taskid分布式鎖獲取失敗眠屎,快速拋錯(cuò)進(jìn)行下一次循環(huán)獲取下一個(gè)taskid的分布式鎖即可剔交,此時(shí)就是多個(gè)服務(wù)實(shí)例基于zk分布式鎖做協(xié)調(diào)并行的進(jìn)行緩存的預(yù)熱

緩存熱點(diǎn)導(dǎo)致系統(tǒng)不可用解決方案

對(duì)于瞬間大量的相同數(shù)據(jù)的請(qǐng)求涌入,可能導(dǎo)致該數(shù)據(jù)經(jīng)過(guò)hash策略之后對(duì)應(yīng)的應(yīng)用層nginx被壓垮改衩,如果請(qǐng)求繼續(xù)就會(huì)影響至其他的nginx岖常,最終導(dǎo)致所有nginx出現(xiàn)異常整個(gè)系統(tǒng)變得不可用。

基于nginx+lua+storm的熱點(diǎn)緩存的流量分發(fā)策略自動(dòng)降級(jí)來(lái)解決上述問(wèn)題的出現(xiàn)葫督,可以設(shè)定訪(fǎng)問(wèn)次數(shù)大于后95%平均值n倍的數(shù)據(jù)為熱點(diǎn)竭鞍,在storm中直接發(fā)送http請(qǐng)求到流量分發(fā)的nginx上去,使其存入本地緩存橄镜,然后storm還會(huì)將熱點(diǎn)對(duì)應(yīng)的完整緩存數(shù)據(jù)沒(méi)發(fā)送到所有的應(yīng)用nginx服務(wù)器上去笼蛛,并直接存放到本地緩存。對(duì)于流量分發(fā)nginx蛉鹿,訪(fǎng)問(wèn)對(duì)應(yīng)的數(shù)據(jù)滨砍,如果發(fā)現(xiàn)是熱點(diǎn)標(biāo)識(shí)就立即做流量分發(fā)策略的降級(jí),對(duì)同一個(gè)數(shù)據(jù)的訪(fǎng)問(wèn)從hash到一臺(tái)應(yīng)用層nginx降級(jí)成為分發(fā)至所有的應(yīng)用層nginx。storm需要保存上一次識(shí)別出來(lái)的熱點(diǎn)List惋戏,并同當(dāng)前計(jì)算出來(lái)的熱點(diǎn)list做對(duì)比领追,如果已經(jīng)不是熱點(diǎn)數(shù)據(jù),則發(fā)送對(duì)應(yīng)的http請(qǐng)求至流量分發(fā)nginx中來(lái)取消對(duì)應(yīng)數(shù)據(jù)的熱點(diǎn)標(biāo)識(shí)

緩存雪崩解決方案

redis集群徹底崩潰响逢,緩存服務(wù)大量對(duì)redis的請(qǐng)求等待绒窑,占用資源,隨后緩存服務(wù)大量的請(qǐng)求進(jìn)入源頭服務(wù)去查詢(xún)DB舔亭,使DB壓力過(guò)大崩潰些膨,此時(shí)對(duì)源頭服務(wù)的請(qǐng)求也大量等待占用資源,緩存服務(wù)大量的資源全部耗費(fèi)在訪(fǎng)問(wèn)redis和源服務(wù)無(wú)果钦铺,最后使自身無(wú)法提供服務(wù)订雾,最終會(huì)導(dǎo)致整個(gè)網(wǎng)站崩潰。

事前的解決方案矛洞,搭建一套高可用架構(gòu)的redis cluster集群洼哎,主從架構(gòu)、一主多從沼本,一旦主節(jié)點(diǎn)宕機(jī)噩峦,從節(jié)點(diǎn)自動(dòng)跟上,并且最好使用雙機(jī)房部署集群抽兆。

事中的解決方案识补,部署一層ehcache緩存,在redis全部實(shí)現(xiàn)情況下能夠抗住部分壓力辫红;對(duì)redis cluster的訪(fǎng)問(wèn)做資源隔離李请,避免所有資源都等待,對(duì)redis cluster的訪(fǎng)問(wèn)失敗時(shí)的情況去部署對(duì)應(yīng)的熔斷策略厉熟,部署redis cluster的降級(jí)策略导盅;對(duì)源服務(wù)訪(fǎng)問(wèn)的限流以及資源隔離

事后的解決方案:redis數(shù)據(jù)做了備份可以直接恢復(fù),重啟redis即可揍瑟;redis數(shù)據(jù)徹底失敗來(lái)或者數(shù)據(jù)過(guò)舊白翻,可以快速緩存預(yù)熱,然后讓redis重新啟動(dòng)绢片。然后由于資源隔離的half-open策略發(fā)現(xiàn)redis已經(jīng)能夠正常訪(fǎng)問(wèn)滤馍,那么所有的請(qǐng)求將自動(dòng)恢復(fù)

緩存穿透解決方案

對(duì)于在多級(jí)緩存中都沒(méi)有對(duì)應(yīng)的數(shù)據(jù),并且DB也沒(méi)有查詢(xún)到數(shù)據(jù)底循,此時(shí)大量的請(qǐng)求都會(huì)直接到達(dá)DB巢株,導(dǎo)致DB承載高并發(fā)的問(wèn)題。解決緩存穿透的問(wèn)題可以對(duì)DB也沒(méi)有的數(shù)據(jù)返回一個(gè)空標(biāo)識(shí)的數(shù)據(jù)熙涤,進(jìn)而保存到各級(jí)緩存中阁苞,因?yàn)橛袑?duì)數(shù)據(jù)修改的異步監(jiān)聽(tīng)困檩,所以當(dāng)數(shù)據(jù)有更新,新的數(shù)據(jù)會(huì)被更新到緩存匯中那槽。

在這里給大家提供一個(gè)學(xué)習(xí)交流的平臺(tái)悼沿,java架構(gòu)師群:694549689

1.具有1-5工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手骚灸,需要突破技術(shù)瓶頸的可以加群糟趾。

2.在公司待久了,過(guò)得很安逸甚牲,但跳槽時(shí)面試碰壁义郑。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加群丈钙。

3.如果沒(méi)有工作經(jīng)驗(yàn)非驮,但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制著恩,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的可以加群蜻展。

nginx緩存失效導(dǎo)致redis壓力倍增

可以在nginx本地喉誊,設(shè)置緩存數(shù)據(jù)的時(shí)候隨機(jī)緩存的有效期,避免同一時(shí)刻緩存都失效而大量請(qǐng)求直接進(jìn)入redis

這個(gè)過(guò)程值得我們?nèi)ド钊雽W(xué)習(xí)和思考纵顾。如果對(duì)你有幫助請(qǐng)動(dòng)動(dòng)小手關(guān)注下吧伍茄!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市施逾,隨后出現(xiàn)的幾起案子敷矫,更是在濱河造成了極大的恐慌,老刑警劉巖汉额,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹仗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蠕搜,警方通過(guò)查閱死者的電腦和手機(jī)怎茫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妓灌,“玉大人轨蛤,你說(shuō)我怎么就攤上這事〕婀。” “怎么了祥山?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掉伏。 經(jīng)常有香客問(wèn)我缝呕,道長(zhǎng)澳窑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任岳颇,我火速辦了婚禮照捡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘话侧。我一直安慰自己栗精,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布瞻鹏。 她就那樣靜靜地躺著悲立,像睡著了一般。 火紅的嫁衣襯著肌膚如雪新博。 梳的紋絲不亂的頭發(fā)上薪夕,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音赫悄,去河邊找鬼原献。 笑死,一個(gè)胖子當(dāng)著我的面吹牛埂淮,可吹牛的內(nèi)容都是我干的姑隅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倔撞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讲仰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起痪蝇,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鄙陡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后躏啰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趁矾,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年给僵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愈魏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡想际,死狀恐怖培漏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胡本,我是刑警寧澤牌柄,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站侧甫,受9級(jí)特大地震影響珊佣,放射性物質(zhì)發(fā)生泄漏蹋宦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一咒锻、第九天 我趴在偏房一處隱蔽的房頂上張望冷冗。 院中可真熱鬧,春花似錦惑艇、人聲如沸蒿辙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)思灌。三九已至,卻和暖如春恭取,著一層夾襖步出監(jiān)牢的瞬間泰偿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蜈垮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耗跛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓攒发,卻偏偏與公主長(zhǎng)得像调塌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晨继,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容