分布式高并發(fā)緩存設(shè)計(jì)系統(tǒng)
概述
緩存概述
什么是緩存
緩存在wiki上的定義:用于存儲數(shù)據(jù)的硬件或軟件的組成部分,以使得后續(xù)更快訪問相應(yīng)的數(shù)據(jù)。緩存中的數(shù)據(jù)可能是提前計(jì)算好的結(jié)果、數(shù)據(jù)的副本等。典型的應(yīng)用場景:有cpu cache, 磁盤cache等。本文中提及到緩存主要是指互聯(lián)網(wǎng)應(yīng)用中所使用的緩存組件。
為什么引入緩存
傳統(tǒng)的后端業(yè)務(wù)場景中,訪問量以及對響應(yīng)時間的要求均不高,通常只使用DB即可滿足要求。這種架構(gòu)簡單,便于快速部署,很多網(wǎng)站發(fā)展初期均考慮使用這種架構(gòu)。但是隨著訪問量的上升,以及對響應(yīng)時間的要求提升,單DB無法再滿足要求。這時候通常會考慮DB拆分(sharding)、讀寫分離、甚至硬件升級(SSD)等以滿足新的業(yè)務(wù)需求。但是這種方式仍然會面臨很多問題,主要體現(xiàn)在:
性能提升有限,很難達(dá)到數(shù)量級上的提升,尤其在互聯(lián)網(wǎng)業(yè)務(wù)場景下,隨著網(wǎng)站的發(fā)展,訪問量經(jīng)常會面臨十倍、百倍的上漲。
成本高昂,為了承載N倍的訪問量,通常需要N倍的機(jī)器,這個代價難以接受。
一丶分布式高并發(fā)緩存設(shè)計(jì)系統(tǒng)
總體架構(gòu)圖
1.2自定義的客戶端協(xié)議
業(yè)務(wù)模塊采用自定義應(yīng)用層協(xié)議和cacheProxy交互
整個cache后端采用什么協(xié)議,什么存儲(redis,memcached等)對業(yè)務(wù)模塊透明
cache后端和業(yè)務(wù)端進(jìn)行了隔離,修改互不影響
1.2負(fù)載均衡與容錯機(jī)制
采用一致性hash算法,即使部分節(jié)點(diǎn)down機(jī),也不會導(dǎo)致全部的緩存失效,新增節(jié)點(diǎn)也不會導(dǎo)致大量緩存失效和重建
一份緩存數(shù)據(jù)保留兩份,當(dāng)前hash節(jié)點(diǎn)和下一個真實(shí)的hash節(jié)點(diǎn),單個節(jié)點(diǎn)down機(jī)時,緩存也不會馬上失效
cacheMan是一個弱的管理節(jié)點(diǎn),負(fù)責(zé)監(jiān)控,刪除節(jié)點(diǎn),新增節(jié)點(diǎn),可以任意啟停
1.3緩存維護(hù)與淘汰機(jī)制
redis原生超時機(jī)制+三層LRU緩存架構(gòu),減少最終穿透到redis實(shí)例上的請求。
客戶端LRU緩存
cacheProxy代理LRU緩存
redis實(shí)例內(nèi)存總量限制+LRU緩存
1.4安全機(jī)制
redis實(shí)例都會開啟auth功能
redis實(shí)例都監(jiān)聽在內(nèi)網(wǎng)ip
1.5核心流程
新增redis節(jié)點(diǎn)
刪除redis節(jié)點(diǎn)
set緩存
get緩存
二、問題
任何平臺隨著用戶規(guī)模的擴(kuò)大、功能不斷的添加,持久化數(shù)據(jù)庫層承受的讀寫壓力會越來越大,一旦數(shù)據(jù)庫承壓過大會導(dǎo)致讀寫性能陡然下降,嚴(yán)重時會導(dǎo)致大量的業(yè)務(wù)請求超時,進(jìn)而發(fā)生“雪崩”引發(fā)嚴(yán)重的故障。
三、解決方案
在業(yè)務(wù)層和數(shù)據(jù)庫持久層之間引入一層內(nèi)存緩存層,對于復(fù)雜且業(yè)務(wù)邏輯上不會變化的查詢結(jié)果進(jìn)行緩存,業(yè)務(wù)請求再次發(fā)起時,每次都先從緩存層中查詢,從而大大減少對數(shù)據(jù)庫的查詢,減小對數(shù)據(jù)庫的壓力。
四、分布式內(nèi)存緩存、本地單點(diǎn)緩存、應(yīng)用層緩存對比
類型穩(wěn)定性擴(kuò)展性通用性對代碼的侵入性
應(yīng)用層緩存應(yīng)用會頻繁重啟更新,緩存易丟失,穩(wěn)定性不佳差,受限于進(jìn)程的資源限制差,不同應(yīng)用難以復(fù)用代碼侵入性小,無網(wǎng)絡(luò)操作,只需要操作應(yīng)用進(jìn)程內(nèi)存
本地單點(diǎn)緩存獨(dú)立的緩存應(yīng)用(redis、memcached等),不會頻繁重啟,穩(wěn)定性一般,但有單點(diǎn)故障問題一般,受限于單服務(wù)器資源限制一般,業(yè)務(wù)應(yīng)用和緩存應(yīng)用有強(qiáng)耦合代碼侵入性一般,需要引入對應(yīng)的api通常有網(wǎng)絡(luò)操作
分布式內(nèi)存緩存分布式系統(tǒng),具備故障自動恢復(fù)功能,無單點(diǎn)故障問題,穩(wěn)定性佳好,支持水平擴(kuò)展好,對業(yè)務(wù)層提供通用接口,后端具體的緩存應(yīng)用對業(yè)務(wù)透明代碼侵入性一般,需要引入通用的api通常有網(wǎng)絡(luò)操作。