大型網站架構系列:緩存在分散式系統中的應用(一)

来源:http://www.cnblogs.com/itfly8/archive/2016/06/06/5562610.html
-Advertisement-
Play Games

緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分散式應用第一篇文章,介紹緩存的原理,緩存的分類,緩存的設計,CDN緩存(原理,架構參考和技術實踐),反向代理緩存(原理,Squid架構實踐和常用代理緩存之間的比較)。 ...


緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。

本文是緩存在分散式應用第一篇文章,介紹緩存的原理,緩存的分類,緩存的設計,CDN緩存(原理,架構參考和技術實踐),反向代理緩存(原理,Squid架構實踐和常用代理緩存之間的比較)。本文主要是自己的學習總結和網路文章摘錄,供學習之用。

本次分享大綱

  1. 緩存概述
  2. CDN緩存
  3. 反向代理緩存
  4. 分散式緩存
  5. 本地緩存
  6. 緩存架構示例
  7. 參考資料
  8. 分享總結

一、緩存概述

緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。

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分鐘內沒有訪問的數據;

  • 同步機制
  1. 實時寫入;(推)
  2. 非同步刷新;(推拉)

二、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. 設置緩存失效時間(1個小時,最終一致性);
  2. 數據版本號;

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,一般作為反向代理使用,可以實現簡單的緩存。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1018: A+B again 題目描述 谷學長有一個非常簡單的問題給你,給你兩個整數A和B,你的任務是計算A+B。 谷學長有一個非常簡單的問題給你,給你兩個整數A和B,你的任務是計算A+B。 輸入 輸入的第一行包含一個整數T(T<=20)表示測試實例的個數,然後2*T行,分別表示A和B兩個正整數。 ...
  • 步驟: ...
  • 今天把一個列表轉換成字元串輸出的時候出現了UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)問題,使用的是ulipad編譯器。 解決方法1: 在開 ...
  • 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石 ...
  • 1 打開文件 在對文件進行讀、寫操作之前,首先要解決的問題是如何把程式中要讀、寫的文件與磁碟上實際的數據文件聯繫起來。在 C 語言中這並不困難,只需調用 C 語言提供的庫函數 fopen “打開”文件就可實現這些聯繫。fopen 函數的一般調用形式為: fopen(文件名,文件使用方式); 函數返回 ...
  • 轉自:http://www.gowhich.com/blog/147?utm_source=tuicool&utm_medium=referral 源碼下載的地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ ...
  • web許可權設計,做許可權目前有三種主流實現方式 第一種:手動實現 配置2個攔截器,一個是攔截是否登陸,一個是攔截url的許可權,通過角色許可權表的配置,把許可權url的路徑與訪問資源的url進行匹配 第二種:spring-security實現,比較重,不推薦 第三章:shiro,目前spring已經捨棄自己 ...
  • 緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分散式應用第二篇文章,介紹分散式緩存,Memcache,Redis,本地緩存(硬碟緩存,記憶體緩存)以及緩存在分散式系統中的架構示例。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...