當雲服務融入分散式緩存系統架構,會擦出怎樣的火花?
作者介紹
在互聯網技術中有兩大支點,其中一個就是緩存,而分散式緩存系統更是大型互聯網應用的利器。面對不斷增長的海量數據、不可預知的流量模式以及快速響應時間的需求,這正是雲計算服務的動態性之關鍵優勢。
那麼,當雲服務融入分散式緩存系統架構,會碰撞出怎樣的火花呢?
大型互聯網應用中的緩存
先回顧一下緩存在大型互聯網應用的架構(如圖1),網站在發展的歷程中,業務量的增長是幸福的煩惱,而緩存技術就是解除煩惱的靈丹妙藥,能夠再次理解為什麼是緩存為王。
圖1 緩存在大型網站系統中的應用
實際上,這時的系統進入了無級縮放的大型網站階段,當網站流量增加時,應對的解決方案就是不斷地添加Web 伺服器、資料庫伺服器以及緩存伺服器了。如何動態的增減伺服器,這正是雲服務的用武之地。
雲服務的優勢
對企業而言,雲服務有著諸多的商業優勢。
首先,企業的前期基礎設施投資幾乎為零。如果要建立一個大型的系統,可能需要大量的投資用于于機房、硬體(機架、伺服器、路由器、備用電源)、硬體管理(電源管理、散熱)和運維人員。由於高昂的前期成本,該項目通常在開始之前需要多輪的管理審批和論證。而採用公有雲服務,幾乎沒有固定成本或啟動成本。
其次,雲服務提供了基礎設施即時性。在過去,當互聯網應用開始大規模上量時,如果基礎設施跟不上規模的增長,將會極大地影響應用的成功。但如果前期投入了大量資金,而應用沒有得到普及,基礎設施又將成為失敗的犧牲品。雲服務增加了靈活性,降低了風險和運營成本,可以根據用於成長的規模而按需付費。
最後,雲服務可以更有效地利用資源,根據使用狀況來計算成本,同時縮短產品的上市時間。
雲服務的技術優勢同樣明顯,主要的特點如下:
自動化:基礎設施的腳本化可以通過充分利用API對基礎設施編程,完成構建和系統部署的可重複性。
自動擴展:無需任何人工干預,就可以根據需求對應用進行雙向擴展。自動縮放提高了自動化程度從而更加高效。
主動擴展:基於需求預期和流量模式的合理規劃,可以對應用進行雙向擴展讓從而保持低成本運營。
更有效的開發周期:可以很容易將開發和測試環境複製到生產系統,不同階段的環境可以很容易地推廣到生產系統。
改進的可測性:不需要進行硬體過載的測試,注入和自動化測試能夠持續於開發過程的各個階段。
災難恢復和業務連續性:雲服務為維護一系列應用伺服器和數據存儲提供了低成本選擇。使用雲服務,可以在幾分鐘內完成將某一地點的環境複製到其他地域的雲環境中。
雲服務的選擇有很多,如阿里雲、百度雲、騰訊雲等,但AWS作為雲服務的商用鼻祖,有著很多獨特的特性和廣泛的應用。AWS雲服務以最小的支持和管理成本,通過高度可靠和可擴展的基礎設施,提供了Web應用部署的解決方案,其靈活性遠高於自建的基礎設施,無論這些設施是企業內部的部署環境還是在數據中心設施。
EVCache:基於雲服務的分散式緩存系統
雲服務不僅為軟體系統的開發和部署帶來了更多的敏捷性,而且提供了更多創新的可能性。AWS雲服務與分散式緩存服務系統相結合就產生了一些傑出的技術方案,一個典型的案例是Netflix的EVCache。
EVCache 是一個開源、快速的分散式緩存,基於 Memcached的內存存儲和 Spymemcached 客戶端實現的解決方案,主要用在亞馬遜彈性計算雲服務 (AWS EC2)的基礎設施上,為雲計算做了優化,能夠順暢而高效地提供數據層服務。
EVCache 是一個縮寫,包括:
Ephemeral: 數據存儲是短暫的,有自身的存活時間。
Volatile: 數據可以在任何時候消失。
Cache:一個內存型的鍵值對存儲系統。
EVCache實現的主要功能包括分散式鍵值對存儲、AWS的跨區域數據複製以及註冊和自動發現新節點或新服務。EVCache典型的應用是對上下文一致性要求不高的場景,其可擴展性已經可以處理非常大的流量,同時提供了健壯的API。
Netflix 是微服務架構領域的實踐者,在系統中布署了上百個微服務,每一個微服務只專註做一件事情。這使得Netflix所提供的軟體系統能夠做到高度均衡和松耦合。由於狀態都存儲在緩存或持久存儲中,所以這些微服務大多數是無狀態的,易於自動擴展。
EVCache在Netflix內部是一個被廣泛使用的數據緩存服務,所提供的低延遲且高可用的緩存方案可以很好地滿足Netflix微服務架構需要,也用來做一般數據的存儲。EVCache 能夠使面向終端用戶的應用,個性化演算法和各種微服務都具備優良的性能。
EVCache 具有如下的特性:
分散式的鍵值對存儲, 緩存可以跨越多個實例
數據可以跨越亞馬遜雲服務的可用區進行複製
通過Netflix內部的命名服務進行註冊,自動發現新節點和服務
為了存儲數據,鍵是非空字元串,值可以是非空的位元組數組、基本類型或者序列化對象,且小於 1 MB
作為通用的緩存集群被各種應用使用,支持可選的緩存名稱,以命名空間避免主鍵衝突
一般的緩存命中率在 99%以上
與Netflix 駐留數據框架能夠良好協作,典型的訪問次序: 內存 ->EVCache -> Cassandra/SimpleDB/S3
1
EVCache 的CS架構
EVCache客戶端是一個Java的客戶端,用於發現EVCache伺服器並管理所有的增刪改查(CRUD)操作,由客戶端處理在集群中添加/刪除伺服器。基於亞馬遜雲服務可用區,客戶端在執行創建、更新和刪除操作的時候複製數據。
另一方面,客戶端的讀操作直接從同一可用區的伺服器讀取數據。圖2展示了EVCache 的典型部署結構和單節點客戶端實例與伺服器的關係。
圖2 EVCache單節點客戶端實例與伺服器的關係
一個EVCache客戶端連接了多個EVCache的伺服器集群。 在一個區域內,Netflix有多個全數據集的拷貝,由亞馬遜雲服務的可用區隔離開來。虛線框描述了區域內的副本,每個擁有數據的全量鏡像,作為AWS的自動伸縮組來管理這些鏡像。某些緩存在一個區域內有兩個鏡像,有的擁有更多。這種高層架構長期來看是有效的,不會改變,每個客戶端連接自己區域內所有可用區的所有伺服器。寫操作被發往所有實例,讀操作優先選擇離讀請求近的伺服器。
2
EVCache 跨區域複製
Netflix的全球雲服務遍布AWS各個服務區域,例如北弗吉尼亞、俄勒岡州和愛爾蘭,為這些地區的會員提高就近服務,但網路流量會因為各種原因改變,比如關鍵基礎設施出了問題故障,或者地區之間進行失敗恢復的練習等,因此Netflix採用無態應用伺服器服務於來自任何地區的會員。
這些數據如果從持久層存儲獲得將會非常昂貴(造成頻繁的資料庫訪問),Netflix需要將這種數據寫入到本地緩存,而且必須複製到所有地區的緩存中,以便服務於各個地區的用戶請求。
微服務是依賴於緩存的,必須快速可靠地訪問多種類型的數據,比如會員的觀影歷史、排行榜和個性化推薦等,這些數據的更新與改變都必須複製到全世界各個地區,以便這些地區的用戶能夠快速可靠地訪問。
圖3 EVCache 跨地域的數據複製
這張圖說明複製操作是在SET操作以後實現,應用程序調用EVCache客戶端庫的set方法,之後複製路徑對於調用者是透明的:
EVCache客戶端庫發送SET到緩存系統的本地地區的一個實例伺服器中
EVCache客戶端庫同時也將寫入元數據(包括key,但不包括要緩存的數據本身)到複製消息隊列(Kafka)
本地區的複製中繼服務將會從這個消息隊列中讀取消息
中繼服務會從本地緩存中抓取符合key的數據
中繼服務會發送一個SET請求到另一個地域的複製中繼服務
在另一個區域中,複製中繼服務會接受請求,然後執行SET操作到它的本地緩存,完成複製
在接受地區的本地應用當通過GET操作以後會在本地緩存上看到這個已經更新的數據值
這是一個簡單描述,需要注意的是,它只會對SET操作有效,對於其它DELETE TOUCH或批mutation等操作不會複製,DELETE和TOUCH是非常類似的,只有一點不同:它們不從本地緩存中讀取已經存在的值。
跨區域複製主要是通過消息隊列進行,一個地區的EVCache客戶端不會注意到其它地區的複製情況,讀寫都是只使用本區域緩存,不會和其它地區緩存耦合,通過消息系統來解耦合。
3
EVCache 的高可用性
AWS的每個區域一般由多個可用區(AZ)組成,而可用區一般是由多個數據中心組成。AWS引入可用區設計主要是為了提升用戶應用程序的高可用性。因為可用區與可用區之間在設計上是相互獨立的,也就是說它們會有獨立的供電、獨立的網路等,這樣假如一個可用區出現問題時也不會影響另外的可用區。在一個區域內,可用區與可用區之間是通過高速網路連接,從而保證很低的延時。
EVCache實例通過將Amazon EC2放到多個可用區, 能夠預防應用的單點故障。無論在相同的物理區域內還是在不同的物理區域之間,在多個AZ上運行獨立的應用都是非常重要的。如果一個可用區失效了,在其它可用區上的應用可以繼續運行,從而實現高可用性。
由於跨越了多個亞馬遜雲服務可用區,EVCache集群是不會掛掉的。當其中的實例偶然掛掉時,通過一致性哈希跨集群分片來使緩存的影響降到最低。
在保持高可用性的同時,操作EVCache集群的總體成本很低,因為緩存沒有命中時訪問亞馬遜雲服務服務的成本較高,如訪問SimpleDB、AWS S3、EC2上的Cassandra等等。EVCache 集群的總體成本在高穩定,線性擴展的條件下還是令人滿意的。
隱藏在需求後面的是數據或狀態所需要的每個請求服務,必須是跨地區可用的。高可靠性資料庫和高性能緩存是支持分散式架構的基礎設施,一個典型場景是將緩存架構於資料庫前面或其它持久存儲前面。如果沒有緩存的全局複製,一個地區的的會員切換到另外一個地區時,會在新的地區緩存中沒有原地區的數據,這種情況稱為冷緩存。處理這種緩存數據丟失的辦法只有重新從資料庫載入,但是這種方式會延長響應時間並對資料庫形成巨大衝擊,EVCache 除了跨可用區複製之外,還提供了跨區域複製,對基於AWS的高可用性進行了增強。
4
EVCache的典型應用場景
Netflix的用戶體驗重度依賴於大容量、低時延、全球可用的緩存數據層。例如,用戶坐在沙發上看電影或者電視節目,在用戶的每一次交互中都有緩存的身影,從會話存儲到視頻歷史,到用戶狀態,都得益於EVCache的穩定和高容錯性。
這裡介紹一個典型的用例——向用戶推薦與已看歷史中節目類似的電影或者電視節目。圖4 介紹了推薦相似性內容的服務流程以及EVCache在其中的作用。
圖4 使用EVCache推薦相似內容的典型用例
內容相似性推薦服務給出了與已看歷史中節目類似的電影或者電視節目的相似性列表。一旦計算出了相似性,就存儲在SimpleDB/S3 中,前端使用EVCache。當任何應用或者演算法需要這些數據的時候,可以從 EVCache提取數據,並返回結果。具體過程如下:
一個客戶向Web應用發了一個頁面請求,處理這一請求需要得到一個電影或電視節目的相似性列表
Web應用查詢 EVCache 來得到這些數據,這樣場景的典型緩存命中率高於99.9%
如果緩存沒有命中, Web應用將調用相似性計算服務來計算這些數據
如果已經計算過的數據也沒有命中的話, 相似性計算服務將從 SimpleDB中讀取數據。如果在SimpleDB 沒有,相似性計算服務根據給出的電影或電視節目重新計算相似性
相似性計算服務在計算齣電影或電視節目的數據後,將數據寫入到 EVCache中
最後,相似性計算服務生成客戶端所需要的響應並返回給客戶端
EVCache 是線性擴展的,通過容量監控,可以在一分鐘內擴容,在幾分鐘內完成重新均衡和數據預熱。
好書搶先看
本文節選自《深入分散式緩存:從原理到實踐》一書,可登錄網址:https://item.jd.com/12276070.html進行訂購。更多書籍精華內容也將由DBAplus社群陸續呈現。
※高手指路:Linux運維工程師的大數據安全修鍊手冊
※基於支付場景的微服務高可用架構實戰
TAG:DBAplus社群 |