更新時(shí)間:2023年07月25日11時(shí)27分 來(lái)源:傳智教育 瀏覽次數(shù):
場(chǎng)景:“宕機(jī)”
服務(wù)器啟動(dòng)后迅速宕機(jī)
問(wèn)題排查:
1.請(qǐng)求數(shù)量較高,大量的請(qǐng)求過(guò)來(lái)之后都需要去從緩存中獲取數(shù)據(jù),但是緩存中又沒(méi)有,此時(shí)從數(shù)據(jù)庫(kù)中查找數(shù)據(jù)然后將數(shù)據(jù)再存入緩存,造成了短期內(nèi)對(duì)redis的高強(qiáng)度操作從而導(dǎo)致問(wèn)題
2.主從之間數(shù)據(jù)吞吐量較大,數(shù)據(jù)同步操作頻度較高
解決方案:
前置準(zhǔn)備工作:
1.日常例行統(tǒng)計(jì)數(shù)據(jù)訪問(wèn)記錄,統(tǒng)計(jì)訪問(wèn)頻度較高的熱點(diǎn)數(shù)據(jù)
2.利用LRU數(shù)據(jù)刪除策略,構(gòu)建數(shù)據(jù)留存隊(duì)列例如:storm與kafka配合
準(zhǔn)備工作:
1.將統(tǒng)計(jì)結(jié)果中的數(shù)據(jù)分類,根據(jù)級(jí)別,redis優(yōu)先加載級(jí)別較高的熱點(diǎn)數(shù)據(jù)
2.利用分布式多服務(wù)器同時(shí)進(jìn)行數(shù)據(jù)讀取,提速數(shù)據(jù)加載過(guò)程
3.熱點(diǎn)數(shù)據(jù)主從同時(shí)預(yù)熱
實(shí)施:
4.使用腳本程序固定觸發(fā)數(shù)據(jù)預(yù)熱過(guò)程
5.如果條件允許,使用了CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)),效果會(huì)更好
總的來(lái)說(shuō):緩存預(yù)熱就是系統(tǒng)啟動(dòng)前,提前將相關(guān)的緩存數(shù)據(jù)直接加載到緩存系統(tǒng)。避免在用戶請(qǐng)求的時(shí)候,先查詢數(shù)據(jù)庫(kù),然后再將數(shù)據(jù)緩存的問(wèn)題!用戶直接查詢事先被預(yù)熱的緩存數(shù)據(jù)!
場(chǎng)景:數(shù)據(jù)庫(kù)服務(wù)器崩潰,一連串的場(chǎng)景會(huì)隨之兒來(lái)。
1.系統(tǒng)平穩(wěn)運(yùn)行過(guò)程中,忽然數(shù)據(jù)庫(kù)連接量激增
2.應(yīng)用服務(wù)器無(wú)法及時(shí)處理請(qǐng)求
3.大量408,500錯(cuò)誤頁(yè)面出現(xiàn)
4.客戶反復(fù)刷新頁(yè)面獲取數(shù)據(jù)
5.數(shù)據(jù)庫(kù)崩潰
6.應(yīng)用服務(wù)器崩潰
7.重啟應(yīng)用服務(wù)器無(wú)效
8.Redis服務(wù)器崩潰
9.Redis集群崩潰
10.重啟數(shù)據(jù)庫(kù)后再次被瞬間流量放倒
問(wèn)題排查:
1.在一個(gè)較短的時(shí)間內(nèi),緩存中較多的key集中過(guò)期
2.此周期內(nèi)請(qǐng)求訪問(wèn)過(guò)期的數(shù)據(jù),redis未命中,redis向數(shù)據(jù)庫(kù)獲取數(shù)據(jù)
3.數(shù)據(jù)庫(kù)同時(shí)接收到大量的請(qǐng)求無(wú)法及時(shí)處理
4.Redis大量請(qǐng)求被積壓,開(kāi)始出現(xiàn)超時(shí)現(xiàn)象
5.數(shù)據(jù)庫(kù)流量激增,數(shù)據(jù)庫(kù)崩潰
6.重啟后仍然面對(duì)緩存中無(wú)數(shù)據(jù)可用
7.Redis服務(wù)器資源被嚴(yán)重占用,Redis服務(wù)器崩潰
8.Redis集群呈現(xiàn)崩塌,集群瓦解
9.應(yīng)用服務(wù)器無(wú)法及時(shí)得到數(shù)據(jù)響應(yīng)請(qǐng)求,來(lái)自客戶端的請(qǐng)求數(shù)量越來(lái)越多,應(yīng)用服務(wù)器崩潰
10.應(yīng)用服務(wù)器,redis,數(shù)據(jù)庫(kù)全部重啟,效果不理想
總而言之就兩點(diǎn):短時(shí)間范圍內(nèi),大量key集中過(guò)期
解決方案
思路:
1.更多的頁(yè)面靜態(tài)化處理
2.構(gòu)建多級(jí)緩存架構(gòu):Nginx緩存+redis緩存+ehcache緩存
3.檢測(cè)Mysql嚴(yán)重耗時(shí)業(yè)務(wù)進(jìn)行優(yōu)化:對(duì)數(shù)據(jù)庫(kù)的瓶頸排查:例如超時(shí)查詢、耗時(shí)較高事務(wù)等
4.災(zāi)難預(yù)警機(jī)制:? 監(jiān)控redis服務(wù)器性能指標(biāo),CPU占用、CPU使用率,內(nèi)存容量,查詢平均響應(yīng)時(shí)間和線程數(shù)
5.限流、降級(jí)
短時(shí)間范圍內(nèi)犧牲一些客戶體驗(yàn),限制一部分請(qǐng)求訪問(wèn),降低應(yīng)用服務(wù)器壓力,待業(yè)務(wù)低速運(yùn)轉(zhuǎn)后再逐步放開(kāi)訪問(wèn)
落地實(shí)踐:
1.LRU與LFU切換
2.數(shù)據(jù)有效期策略調(diào)整?:根據(jù)業(yè)務(wù)數(shù)據(jù)有效期進(jìn)行分類錯(cuò)峰,A類90分鐘,B類80分鐘,C類70分鐘過(guò)期時(shí)間使用固定時(shí)間+隨機(jī)值的形式,稀釋集中到期的key的數(shù)量
3.超熱數(shù)據(jù)使用永久key
4.定期維護(hù)(自動(dòng)+人工):對(duì)即將過(guò)期數(shù)據(jù)做訪問(wèn)量分析,確認(rèn)是否延時(shí),配合訪問(wèn)量統(tǒng)計(jì),做熱點(diǎn)數(shù)據(jù)的延時(shí)
5.加鎖:慎用!
總的來(lái)說(shuō):緩存雪崩就是瞬間過(guò)期數(shù)據(jù)量太大,導(dǎo)致對(duì)數(shù)據(jù)庫(kù)服務(wù)器造成壓力。如能夠有效避免過(guò)期時(shí)間集中,可以有效解決雪崩現(xiàn)象的 出現(xiàn)(約40%),配合其他策略一起使用,并監(jiān)控服務(wù)器的運(yùn)行數(shù)據(jù),根據(jù)運(yùn)行記錄做快速調(diào)整。
北京校區(qū)