淺談分佈式緩存那些事兒

一、爲什麼使用緩存

在看這個問題之前,可以先看一下成功的軟件產品具備哪些特點:
1)能解決目標用戶的痛點
2)能夠爲企業或個人帶來利益
3)具有不錯的用戶粘性
其中一個極其重要的因素就是要有好的用戶體驗

二、分佈式緩存的特性

分佈式緩存具有如下特性:

  1. 高性能:當傳統數據庫面臨大規模數據訪問時,磁盤I/O 往往成爲性能瓶頸,從而導致過高的響應延遲.分佈式緩存將高速內存作爲數據對象的存儲介質,數據以key/value 形式存儲,理想情況下可以獲得DRAM 級的讀寫性能;
  2. 動態擴展性:支持彈性擴展,通過動態增加或減少節點應對變化的數據訪問負載,提供可預測的性能與擴展性;同時,最大限度地提高資源利用率;
  3. 高可用性:可用性包含數據可用性與服務可用性兩方面.基於冗餘機制實現高可用性,無單點失效(single point of failure),支持故障的自動發現,透明地實施故障切換,不會因服務器故障而導致緩存服務中斷或數據丟失.動態擴展時自動均衡數據分區,同時保障緩存服務持續可用;
  4. 易用性:提供單一的數據與管理視圖;API 接口簡單,且與拓撲結構無關;動態擴展或失效恢復時無需人工配置;自動選取備份節點;多數緩存系統提供了圖形化的管理控制檯,便於統一維護;
  5. 分佈式代碼執行(distributed code execution):將任務代碼轉移到各數據節點並行執行,客戶端聚合返回結果,從而有效避免了緩存數據的移動與傳輸.最新的Java 數據網格規範JSR-347中加入了分佈式代碼執行與Map/reduce 的API 支持,各主流分佈式緩存產品,如IBM WebSphere eXtreme Scale,VMware GemFire,GigaSpaces XAP 和Red Hat Infinispan 等也都支持這一新的編程模型.

三、緩存應用場景

分佈式緩存的典型應用場景可分爲以下幾類:
1)、頁面緩存:用來緩存Web 頁面的內容片段,包括HTML、CSS 和圖片等,多應用於社交網站等;
2)、瀏覽器緩存、服務端緩存、數據庫緩存
3)、平臺級緩存:在系統開發的時候,適當地使用平臺級緩存,往往可以取到事半功倍的效果。平臺級緩存在這裏指的是用來寫帶有緩存特性的應用框架,或者可用於緩存功能的專用庫(如 PHP 中的 Smarty 模版庫);
4)、應用級緩存:當平臺級緩存不能滿足系統性能要求的時候,就要考慮使用應用級緩存了。應用級緩存,需要開發着通過代碼來實現緩存機制。這裏是 NoSQL 的勝場,不論是 Redis 還是 MongoDB,以及 Memcached 都可以作爲應用級緩存的重要技術。一種典型的方式是每分鐘或一段時間後統一生成某類頁面存儲在緩存中,或者可以在熱數據變化時更新緩存;
5)、狀態緩存:緩存包括Session 會話狀態及應用橫向擴展時的狀態數據等,這類數據一般是難以恢復的,對可用性要求較高,多應用於高可用集羣;
6)、並行處理:通常涉及大量中間計算結果需要共享;
7)、事件處理:分佈式緩存提供了針對事件流的連續查詢(continuous query)處理技術,滿足實時性需求;
8)、極限事務處理:分佈式緩存爲事務型應用提供高吞吐率、低延時的解決方案,支持高併發事務請求處理,多應用於鐵路、金融服務和電信等領域;

四、分佈式緩存的發展

分佈式緩存經歷了多個發展階段,由最初的本地緩存到彈性緩存平臺直至彈性應用平臺[8],目標是朝着構建更好的分佈式系統方向發展(如下圖所示).

  1. 本地緩存:數據存儲在應用代碼所在內存空間.優點是可以提供快速的數據訪問;缺點是數據無法分佈式共享,無容錯處理.典型的,如Cache4j;
  2. 分佈式緩存系統:數據在固定數目的集羣節點間分佈存儲.優點是緩存容量可擴展(靜態擴展);缺點是擴展過程中需要大量配置,無容錯機制.典型的,如 Memcached;
    在這裏插入圖片描述
  3. 彈性緩存平臺:數據在集羣節點間分佈存儲,基於冗餘機制實現高可用性.優點是可動態擴展,具有容錯能力;缺點是複製備份會對系統性能造成一定影響.典型的,如 Windows Appfabric Caching;
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 彈性應用平臺:彈性應用平臺代表了雲環境下分佈式緩存系統未來的發展方向.簡單地講,彈性應用平臺是彈性緩存與代碼執行的組合體,將業務邏輯代碼轉移到數據所在節點執行,可以極大地降低數據傳輸開銷,提升系統性能.典型的,如 GigaSpaces XAP.
    在這裏插入圖片描述
    在這裏插入圖片描述

五、分佈式緩存部分應用

1、基於 Redis 的多級緩存示例
一個使用了 Redis 集羣和其他多種緩存技術的應用系統架構如圖所示:
在這裏插入圖片描述
1)首先,用戶的請求被負載均衡服務分發到 Nginx 上,此處常用的負載均衡算法是輪詢或者一致性哈希,輪詢可以使服務器的請求更加均衡,而一致性哈希可以提升 Nginx 應用的緩存命中率。
2)接着,Nginx 應用服務器讀取本地緩存,實現本地緩存的方式可以是 Lua Shared Dict,或者面向磁盤或內存的 Nginx Proxy Cache,以及本地的 Redis 實現等,如果本地緩存命中則直接返回。Nginx 應用服務器使用本地緩存可以提升整體的吞吐量,降低後端的壓力,尤其應對熱點數據的反覆讀取問題非常有效。如果 Nginx 應用服務器的本地緩存沒有命中,就會進一步讀取相應的分佈式緩存——Redis 分佈式緩存的集羣,可以考慮使用主從架構來提升性能和吞吐量,如果分佈式緩存命中則直接返回相應數據,並回寫到 Nginx 應用服務器的本地緩存中。
3)如果 Redis 分佈式緩存也沒有命中的時候,則會回源到 Tomcat 集羣,在回源到 Tomcat 集羣時也可以使用輪詢和一致性哈希作爲負載均衡算法。當然,如果 Redis 分佈式緩存沒有命中的話,Nginx 應用服務器還可以再嘗試一次讀主 Redis 集羣操作,目的是防止當從 Redis 集羣有問題時可能發生的流量衝擊。在 Tomcat 集羣應用中,首先讀取本地平臺級緩存,如果平臺級緩存命中則直接返回數據,並會同步寫到主 Redis 集羣,然後再同步到從 Redis 集羣。此處可能存在多個 Tomcat 實例同時寫主 Redis 集羣的情況,可能會造成數據錯亂,需要注意緩存的更新機制和原子化操作。
4)如果所有緩存都沒有命中,系統就只能查詢數據庫或其他相關服務獲取相關數據並返回,當然,我們已經知道數據庫也是有緩存的。
5)整體來看,這是一個使用了多級緩存的系統。Nginx 應用服務器的本地緩存解決了熱點數據的緩存問題,Redis 分佈式緩存集羣減少了訪問回源率,Tomcat 應用集羣使用的平臺級緩存防止了相關緩存失效或崩潰之後的衝擊,數據庫緩存提升數據庫查詢時的效率。
6)正是多級緩存的使用,才能保障系統具備優良的性能。
2、基於雲服務的分佈式緩存
雲服務不僅爲軟件系統的開發和部署帶來了更多的敏捷性,而且提供了更多創新的可能性。當分佈式緩存技術遇到雲服務會是怎樣的情形呢?EVCache 就是這樣的一種技術。
EVCache 是一個開源、快速的分佈式緩存,基於 Memcached 的內存存儲 和 Spymemcached 客戶端實現的解決方案,主要用在亞馬遜彈性計算雲服務 (AWS EC2)的基礎設施上,爲雲計算做了優化,能夠順暢而高效地提供數據層服務。
EVCache 在 Netflix 內部是一個被廣泛使用的數據緩存服務,所提供的低延遲且高可用的緩存方案可以很好地滿足 Netflix 微服務架構需要,也用來做一般數據的存儲。EVCache 能夠使面向終端用戶的應用,個性化算法和各種微服務都具備優良的性能。
EVCache 具有如下的特性:
1)分佈式的鍵值對存儲 , 緩存可以跨越多個實例;
2)數據可以跨越亞馬遜雲服務的可用區進行復制;
3)通過 Netflix 內部的命名服務進行註冊,自動發現新節點和服務;
4)爲了存儲數據,鍵是非空字符串,值可以是非空的字節數組,基本類型,或者序列化對象,且小於 1 MB;
5)作爲通用的緩存集羣被各種應用使用,支持可選的緩存名稱,以命名空間避免主鍵衝突;
6)一般的緩存命中率在 99% 以上;
與 Netflix 駐留數據框架能夠良好協作,典型的訪問次序: 內存 ->EVCache -> Cassandra/SimpleDB/S3。
使用緩存技術所帶來的最大影響可能是數據的不一致性。出於性能優先的考慮,具體的應用會依賴於 EVCache 來處理數據的不一致性。
對於存活時間很短的數據,用 TTL 設置數據的失效時間,對於長時間保留的數據,通過構建一致性檢查來修復它們。
一個典型的用例是 Netflix 向用戶推薦與已看歷史中節目類似的電影或者電視節目,如下圖所示:
在這裏插入圖片描述
內容相似性推薦服務給出了與已看歷史中節目類似的電影或者電視節目的相似性列表。一旦計算出了相似性,就存儲在 SimpleDB/S3 中,前端使用 EVCache。
當任何應用或者算法需要這些數據的時候,可以從 EVCache 提取數據,並返回結果。具體過程如下:
1)一個客戶向 Web 應用發了一個頁面請求,處理這一請求需要得到一個電影或電視節目的相似性列表;
2)Web 應用查詢 EVCache 來得到這些數據,這樣場景的典型緩存命中率高於 99.9%;
3)如果緩存沒有命中,Web 應用將調用相似性計算服務來計算這些數據;
4)如果已經計算過的數據也沒有命中的話,相似性計算服務將從 SimpleDB 中讀取數據。如果在 SimpleDB 沒有,相似性計算服務根據給出的電影或電視節目重新計算相似性;
5)相似性計算服務在計算出電影或電視節目的數據後,將數據寫入到 EVCache 中;
6)最後,相似性計算服務生成客戶端所需要的響應並返回給客戶端。

參考地址:

  1. https://www.cnblogs.com/softidea/p/5555578.html
  2. https://blog.csdn.net/gitchat/article/details/78913230

不足之處,還望大牛多多指點,相互學習,共同進步~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章