淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用_第1頁
淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用_第2頁
淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用_第3頁
淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用_第4頁
淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、淺談網(wǎng)站架構(gòu)中緩存的應(yīng)用, 朱曄 2010年6月,緩存恢恢,疏而不漏,內(nèi)容概要,緩存的基本知識 網(wǎng)站架構(gòu)中緩存的分類 影響緩存命中率的因素 緩存常見的模式和實(shí)現(xiàn) 緩存的更新過期和清除策略 包裹著緩存紗布的數(shù)據(jù)庫 緩存存儲方式的選擇 緩存的同步問題 緩存的顛簸問題 分布式緩存系統(tǒng)的需求 memcache的基本介紹 memcache的使用誤區(qū)和實(shí)踐 windows server appfabric caching,緩存的基本知識,緩存的由來 兩種介質(zhì)的速度不匹配(差距較大)的問題導(dǎo)致?高速方在和低速方交互的時候因等待速度趨近于低速方,并且閑置得不到有效利用。 存在第三種介質(zhì),速度介于兩者之間, 價

2、格介于兩者之間。通過引入這種介質(zhì),把低速方部分內(nèi)容保存在這個介質(zhì)中,高速方大多情況下無須和低速方直接交互來提高整體性能。 典型的例子:cpu緩存(高速方cpu低速方內(nèi)存),內(nèi)存(高速方cpu低速方磁盤)。 緩存的分類 硬件領(lǐng)域中緩存(某種介質(zhì)),軟件領(lǐng)域中的緩存(不限于某種介質(zhì),只是一種手段),我們之后談的緩存都是軟件緩存。 讀取緩存(解決讀取速度慢),寫入緩存(解決寫入速度慢),讀寫緩存。 狹義上解決介質(zhì)讀寫速度不匹配問題,廣義上包括任何利用中間媒介提高速度的方法,包括空間換時間,動態(tài)操作變?yōu)殪o態(tài)操作。,緩存的基本知識,緩存(cache)和緩沖(buffer) 緩存:可以共享,多種數(shù)據(jù),大小

3、不固定,可以重復(fù)使用,已知數(shù)據(jù),用于提高io效率。 緩沖:不可以共享,單一數(shù)據(jù),大小固定,讀取后失效,命中100%,未知數(shù)據(jù),用于減少io次數(shù)。 緩存的屬性 命中率:從緩存中返回正確數(shù)據(jù)的次數(shù)/總請求次數(shù)。 容量:超過這個值啟用一定的策略:轉(zhuǎn)移到磁盤;轉(zhuǎn)移到遠(yuǎn)端;清空部分。 存儲介質(zhì):內(nèi)存、磁盤。 成本:開發(fā)成本、部署成本、硬件成本。 效率:set效率、get效率、序列化、哈希算法、分布式算法。 緩存的限制 由于價格的因素,緩存實(shí)現(xiàn)依賴的存儲往往有大小限制保存什么,舍棄什么,命中率。 緩存往往是從無到有的在最初階段不能發(fā)揮作用,在不命中的時候性能顛簸。,網(wǎng)站架構(gòu)中緩存的分類,按照存儲介質(zhì)來分

4、內(nèi)存(網(wǎng)站進(jìn)程內(nèi)、同服務(wù)器獨(dú)立進(jìn)程、獨(dú)立服務(wù)器、分布式服務(wù)器組)。 磁盤(本地文件和數(shù)據(jù)庫,獨(dú)立服務(wù)器、分布式服務(wù)器組)。 緩存可以使用磁盤而不僅僅是內(nèi)存。 按照存儲的數(shù)據(jù)來分 直接用于輸出的整頁(html、腳本樣式、圖片)。 片段頁(可供多個客戶端使用的html、腳本樣式等)。 索引和聚合數(shù)據(jù)(空間換時間)。 耗時查詢的結(jié)果數(shù)據(jù)。 和業(yè)務(wù)相關(guān)的大塊數(shù)據(jù)(列表數(shù)據(jù),引用數(shù)據(jù))。 和業(yè)務(wù)相關(guān)的小級數(shù)據(jù)(行級數(shù)據(jù),資源數(shù)據(jù))。 和上下文(用戶)相關(guān)的數(shù)據(jù)(活動數(shù)據(jù))。 按照實(shí)現(xiàn)方式來分 框架或引擎內(nèi)置的緩存(比如orm緩存和sql server緩存)。 安裝特定的組件根據(jù)規(guī)則自動實(shí)現(xiàn)緩存(比如反向

5、代理和輸出緩存)。 需要由開發(fā)以編程方式實(shí)現(xiàn)的緩存(比如業(yè)務(wù)數(shù)據(jù)緩存)。 按照作用來分 用于數(shù)據(jù)的讀取(之后介紹的大部分內(nèi)容都是基于此類緩存) 用于(允許丟失)數(shù)據(jù)的寫入寫到緩存的隊(duì)列中,再由工作線程提交處理(寫入存儲),影響緩存命中率的因素,假設(shè)數(shù)據(jù)庫的訪問操作需要5毫秒。 第一個測試固定key的范圍,第二個測試固定緩存時間。 對于相同的請求數(shù),隨著緩存時間的上升(實(shí)時性下降),緩存命中率明顯上升。 對于相同的緩存時間,隨著請求數(shù)的上升(時間的推移),緩存命中率保持穩(wěn)定。 在相同的緩存時間下(2秒),緩存key的跨度越大命中率越低,往往key的范圍很大預(yù)示著緩存的粒度太粗,key所容納的條件

6、太多。,影響緩存命中率的因素,影響命中率的因素 業(yè)務(wù)需求決定的時效性(體現(xiàn)在緩存的過期時間)。 硬件基礎(chǔ)結(jié)構(gòu)決定的容量(即使未過期都可能會刪除lru)。 軟件架構(gòu)設(shè)計(jì)決定的緩存的粒度 key = 帖子id; value = 所有跟貼數(shù)據(jù)。 key = 帖子id; value = 一條帖子的數(shù)據(jù) 以及 key = 帖子id; value = 跟貼id列表。 緩存的設(shè)計(jì)(包括替換策略等) 提高緩存命中率的方法 權(quán)衡業(yè)務(wù)、基礎(chǔ)結(jié)構(gòu)和架構(gòu)設(shè)計(jì)。 預(yù)熱、增加過期時間、增加存儲容量、調(diào)整緩存項(xiàng)的鍵值算法、對熱點(diǎn)問題的捕捉。 對于時效性很高(或緩存空間有限),內(nèi)容跨度很大(或訪問很隨機(jī)),并且訪問量不高的應(yīng)

7、用來說緩存命中率可能長期接近于0,預(yù)熱后的緩存還沒來得及為后人服務(wù)就已經(jīng)冷卻。,緩存常見的模式和實(shí)現(xiàn),延遲加載的緩存 主要用于緩存計(jì)算后的小塊數(shù)據(jù) 依靠用戶的請求加載數(shù)據(jù) 一開始命中率低(可以通過預(yù)熱提高命中率) 隨著用戶訪問的增多命中率逐漸提高 隨著緩存的過期命中率保持穩(wěn)定 “冷門”的數(shù)據(jù)可能始終從數(shù)據(jù)庫獲取 適合分布式緩存 預(yù)加載的緩存 主要用于緩存計(jì)算前的原始大塊數(shù)據(jù) 一般緩存的(元)數(shù)據(jù)不太需要更新 大多采用主動更新 一般信任緩存的數(shù)據(jù) 考慮初始化的時候多臺服務(wù)器對數(shù)據(jù)庫的沖擊 不適合分布式緩存,緩存常見的模式和實(shí)現(xiàn),操作緩存(異步隊(duì)列) 優(yōu)點(diǎn)是把瞬時的流量沖擊“磨平”,可以控制一定的

8、“帶寬”對數(shù)據(jù)庫操作,而不是“壓垮”,以及不阻塞調(diào)用方線程。 缺點(diǎn)是不能保證返回結(jié)果的時間。 注意要平衡寫入速度和處理速度,要確保緩存的容量足夠大,能應(yīng)付peak time。飯店生意興旺沒有座位的時候可以選擇不接受新客人或是讓客人排隊(duì)等候,如果來的客人永遠(yuǎn)比走的客人多,那么只能考慮再開一個飯店了。,緩存的更新、過期和清除策略,緩存的更新策略 a 由獲取數(shù)據(jù)請求觸發(fā)的被動更新 b 由更新數(shù)據(jù)請求觸發(fā)的主動更新(雙寫) c 使用獨(dú)立線程主動定時更新緩存 d 回調(diào)方式更新(過期或依賴) e 永遠(yuǎn)不更新? 緩存的過期(失效)策略 f 絕對的過期時間 g 平滑過期(有人使用就不會過期) h 依賴方式(依

9、賴數(shù)據(jù)庫、依賴文件) i 永遠(yuǎn)不過期? 緩存的清除(替換)策略: rand 刪除隨機(jī)數(shù)據(jù),不能反映局部性。 size 刪除最大的數(shù)據(jù)。 fifo,first in first out 刪除最先進(jìn)入緩存的數(shù)據(jù),不能反映局部性。 lfu,least frequently used 刪除一直以來最少被使用的數(shù)據(jù)。 lru,least recently used 刪除最近最少使用的數(shù)據(jù)。 常見模式 延遲加載方式:a+f 預(yù)加載方式:b/c/e+i,包裹著緩存紗布的數(shù)據(jù)庫,靜態(tài)資源被瀏覽器、反向代理擋掉,很少能擊中web服務(wù)器 實(shí)時性不高的動態(tài)頁,可以整頁緩存在反向代理端 實(shí)時性高,參數(shù)復(fù)雜的動態(tài)頁,分

10、為10個頁面片段 其中4個頁面片段,呈現(xiàn)層直接在分布式緩存中找到 剩余6個頁面片段web服務(wù)器無法直接獲取。但所需的數(shù)據(jù),其中4個可以由應(yīng)用服務(wù)器結(jié)合自己的緩存和分布式緩存計(jì)算得到,1個由應(yīng)用服務(wù)器基于內(nèi)存的業(yè)務(wù)數(shù)據(jù)得到 最終只有1個查詢落到數(shù)據(jù)庫端(還不一定需要訪問磁盤) 需要考慮的問題? 如果數(shù)據(jù)有重疊,需要刷新緩存怎么辦? 開發(fā)人員各自實(shí)現(xiàn)自己的緩存,造成浪費(fèi),增加debug難度。,緩存存儲方式的選擇,緩存存儲方式的選擇,背景: 單臺服務(wù)器2g內(nèi)存,200g磁盤 內(nèi)網(wǎng)千兆帶寬 緩存5kb省市聯(lián)動數(shù)據(jù) 緩存10kb請求中產(chǎn)生的數(shù)據(jù) 緩存100kb網(wǎng)站配置文件 緩存10mb敏感過濾詞列表 緩

11、存100mb游戲列表數(shù)據(jù) 緩存500m cms頁面數(shù)據(jù) 緩存1gb辭典原始數(shù)據(jù) 緩存1gb行級發(fā)布單數(shù)據(jù) 緩存1gb查詢結(jié)果數(shù)據(jù) 緩存100gb的報表聚合數(shù)據(jù) 緩存1tb的搜索索引數(shù)據(jù) 特殊情況下可否考慮多種存儲聯(lián)合使用?二級緩存,緩存的同步問題,什么時候需要同步緩存? 多份相同的數(shù)據(jù)保存在多個點(diǎn),比如負(fù)載均衡的應(yīng)用服務(wù)器中的大塊業(yè)務(wù)數(shù)據(jù)。 對數(shù)據(jù)實(shí)時性要求高,或是不允許數(shù)據(jù)出現(xiàn)不一致的現(xiàn)象,各自過期不能滿足要求。 緩存同步的方式? 被動同步:讓緩存依賴到一個點(diǎn)(文件、數(shù)據(jù)庫等)多份緩存同時過期,不適合永不過期的大塊數(shù)據(jù),不適合主動更新的緩存,存在一定的延時。 主動同步:把最新的keyvalu

12、e傳給各個節(jié)點(diǎn),或是把需要的key傳給各個節(jié)點(diǎn),由每一個節(jié)點(diǎn)從一個點(diǎn)(比如數(shù)據(jù)庫或memcache)去更新最新的值(后者也可以通過獨(dú)立的同步服務(wù)進(jìn)行)。 緩存同步的問題? 消耗太多的資源:一份數(shù)據(jù)因?yàn)橥皆诰W(wǎng)絡(luò)上傳多份,同步時的鎖,在端點(diǎn)很多的時候創(chuàng)建過多的連接。 需要這么做的時候考慮一下,需要同步的數(shù)據(jù)是否適合緩存,如果是的話,是否能在單點(diǎn)緩存?,緩存的顛簸問題,什么是緩存的顛簸問題? 緩存失效后到緩存重建之間的時間內(nèi),由于用戶都會訪問數(shù)據(jù)庫導(dǎo)致性能急劇下降。 應(yīng)用服務(wù)啟動的時候初始大量的數(shù)據(jù),大量的應(yīng)用服務(wù)器同時啟動給數(shù)據(jù)庫造成巨大壓力。 緩存可以改善性能,但是緩存也可能會在瞬時給系統(tǒng)造成

13、巨大的壓力,并且,由于緩存的存在,我們很難預(yù)測數(shù)據(jù)庫真正需要面對的壓力,一旦緩存基礎(chǔ)服務(wù)癱瘓,整個系統(tǒng)可能就癱瘓了。 有什么應(yīng)對方法? 考慮讓緩存永不失效,主動更新緩存,采用替換引用方式更新(主/次緩存),而不是先刪除。 對于大塊緩存的初始化考慮按需加載(延遲加載),或是盡量避免同時重啟初始化服務(wù)。 壓力測試考慮無緩存服務(wù)的情況。 還要注意盡量讓外界無法干擾key的生成,否則可能會帶來過多無效數(shù)據(jù)穿透緩存(比如直接根據(jù)querystring作為key來查詢緩存不是好辦法,不信任或不直接使用任何來自客戶端的東西)。,分布式緩存系統(tǒng)的需求,為什么選擇分布式架構(gòu)?太多的理由! 單臺服務(wù)器的資源(內(nèi)存

14、)不足以支撐我們的應(yīng)用。 負(fù)載均衡的服務(wù)器緩存了大量相同的拷貝。 負(fù)載均衡的服務(wù)器緩存需要同步,或者多點(diǎn)更新。 負(fù)載均衡的服務(wù)器在緩存丟失的時候?qū)?shù)據(jù)庫同時發(fā)起“攻擊”。 我們有很多服務(wù)器cpu資源緊張而內(nèi)存資源充足,得不到有效利用。 為什么存儲方式選擇內(nèi)存?內(nèi)存真不貴! 主要用于解決磁盤速度太慢。 使用cpu緩存不太現(xiàn)實(shí),即使可以速度也和網(wǎng)絡(luò)不匹配 。 為什么存儲結(jié)構(gòu)選擇哈希表(key-value)? 快速時間復(fù)雜度o(1)。 穩(wěn)定一直是o(1)。 簡單get/set/del。 天生就適合分布式不需要考慮如何拆分,key-value的粒度足夠小。 不過我們要針對key和value的設(shè)計(jì)做很多

15、工作,這又關(guān)于緩存的貢獻(xiàn)度。 于是乎,我們想到了memcache,memcache的基本介紹,分布式內(nèi)存對象緩存系統(tǒng);表現(xiàn)為分布式內(nèi)存哈希表dht; c/s架構(gòu);客戶端決定分布;服務(wù)端之間互不通信;多平臺;見縫插針; 不是數(shù)據(jù)庫;不提供故障轉(zhuǎn)移;不提供容災(zāi);不提供驗(yàn)證; 多客戶端訪問相同數(shù)據(jù)?序列化方式;壓縮方式;哈希方式; 基本命令:get/set/del/add/replace/incr/decr/stats/flush/gets/cas key 250字符(超過截?cái)啵?;value 1mb限制(超過失敗); 只是字符串(有些不能序列化的數(shù)據(jù)不適合);和進(jìn)程中緩存相比沒有緩存指針的優(yōu)勢; 始

16、終是緩存而不是數(shù)據(jù)庫;過期時間(最長30天)和lru(可以禁用);懶過期; 所有單條命令原子;1.2.5+ gets和cas(key, value, cas);,memcache的基本介紹,內(nèi)存存儲結(jié)構(gòu) slab allocator malloc/free 慢、內(nèi)存碎片 ( 也可使用use_system_malloc 編譯開關(guān)啟用) 以slab( page )1mb(其實(shí)會是小于1m chunk size的倍數(shù))為單位申請內(nèi)存 將slab分割為固定尺寸的chunk(-f 開關(guān)設(shè)置增長因子,默認(rèn)1.25) 把相同尺寸的chunk分成組也就是slab class(bucket) 選擇最合適的chu

17、nk保存,會造成浪費(fèi),以空間作為性能的tradeoff 如果全部空間都是10k的chunk,之后進(jìn)來的數(shù)據(jù)都是20k怎么辦?重啟動,memcache的基本介紹,單調(diào)性和平衡性 傳統(tǒng)方式:取模,一旦節(jié)點(diǎn)有改變,映射全部改變 一致性哈希:解決單調(diào)性,平衡性通過引入虛擬節(jié)點(diǎn)來解決,memcache的基本介紹,memcache的使用誤區(qū)和實(shí)踐,使用誤區(qū) 不能假設(shè)可靠性也就是100%獲取到數(shù)據(jù)(比如當(dāng)作static變量,或用于session)。 需要考慮網(wǎng)絡(luò)開銷或序列化反序列化開銷(一個頁面數(shù)十個請求,拆分存儲大對象)。 key-value的存儲決定了在設(shè)計(jì)階段需要考慮如何使用緩存而不是在發(fā)布前去用。

18、使用實(shí)踐 不要和需要內(nèi)存的服務(wù)一起部署,可以和需要cpu的服務(wù)一起部署,不要開啟swap。 定義具有意義的key,命名空間_業(yè)務(wù)相關(guān)主鍵id,而不是一段hash值:批量刪除、批量獲取、避免沖突,還可以在key中包含版本號,老的數(shù)據(jù)”自然死亡“。 對于value到底是保存序列化后的立體對象還是字符分隔的平面對象?比如: 標(biāo)題 : 標(biāo)題1, id:1 , 標(biāo)題: 標(biāo)題2, id:2 還是 “標(biāo)題_id1_標(biāo)題2_id2”。,memcache的使用誤區(qū)和實(shí)踐,對于列表數(shù)據(jù),可以采用兩種數(shù)據(jù)結(jié)構(gòu)兩段式存?。╥ds和行數(shù)據(jù)id-value),排序、查找基于ids(可以根據(jù)條件定義多個ids,比如news

19、_from_0_to_100、news_category_1_top_20)而更新只需更新行數(shù)據(jù)。 如果沒有維護(hù)ids結(jié)構(gòu)可以直接根據(jù)key查找列表數(shù)據(jù),比如news_2010_6_1_12_00,我們就可以實(shí)現(xiàn)分頁列表但不能提供總頁數(shù)功能。 善于利用append和prepend(留言添加應(yīng)用,甚至可以采用命令疊加ids:1,2,3,2d,4)。 善于使用批量獲取來減少網(wǎng)絡(luò)調(diào)用,必要情況下把相關(guān)的key指定服務(wù)器保存。 改變思路,使用分布式緩存需要在設(shè)計(jì)階段花一些時間,把緩存的時間和業(yè)務(wù)緊密連接并根據(jù)keyvalue的特性(不利于范圍查詢、搜索等)來舍棄一些不那么必要的業(yè)務(wù)功能。 對于需要枚舉

20、key的應(yīng)用最好具有單獨(dú)的memcached集群。 可以基于memcache做一些擴(kuò)展,比如分布式鎖等等。,windows server appfabric caching,什么是windows server appfabric? 包含caching和hosting兩部分。 增強(qiáng)有關(guān)caching和hosting的基礎(chǔ)結(jié)構(gòu)。 windows server appfabric 解決的問題? 分布式緩存 持久化的工作流 監(jiān)控wcf/wf應(yīng)用程序 基于iis和powershell的管理工具 windows server appfabric 的優(yōu)缺點(diǎn) 生產(chǎn)環(huán)境操作系統(tǒng)受限于 windows server 2008 sp2和windows server 2008 r2,基本都需要依賴.net框架4.0。 功能非常完善,能做到都做了,并且可以和很多微軟產(chǎn)品很好結(jié)合。 大多數(shù)組件和工具基于.net/c#/wcf實(shí)現(xiàn),不要對性能期望過多。 要ge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論