緩存是分布式系統中的重要組件,主要解決高並發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。
本文是緩存在分布式應用第一篇文章,介紹緩存的原理,緩存的分類,緩存的設計,CDN緩存(原理,架構參考和技術實踐),反向代理緩存(原理,Squid架構實踐和常用代理緩存之間的比較)。本文主要是自己的學習總結和網絡文章摘錄,供學習之用。
本次分享大綱
- 緩存概述
- CDN緩存
- 反向代理緩存
- 分布式緩存
- 本地緩存
- 緩存架構示例
- 參考資料
- 分享總結
一、緩存概述
緩存是分布式系統中的重要組件,主要解決高並發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。
1.1緩存的原理
(1) 將數據寫入/讀取速度更快的存儲(設備);
(2) 將數據緩存到離應用最近的位置;
(3) 將數據緩存到離用戶最近的位置。
1.2緩存分類
在分布式系統中,緩存的應用非常廣泛,從部署角度有以下幾個方面的緩存應用。
(1) CDN緩存;
(2) 反向代理緩存;
(3) 分布式Cache;
(4) 本地應用緩存;
1.3緩存媒介
常用中間件:Varnish,Ngnix,Squid,Memcache,Redis,Ehcache等;
緩存的內容:文件,數據,對象;
緩存的介質:CPU,內存(本地,分布式),磁盤(本地,分布式)
1.3緩存設計
緩存設計需要解決以下幾個問題:
(1) 緩存什么?
哪些數據需要緩存:1.熱點數據;2.靜態資源;
(2) 緩存的位置?
CDN,反向代理,分布式緩存服務器,本機(內存,硬盤)
(3) 如何緩存的問題?
- 過期策略
1.固定時間:比如指定緩存的時間是30分鍾;
2.相對時間:比如最近10分鍾內沒有訪問的數據;
- 同步機制
- 實時寫入;(推)
- 異步刷新;(推拉)
二、CDN緩存
CDN主要解決將數據緩存到離用戶最近的位置,一般緩存靜態資源文件(頁面,腳本,圖片,視頻,文件等)。國內網絡異常復雜,跨運營商的網絡訪問會很慢。為了解決跨運營商或各地用戶訪問問題,可以在重要的城市,部署CDN應用。使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。
2.1CND原理
CDN的基本原理是廣泛采用各種緩存服務器,將這些緩存服務器分布到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求。
(1) 未部署CDN應用前

網絡請求路徑:
請求:本機網絡(局域網)——》運營商網絡——》應用服務器機房
響應:應用服務器機房——》運營商網絡——》本機網絡(局域網)
在不考慮復雜網絡的情況下,從請求到響應需要經過3個節點,6個步驟完成一次用戶訪問操作。
(2) 部署CDN應用后

網絡路徑:
請求:本機網絡(局域網)——》運營商網絡
響應:運營商網絡——》本機網絡(局域網)
在不考慮復雜網絡的情況下,從請求到響應需要經過2個節點,2個步驟完成一次用戶訪問操作。
與不部署CDN服務相比,減少了1個節點,4個步驟的訪問。極大的提高的系統的響應速度。
2.2 CDN優缺點
(1)優點(摘自百度百科)
1、本地Cache加速:提升訪問速度,尤其含有大量圖片和靜態頁面站點;
2、鏡像服務:消除了不同運營商之間互聯的瓶頸造成的影響,實現了跨運營商的網絡加速,保證不同網絡中的用戶都能得到良好的訪問質量;
3、遠程加速:遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度;
4、帶寬優化:自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減少遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。
5、集群抗攻擊:廣泛分布的CDN節點加上節點之間的智能冗余機制,可以有效地預防黑客入侵以及降低各種D.D.o.S攻擊對網站的影響,同時保證較好的服務質量。
(2)缺點
1.動態資源緩存,需要注意實時性;
解決:主要緩存靜態資源,動態資源建立多級緩存或准實時同步;
2.如何保證數據的一致性和實時性需要權衡考慮;
解決:
- 設置緩存失效時間(1個小時,最終一致性);
- 數據版本號;
2.3CND架構參考
摘自《雲宙視頻CDN系統》
2.4 CND技術實踐
目前,中小型互聯網公司,綜合成本考慮,一般租用第三方CDN服務,大型互聯網公司,采用自建或第三方結合的方式。比如淘寶剛開始使用第三方的,當流量很大后,第三方公司無法支撐其CDN流量,淘寶最后采用自建CDN的方式實現。
淘寶CDN,如下圖(來自網絡):

三、反向代理緩存
反向代理是指在網站服務器機房部署代理服務器,實現負載均衡,數據緩存,安全控制等功能。
3.1緩存原理
反向代理位於應用服務器機房,處理所有對WEB服務器的請求。如果用戶請求的頁面在代理服務器上有緩沖的話,代理服務器直接將緩沖內容發送給用戶。如果沒有緩沖則先向WEB服務器發出請求,取回數據,本地緩存后再發送給用戶。通過降低向WEB服務器的請求數,從而降低了WEB服務器的負載。

反向代理一般緩存靜態資源,動態資源轉發到應用服務器處理。常用的緩存應用服務器有Varnish,Ngnix,Squid。
3.2 Squid示例
Squid 反向代理一般只緩存靜態資源,動態程序默認不緩存。根據從 WEB 服務器返回的 HTTP 頭標記來緩沖靜態頁面。有四個最重要 HTTP 頭標記:
Last-Modified: 告訴反向代理頁面什么時間被修改
Expires: 告訴反向代理頁面什么時間應該從緩沖區中刪除
Cache-Control: 告訴反向代理頁面是否應該被緩沖
Pragma: 用來包含實現特定的指令,最常用的是 Pragma:no-cache

Squid 反向代理加速網站實例
(1) 通過DNS的輪詢技術,將客戶端的請求分發給其中一台 Squid 反向代理服務器處理;
(2) 如果這台 Squid 緩存了用戶的請求資源,則將請求的資源直接返回給用戶;
(3) 否則這台 Squid 將沒有緩存的請求根據配置的規則發送給鄰居 Squid 和后台的 WEB 服務器處理;
(4) 這樣既減輕后台 WEB 服務器的負載,又提高整個網站的性能和安全性。
3.2 代理緩存比較
常用的代理緩存有Varnish,Squid,Ngnix,簡單比較如下:
(1) varnish和squid是專業的cache服務,nginx需要第三方模塊支持;
(2) Varnish采用內存型緩存,避免了頻繁在內存、磁盤中交換文件,性能比Squid高;
(3) Varnish由於是內存cache,所以對小文件如css,js,小圖片啥的支持很棒,后端的持久化緩存可以采用的是Squid或ATS;
(4) Squid功能全而大,適合於各種靜態的文件緩存,一般會在前端掛一個HAProxy或nginx做負載均衡跑多個實例;
(5) Nginx采用第三方模塊ncache做的緩沖,性能基本達到varnish,一般作為反向代理使用,可以實現簡單的緩存。
