EVCache在Netflix內(nèi)部是一個(gè)被廣泛使用的數(shù)據(jù)緩存服務(wù),所提供的低延遲且高可用的緩存方案可以很好地滿(mǎn)足Netflix微服務(wù)架構(gòu)需要,也用來(lái)做一般數(shù)據(jù)的存儲(chǔ)。EVCache 能夠使面向終端用戶(hù)的應(yīng)用,個(gè)性化算法和各種微服務(wù)都具備優(yōu)良的性能。
EVCache 具有如下的特性:
分布式的鍵值對(duì)存儲(chǔ), 緩存可以跨越多個(gè)實(shí)例數(shù)據(jù)可以跨越亞馬遜云服務(wù)的可用區(qū)進(jìn)行復(fù)制通過(guò)Netflix內(nèi)部的命名服務(wù)進(jìn)行注冊(cè),自動(dòng)發(fā)現(xiàn)新節(jié)點(diǎn)和服務(wù)為了存儲(chǔ)數(shù)據(jù),鍵是非空字符串,值可以是非空的字節(jié)數(shù)組、基本類(lèi)型或者序列化對(duì)象,且小于 1 MB作為通用的緩存集群被各種應(yīng)用使用,支持可選的緩存名稱(chēng),以命名空間避免主鍵沖突一般的緩存命中率在 99%以上與Netflix 駐留數(shù)據(jù)框架能夠良好協(xié)作,典型的訪問(wèn)次序: 內(nèi)存 ->EVCache -> Cassandra/SimpleDB/S3
1EVCache 的CS架構(gòu)
EVCache客戶(hù)端是一個(gè)Java的客戶(hù)端,用于發(fā)現(xiàn)EVCache服務(wù)器并管理所有的增刪改查(CRUD)操作,由客戶(hù)端處理在集群中添加/刪除服務(wù)器?;趤嗰R遜云服務(wù)可用區(qū),客戶(hù)端在執(zhí)行創(chuàng)建、更新和刪除操作的時(shí)候復(fù)制數(shù)據(jù)。
另一方面,客戶(hù)端的讀操作直接從同一可用區(qū)的服務(wù)器讀取數(shù)據(jù)。圖2展示了EVCache 的典型部署結(jié)構(gòu)和單節(jié)點(diǎn)客戶(hù)端實(shí)例與服務(wù)器的關(guān)系。
圖2 EVCache單節(jié)點(diǎn)客戶(hù)端實(shí)例與服務(wù)器的關(guān)系
一個(gè)EVCache客戶(hù)端連接了多個(gè)EVCache的服務(wù)器集群。 在一個(gè)區(qū)域內(nèi),Netflix有多個(gè)全數(shù)據(jù)集的拷貝,由亞馬遜云服務(wù)的可用區(qū)隔離開(kāi)來(lái)。虛線框描述了區(qū)域內(nèi)的副本,每個(gè)擁有數(shù)據(jù)的全量鏡像,作為AWS的自動(dòng)伸縮組來(lái)管理這些鏡像。某些緩存在一個(gè)區(qū)域內(nèi)有兩個(gè)鏡像,有的擁有更多。這種高層架構(gòu)長(zhǎng)期來(lái)看是有效的,不會(huì)改變,每個(gè)客戶(hù)端連接自己區(qū)域內(nèi)所有可用區(qū)的所有服務(wù)器。寫(xiě)操作被發(fā)往所有實(shí)例,讀操作優(yōu)先選擇離讀請(qǐng)求近的服務(wù)器。
2EVCache 跨區(qū)域復(fù)制
Netflix的全球云服務(wù)遍布AWS各個(gè)服務(wù)區(qū)域,例如北弗吉尼亞、俄勒岡州和愛(ài)爾蘭,為這些地區(qū)的會(huì)員提高就近服務(wù),但網(wǎng)絡(luò)流量會(huì)因?yàn)楦鞣N原因改變,比如關(guān)鍵基礎(chǔ)設(shè)施出了問(wèn)題故障,或者地區(qū)之間進(jìn)行失敗恢復(fù)的練習(xí)等,因此Netflix采用無(wú)態(tài)應(yīng)用服務(wù)器服務(wù)于來(lái)自任何地區(qū)的會(huì)員。
這些數(shù)據(jù)如果從持久層存儲(chǔ)獲得將會(huì)非常昂貴(造成頻繁的數(shù)據(jù)庫(kù)訪問(wèn)),Netflix需要將這種數(shù)據(jù)寫(xiě)入到本地緩存,而且必須復(fù)制到所有地區(qū)的緩存中,以便服務(wù)于各個(gè)地區(qū)的用戶(hù)請(qǐng)求。
微服務(wù)是依賴(lài)于緩存的,必須快速可靠地訪問(wèn)多種類(lèi)型的數(shù)據(jù),比如會(huì)員的觀影歷史、排行榜和個(gè)性化推薦等,這些數(shù)據(jù)的更新與改變都必須復(fù)制到全世界各個(gè)地區(qū),以便這些地區(qū)的用戶(hù)能夠快速可靠地訪問(wèn)。
圖3 EVCache 跨地域的數(shù)據(jù)復(fù)制
這張圖說(shuō)明復(fù)制操作是在SET操作以后實(shí)現(xiàn),應(yīng)用程序調(diào)用EVCache客戶(hù)端庫(kù)的set方法,之后復(fù)制路徑對(duì)于調(diào)用者是透明的:
EVCache客戶(hù)端庫(kù)發(fā)送SET到緩存系統(tǒng)的本地地區(qū)的一個(gè)實(shí)例服務(wù)器中
EVCache客戶(hù)端庫(kù)同時(shí)也將寫(xiě)入元數(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)通過(guò)GET操作以后會(huì)在本地緩存上看到這個(gè)已經(jīng)更新的數(shù)據(jù)值
這是一個(gè)簡(jiǎn)單描述,需要注意的是,它只會(huì)對(duì)SET操作有效,對(duì)于其它DELETE TOUCH或批mutation等操作不會(huì)復(fù)制,DELETE和TOUCH是非常類(lèi)似的,只有一點(diǎn)不同:它們不從本地緩存中讀取已經(jīng)存在的值。
跨區(qū)域復(fù)制主要是通過(guò)消息隊(duì)列進(jìn)行,一個(gè)地區(qū)的EVCache客戶(hù)端不會(huì)注意到其它地區(qū)的復(fù)制情況,讀寫(xiě)都是只使用本區(qū)域緩存,不會(huì)和其它地區(qū)緩存耦合,通過(guò)消息系統(tǒng)來(lái)解耦合。