新聞中心
當(dāng)云服務(wù)融入分布式緩存系統(tǒng)架構(gòu),會(huì)擦出怎樣的火花?
作者:曹洪偉 2018-03-23 10:42:14
服務(wù)器
分布式 在互聯(lián)網(wǎng)技術(shù)中有兩大支點(diǎn),其中一個(gè)就是緩存,而分布式緩存系統(tǒng)更是大型互聯(lián)網(wǎng)應(yīng)用的利器。面對(duì)不斷增長的海量數(shù)據(jù)、不可預(yù)知的流量模式以及快速響應(yīng)時(shí)間的需求,這正是云計(jì)算服務(wù)的動(dòng)態(tài)性之關(guān)鍵優(yōu)勢。

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


咨詢
建站咨詢
