日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Facebook 对 Memcache 伸缩性的增强

發(fā)布時(shí)間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Facebook 对 Memcache 伸缩性的增强 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概要:Memcached 是一個(gè)知名的,簡(jiǎn)單的,全內(nèi)存的緩存方案。這篇文章描述了facebook是如何使用memcached來構(gòu)建和擴(kuò)展一個(gè)分布式的key-value存儲(chǔ)來為世界上最大的社交網(wǎng)站服務(wù)的。我們的系統(tǒng)每秒要處理幾十億的請(qǐng)求,同時(shí)存儲(chǔ)了幾萬億的數(shù)據(jù)項(xiàng),可以給全世界超過10億的用戶提供豐富體驗(yàn)。

1 介紹

近些年SNS網(wǎng)絡(luò)大行其道,這對(duì)網(wǎng)站基礎(chǔ)建設(shè)提出了巨大的挑戰(zhàn)。每天有億萬的用戶在使用這些網(wǎng)絡(luò)服務(wù),巨大的計(jì)算、網(wǎng)絡(luò)和I/O資源的需求使傳統(tǒng)的web架構(gòu)不堪重 負(fù)。SNS網(wǎng)站的基礎(chǔ)架構(gòu)需要滿足:1、近乎實(shí)時(shí)的交流;2、即時(shí)聚合不同來源的內(nèi)容;3、訪問和更新非常熱門的共享內(nèi)容;4、每秒處理幾百萬的用戶請(qǐng)求。

?

我們將描述我們是如何改進(jìn)memcached[14]的開源版本,并且用它作為組件來構(gòu)建用于世界上最大的社會(huì)化網(wǎng)絡(luò)的分布式key-value存儲(chǔ)的。我們會(huì)討論從單集群服務(wù)器擴(kuò)展成地理上分布式的多集群的歷程。據(jù)我們所知,這個(gè)系統(tǒng)是世界上已安裝的規(guī)模最大的memcached系統(tǒng),每秒可以處理幾十億的請(qǐng)求,存儲(chǔ)數(shù)以萬億的數(shù)據(jù)項(xiàng)。

本文是關(guān)于認(rèn)識(shí)分布式key-value存儲(chǔ)的靈活性和實(shí)用性的系列文章[1, 2, 5, 6, 12, 14, 34, 36]的最后一篇。本文關(guān)注于memcached,這是一個(gè)全內(nèi)存哈希表的開源實(shí)現(xiàn),它以較低的開銷提供了對(duì)共享存儲(chǔ)的低遲延訪問。有了這些特性我們可以構(gòu)建數(shù)據(jù)密集的功能,否則是不可能的。例如,如果一個(gè)頁面請(qǐng)求會(huì)產(chǎn)生數(shù)以百計(jì)的數(shù)據(jù)庫(kù)請(qǐng)求,那么這樣的功能只能停止在原型階段,因?yàn)閷?shí)現(xiàn)起來會(huì)太慢,代價(jià)也太高。然而,在我們的應(yīng)用里,web頁面通常都會(huì)從memcached服務(wù)器獲取數(shù)以千計(jì)的key-value對(duì)。

我們的目標(biāo)之一,是展現(xiàn)部署在不同尺度(系統(tǒng))上的重要主題。雖然在所有尺度上是很重要的品質(zhì),如性能,效率,容錯(cuò)性和一致性,我們的經(jīng)驗(yàn)表明,在特定大小的一些素質(zhì)要求比別人更多的努力來實(shí)現(xiàn)。舉例來說,保持?jǐn)?shù)據(jù)的一致性,如果復(fù)制的內(nèi)容是小量的,可以更容易在小尺度的網(wǎng)絡(luò)上實(shí)現(xiàn),相比較大的網(wǎng)絡(luò)往往只是復(fù)制必要的內(nèi)容。此外,找到一個(gè)最佳的通信調(diào)度的重要性增加的數(shù)量增加服務(wù)器和網(wǎng)絡(luò)工作成為瓶頸。

??????????? 本文包括四個(gè)主要貢獻(xiàn):(1)我們描述了Facebook的基于memcach架構(gòu)的演化。 (2)我們確定memcached的提高性能和增加內(nèi)存效率的改進(jìn)。 (3)我們簡(jiǎn)明扼要地講述提高我們的經(jīng)營(yíng)能力我們的系統(tǒng)規(guī)模的機(jī)制。 (4)我們對(duì)生產(chǎn)工作負(fù)載賦予了特色(譯者加:對(duì)工作負(fù)載進(jìn)行了分類?)。 ?

2綜述

以下特點(diǎn)大大影響了我們的設(shè)計(jì)。第一,用戶閱讀的內(nèi)容比他們創(chuàng)建的要多一個(gè)數(shù)量級(jí),這種行為(讀寫的特點(diǎn))所產(chǎn)生工作負(fù)載,顯然讓緩存可以發(fā)揮很大的優(yōu)勢(shì)。第二,我們是從多個(gè)來源讀取數(shù)據(jù)的,比如MySQL數(shù)據(jù)庫(kù)、HDFS設(shè)備和后臺(tái)服務(wù),這種多樣性要求一個(gè)靈活的緩存策略,能夠從各個(gè)獨(dú)立的源中儲(chǔ)存數(shù)據(jù)。

MemCached提供了一組簡(jiǎn)單的操作(set、get和delete),使它在一個(gè)大規(guī)模的分布式系統(tǒng)中成為注目的基礎(chǔ)組件。開源版本提供了單機(jī)內(nèi)存哈希表,在本文中,我們從這個(gè)開源版本開始,討論我們是怎么使用這個(gè)基礎(chǔ)組件,使它變得更有效,并用它來建一個(gè)可以處理每秒數(shù)十億請(qǐng)求的分布式的鍵-值儲(chǔ)存系統(tǒng)。接下來,我們用“memcached”來指代它的源碼或者它運(yùn)行的二進(jìn)制實(shí)例,用“memcache”來指代由每個(gè)實(shí)例構(gòu)成的分布式系統(tǒng)。

?

圖1:Memcache作為填補(bǔ)需求的旁路緩存系統(tǒng)。左半圖說明了WEB服務(wù)器讀取緩存時(shí)命中失敗的讀取路徑,右半圖說明其寫路徑。

查詢緩存:我們依賴于memcache來減輕讀取數(shù)據(jù)庫(kù)的負(fù)擔(dān)。特別的,我們使用memcache作為填補(bǔ)需求的旁路緩存系統(tǒng),如圖1。當(dāng)一個(gè)Web服務(wù)器需要數(shù)據(jù)時(shí),首先通過一個(gè)字符串的鍵在memcache中請(qǐng)求,如果沒有找到,它會(huì)從數(shù)據(jù)庫(kù)或者從后臺(tái)服務(wù)中檢索,再使用該鍵把結(jié)果存回memcache中。對(duì)于寫的請(qǐng)求,Web服務(wù)器發(fā)送SQL語句到數(shù)據(jù)庫(kù),接著發(fā)送刪除請(qǐng)求到memcache,使舊的緩存數(shù)據(jù)失效。因?yàn)閯h除是冪等運(yùn)算,所以我們使用刪除緩存的方式,而不是更新緩存。

在應(yīng)對(duì)MySQL數(shù)據(jù)庫(kù)繁重的查詢通信的眾多方法中,我們選擇了memcache,在有限的資源與時(shí)間限制下,這是最好的選擇。此外,緩存層與持久層分離,讓我們可以在工作負(fù)載發(fā)生變化時(shí)快速地調(diào)整。

通用緩存:我們同樣讓memcache成為一個(gè)更加通用的鍵-值儲(chǔ)存系統(tǒng)。比如說,工程師們使用memcache保存復(fù)雜的機(jī)器學(xué)習(xí)算法的中間結(jié)果,這些結(jié)果能被很多其它應(yīng)用程序所使用。它只需要我們付出很少的努力,就可以讓新增的服務(wù)利用現(xiàn)有的正在使用的基礎(chǔ)設(shè)施,而無需調(diào)整、優(yōu)化、調(diào)配和維護(hù)大型的服務(wù)器群。

正如memcached沒有提供服務(wù)器到服務(wù)器的協(xié)同,它僅僅是運(yùn)行在單機(jī)上的一個(gè)內(nèi)存哈希表。接下來我們描述我們是如何基于memcached構(gòu)建一個(gè)分布式鍵值儲(chǔ)存系統(tǒng),以勝任在Facebook的工作負(fù)載下的操作。

圖2:整體架構(gòu)

論文的結(jié)構(gòu)主要描述了在三種不同的規(guī)模下出現(xiàn)的問題。當(dāng)我們擁有第一個(gè)服務(wù)器集群時(shí),頻繁的讀負(fù)載和廣泛的輸出是我們最大的擔(dān)心。當(dāng)有必要擴(kuò)展到多個(gè)前端集群時(shí),我們解決了集群間的數(shù)據(jù)備份問題。最后,我們描述了一種機(jī)制,這種機(jī)制讓我們可以在全世界伸展集群的同時(shí)提供平滑的用戶體驗(yàn)。不論在什么尺度上,容錯(cuò)性和操作復(fù)雜性總是很重要的。我們展示了重要的數(shù)據(jù)參考,這些數(shù)據(jù)指引我們做出了最終的設(shè)計(jì)決定,讀者如需獲得更多細(xì)節(jié)性的分析,請(qǐng)參看Atikoglu et al.[8]的工作。提綱挈領(lǐng)的解釋參看圖2,這是最終的架構(gòu),我們將并置集群組織起來,形成一個(gè)群體(region),指定一個(gè)主群體(master),由主群體提供數(shù)據(jù)流讓非主群體保持?jǐn)?shù)據(jù)同步。
??????????? 在系統(tǒng)的發(fā)展中,我們將這兩個(gè)重大的設(shè)計(jì)目標(biāo)放在首位:
1. 只有已經(jīng)對(duì)用戶或者我們的運(yùn)維產(chǎn)生影響的問題,才值得改變。我們極少考慮范圍有限的優(yōu)化。
2. 對(duì)陳舊數(shù)據(jù)的瞬態(tài)讀取,其概率和響應(yīng)度類似,都將作為參數(shù)來調(diào)整。我們會(huì)暴露輕度陳舊的數(shù)據(jù)以便后臺(tái)存儲(chǔ)和高強(qiáng)度負(fù)載絕緣。 ?

3 集群之中: 延遲和負(fù)載

現(xiàn)在考慮集群中數(shù)以千計(jì)的服務(wù)器所帶來的挑戰(zhàn)。在這種規(guī)模之下,我們著眼于減少獲取緩存時(shí)的負(fù)載,以及緩存不中時(shí)數(shù)據(jù)庫(kù)的負(fù)載。

3.1 減少延遲

不論緩存是否命中,memcache的響應(yīng)時(shí)間都是影響總響應(yīng)時(shí)間的重要因素。單個(gè)的網(wǎng)頁請(qǐng)求一般包含數(shù)百個(gè)memcache讀請(qǐng)求。如一個(gè)較火的頁面平均需要從memcache中獲取521個(gè)不同的資源。

為了減少數(shù)據(jù)庫(kù)等的負(fù)擔(dān),我們準(zhǔn)備了緩存集群,每個(gè)集群都由數(shù)百臺(tái)memcache服務(wù)器組成。資源個(gè)體經(jīng)hash后存于不同的memcache服務(wù)器中。因此,web服務(wù)器必須請(qǐng)求多臺(tái)memcache服務(wù)器,才能滿足用戶的請(qǐng)求。由此導(dǎo)致在很短的時(shí)間里每個(gè)web服務(wù)器都要和所有的memcache服務(wù)器溝通。這種所有對(duì)所有的連接模式會(huì)導(dǎo)致潮涌堵塞(incast congestion)或者某臺(tái)服務(wù)器不幸成為瓶頸。實(shí)時(shí)備份可以緩解這種狀況,但一般又會(huì)引起巨大的內(nèi)存浪費(fèi)。(譯者:為何?)

我們減少延遲的方法主要集中在memcache客戶端,每一個(gè)web服務(wù)器都會(huì)運(yùn)行memcache客戶端。這個(gè)客戶端提供一系列功能,包括:串行化、壓縮、請(qǐng)求路由、錯(cuò)誤處理以及請(qǐng)求批處理。客戶端維護(hù)著一個(gè)對(duì)所以可獲得的服務(wù)器的映射,對(duì)這個(gè)映射表的更新需要通過一個(gè)輔助的配置系統(tǒng)。
并行請(qǐng)求和批處理:我們構(gòu)建web應(yīng)用代碼,目的是最小化對(duì)于頁面請(qǐng)求回應(yīng)所必要的網(wǎng)絡(luò)往返數(shù)。我們構(gòu)建了有向無環(huán)圖(DAG)用來表示數(shù)據(jù)間的依賴。web服務(wù)器使用DAG來最大化可以并發(fā)讀取的項(xiàng)目數(shù)。平均來說,這些批量請(qǐng)求對(duì)于每個(gè)請(qǐng)求包含24個(gè)主鍵。
客戶端-服務(wù)器通信:memcached服務(wù)器不會(huì)直接通信。如果適當(dāng),我們將系統(tǒng)的復(fù)雜度嵌入無狀態(tài)的客戶端,而不是memcached服務(wù)器。這極大地簡(jiǎn)化了memcached,使我們專注于針對(duì)更有限的用例提供高性能。保持客戶端的無狀態(tài)使得我們可以快速迭代開發(fā),同時(shí)也簡(jiǎn)化了部署流程。客戶端的邏輯可以提供為兩種組件:可以嵌入應(yīng)用的一個(gè)庫(kù),或者做為一個(gè)名為mcrouter的獨(dú)立的代理程序。這個(gè)代理提供memcached服務(wù)器的借口,對(duì)不同服務(wù)器之間的請(qǐng)求/回復(fù)進(jìn)行路由。

客戶端使用UDP和TCP協(xié)議與memcached服務(wù)器通訊。我們依賴UDP來使請(qǐng)求的延遲和開銷縮減。因?yàn)閁DP是無連接的,web服務(wù)器中的每個(gè)線程都被允許直接與memcached服務(wù)器通信,通過mcrouter,不需要?jiǎng)?chuàng)建與維護(hù)連接因而減少了開銷。UDP實(shí)現(xiàn)了檢測(cè)出丟失的或失序接收(通過序列號(hào))的包,并在客戶端將它們作為異常處理。它沒有提供任何試圖恢復(fù)的機(jī)制。在我們的基礎(chǔ)架構(gòu)中,我們發(fā)現(xiàn)這個(gè)決定很實(shí)際。在峰值負(fù)載條件下,memcache客戶端觀察到0.25%的請(qǐng)求會(huì)被丟棄。其中大約80%是由于延遲或丟失包,其余的是由于失序的交付。客戶端將異常作為緩存不命中處理,但是web服務(wù)器在查詢出數(shù)據(jù)以后,會(huì)跳過插入條目到memcached,以便避免對(duì)可能超載的網(wǎng)絡(luò)會(huì)服務(wù)器增添額外的負(fù)載。

圖 3: 經(jīng)過mcrouter以后 UDP, TCP得到的延遲

為了可靠性,客戶端通過同一個(gè)web服務(wù)器上運(yùn)行的mcrouter實(shí)例,在TCP協(xié)議之上運(yùn)行set與delete操作。對(duì)我們需要確認(rèn)狀態(tài)變化(更新和刪除)的操作,TCP避免了UDP實(shí)現(xiàn)中增加重試機(jī)制的必要。

Web服務(wù)器依賴很高程度的并行性與超量提交來獲得高吞吐量。如果不采用由mcrouter合并的某種形式的連接,打開TCP連接需要的大量?jī)?nèi)存將使得在每個(gè)web線程與memcached服務(wù)器之間打開連接變得尤其代價(jià)昂貴。通過減少高吞吐量TCP連接對(duì)網(wǎng)絡(luò),CPU和內(nèi)存資源的需求,合并這些連接的方式增強(qiáng)了服務(wù)器的效率。圖3顯示了生產(chǎn)環(huán)境中web服務(wù)器在平均的,中級(jí)的,以及百分之95的條件下,在UDP和通過經(jīng)由TCP的mcrouter機(jī)制下獲得關(guān)鍵字的延遲。在所有情形,與這些平均值的標(biāo)準(zhǔn)差小于1%。正如數(shù)據(jù)所示,依賴UDP能有20%的延遲縮減來對(duì)請(qǐng)求提供服務(wù)。

================= =======================

1 百分之95的頁面抓取的是1,740項(xiàng)目。 2 百分之95情形是每個(gè)請(qǐng)求有95個(gè)關(guān)鍵字。

Incast擁塞:memcache客戶端實(shí)現(xiàn)流量控制機(jī)制限制incast擁塞。當(dāng)一個(gè)客戶端請(qǐng)求大量的主鍵時(shí),如果所有應(yīng)答同時(shí)達(dá)到,那么這些應(yīng)答可以淹沒一些組件,例如:機(jī)架和集群交換機(jī)。因此客戶端使用滑動(dòng)窗口機(jī)制[11]來控制未處理請(qǐng)求的數(shù)量。當(dāng)客戶端收到一個(gè)應(yīng)答的時(shí)候,那么下一個(gè)請(qǐng)求就可以發(fā)送了。與TCP的擁塞控制類似,滑動(dòng)窗口的大小隨著成功的請(qǐng)求緩慢的增長(zhǎng),當(dāng)一個(gè)請(qǐng)求沒有應(yīng)答的時(shí)候就縮小。這個(gè)窗口應(yīng)用于所有的memcache請(qǐng)求,而不關(guān)心目的地址;然而TCP窗口僅僅應(yīng)用于單獨(dú)的數(shù)據(jù)流。

??????????? 圖4:web請(qǐng)求平均等待調(diào)度時(shí)間
圖4展示了窗口大小對(duì)web服務(wù)器中處于運(yùn)行態(tài)的用戶請(qǐng)求等待調(diào)度總時(shí)間的影響。這些數(shù)據(jù)從一個(gè)前端集群的多臺(tái)機(jī)架采集而來。在每個(gè)web服務(wù)器,用戶請(qǐng)求呈現(xiàn)泊松到達(dá)過程。參照Little定律[26],L=λW,假設(shè)輸入請(qǐng)求速率是恒定的(在我們的試驗(yàn)中就是這樣),在服務(wù)器排隊(duì)的請(qǐng)求數(shù)量(L)正比于處理請(qǐng)求的平均時(shí)間(W)。web請(qǐng)求的等待調(diào)度時(shí)間是web請(qǐng)求在系統(tǒng)中數(shù)量的一個(gè)直接指標(biāo)。當(dāng)窗口比較小的時(shí)候,應(yīng)用將不得不串行地分發(fā)更多組memcache請(qǐng)求,這將會(huì)增加web請(qǐng)求的持續(xù)時(shí)間。當(dāng)窗口過大的時(shí)候,同時(shí)處理的memcache請(qǐng)求的數(shù)量將會(huì)引發(fā)incast擁塞。結(jié)果將會(huì)是memcache錯(cuò)誤,應(yīng)用退化到從持久化存儲(chǔ)中取數(shù)據(jù),這樣將會(huì)導(dǎo)致對(duì)web請(qǐng)求的處理更緩慢。在這兩個(gè)極端之間有一個(gè)平衡,處于這個(gè)平衡的時(shí)候,不必要的延遲將會(huì)避免,同時(shí)incast擁塞可以被最小化。
3.2 減少負(fù)載 ??????????? 我們使用memcache來減少用更耗時(shí)的方式讀數(shù)據(jù)的頻率,比如數(shù)據(jù)庫(kù)查詢。當(dāng)期望的數(shù)據(jù)沒有被緩存的時(shí)候,web服務(wù)器將會(huì)退化到使用更耗時(shí)方式。下述子章節(jié)將會(huì)描述三種技術(shù),用來減少負(fù)載。
3.2.1 租約(leases)

我們引入了一個(gè)稱為租約(leases)的新機(jī)制來解決兩個(gè)問題:過時(shí)設(shè)置(stale sets)和驚群(thundering herds)。當(dāng)web服務(wù)器更新一個(gè)在緩存中不是最新版本的值的時(shí)候,一次過時(shí)設(shè)置就發(fā)生了。當(dāng)對(duì)memcache的并發(fā)更新重新排序的時(shí)候,這種情況是會(huì)發(fā)生的。當(dāng)某個(gè)特定的主鍵被大量頻繁的讀寫,那么一次驚群就發(fā)生了。因?yàn)閷懖僮鞣磸?fù)地使最近設(shè)置的值失效,那么讀操作將會(huì)默認(rèn)地使用更耗時(shí)的方式。我們的租約機(jī)制解決了這兩個(gè)問題。

[譯者注:此處的leases與Cary G. Gray的leases不一樣,不要混淆。]

?

直觀地,當(dāng)這個(gè)客戶端發(fā)生緩存不命中時(shí),memcached實(shí)例給客戶端一個(gè)租約,將數(shù)據(jù)設(shè)置到緩存中。租約是一個(gè)64bit的令牌,與客戶端初始請(qǐng)求的主鍵綁定。當(dāng)設(shè)值到緩存中時(shí),客戶端提供這個(gè)租約令牌。通過這個(gè)租約令牌,memcached可以驗(yàn)證和判斷是否這個(gè)數(shù)據(jù)應(yīng)該被存儲(chǔ),由此仲裁并發(fā)寫操作。如果因?yàn)槭盏搅藢?duì)這個(gè)數(shù)據(jù)項(xiàng)的刪除請(qǐng)求,memcached使這個(gè)租約令牌失效,那么驗(yàn)證操作將會(huì)失敗。租約阻止過時(shí)設(shè)置的方法類似于load-link/store-conditional操作[20]。
??????????? 對(duì)租約的輕微改動(dòng)也可以緩和驚群這個(gè)問題。每個(gè)memcached服務(wù)器調(diào)節(jié)返回令牌的速率。默認(rèn)情況,我們配置服務(wù)器對(duì)于每個(gè)主鍵每10秒鐘返回一個(gè)令牌。當(dāng)在10秒鐘之內(nèi)有請(qǐng)求,一個(gè)特殊的通知將會(huì)告訴客戶端稍等一下。通常,擁有租約的客戶端將會(huì)在幾個(gè)毫秒的時(shí)間內(nèi)成功設(shè)置數(shù)據(jù)。因此,當(dāng)?shù)却蛻舳酥卦嚨臅r(shí)候,數(shù)據(jù)經(jīng)常已經(jīng)在緩存中了。
為了說明這一點(diǎn),我們針對(duì)容易造成驚群的主鍵集合收集了一個(gè)星期的緩存不命中的記錄。如果沒有租約機(jī)制,所有的緩存不命中都會(huì)造成數(shù)據(jù)庫(kù)查詢率的峰值——17K/s。使用租約機(jī)制的時(shí)候,數(shù)據(jù)庫(kù)查詢率的峰值是1.3K/s。因?yàn)槲覀円罁?jù)峰值負(fù)載準(zhǔn)備數(shù)據(jù)庫(kù),所有租約機(jī)制提供了顯著的效率增益。

過期值:當(dāng)使用租約機(jī)制的時(shí)候,我們可以最小化某些特定用例下的應(yīng)用等待時(shí)間。我們可以通過鑒別返回稍微過期數(shù)據(jù)可以接受的情況進(jìn)一步減少等待時(shí)間。當(dāng)一個(gè)主鍵被刪除的時(shí)候,對(duì)應(yīng)的值轉(zhuǎn)移到一個(gè)保存最近刪除項(xiàng)的數(shù)據(jù)結(jié)構(gòu)中,在被清楚之前將會(huì)存活很短的時(shí)間。一個(gè)get請(qǐng)求可能返回一個(gè)租約,或者是一個(gè)標(biāo)記為已過時(shí)的數(shù)據(jù)。應(yīng)用可以使用過時(shí)的數(shù)據(jù)繼續(xù)轉(zhuǎn)發(fā)處理,而不需要等待從數(shù)據(jù)庫(kù)讀取的最新數(shù)據(jù)。經(jīng)驗(yàn)告訴我們因?yàn)榫彺鏀?shù)據(jù)趨向于單調(diào)遞增的數(shù)據(jù)庫(kù)快照,大部分應(yīng)用可以在對(duì)數(shù)據(jù)不做改變的情況下使用過時(shí)數(shù)據(jù)。

??????????? 圖5:高抖動(dòng)鍵集合和低抖動(dòng)鍵集合的每日和每周的工作集
3.2.2 memcache池
??????????? 使用memcache做為通用的緩存層要求不同的工作負(fù)載分享基礎(chǔ)設(shè)施,盡管它們具有不過的接入模式、內(nèi)存占用和服務(wù)質(zhì)量要求。不同應(yīng)用的工作負(fù)載可以產(chǎn)生負(fù)干擾,這將會(huì)導(dǎo)致命中率下降。
??????????? 為了適用這些差異,我們將集群的memcached服務(wù)器分割成獨(dú)立的池。我們指定一個(gè)池(稱作wildcard)為默認(rèn)池,針對(duì)那些放在wildcard中不合適的主鍵提供另外的池。例如,我們可能為頻繁存取但是緩存不命中不耗時(shí)的主鍵分配一個(gè)小池。我們也可能為那些不頻繁存取但是緩存不命中異常耗時(shí)的主鍵分配一個(gè)大池。

圖5展示了兩個(gè)不同的項(xiàng)目集合的工作集,一個(gè)低抖動(dòng),另一個(gè)高抖動(dòng)。工作集通過對(duì)每百萬分之一數(shù)據(jù)項(xiàng)采樣所有操作來近似。對(duì)于這些數(shù)據(jù)項(xiàng),我們收集最小、平均和最大數(shù)據(jù)項(xiàng)大小。這些數(shù)據(jù)項(xiàng)大小被加總,然后乘以一百萬來近似工作集。每日和每周工作集的不同指出抖動(dòng)的總數(shù)。具有不同抖動(dòng)特征的數(shù)據(jù)項(xiàng)以一種不幸的方式相互影響:那些仍然有價(jià)值的低抖動(dòng)主鍵在那些不再被存取的高抖動(dòng)主鍵之前被踢出。將這些不同的主鍵放在不同的池中將會(huì)阻止這種負(fù)干擾,同時(shí)使我們可以通過設(shè)置高抖動(dòng)池的大小來適用緩存不命中的成本。第7章提供了更深入的分析。

[譯者注:工作集定義為在一個(gè)特定的時(shí)間段內(nèi)一個(gè)進(jìn)程所需要的內(nèi)存]

3.2.3 池內(nèi)的復(fù)制(replication)
??????????? 在某些池內(nèi),我們使用復(fù)制(replication)來改善延遲和memcached服務(wù)器的效率。當(dāng)(1)應(yīng)用常規(guī)地同時(shí)讀取很多主鍵,(2)整個(gè)數(shù)據(jù)集集合可以放到一或兩個(gè)memcached服務(wù)器中,(3)請(qǐng)求率非常高,超出了單臺(tái)服務(wù)器的處理能力的時(shí)候,我們選擇復(fù)制池內(nèi)的一類主鍵。
??????????? 比起進(jìn)一步劃分主鍵空間,我們更傾向于在實(shí)例內(nèi)進(jìn)行復(fù)制。考慮一個(gè)包含100個(gè)數(shù)據(jù)項(xiàng)的memcached服務(wù)器,具有對(duì)每秒500K請(qǐng)求進(jìn)行處理的能力。每一個(gè)請(qǐng)求查找100個(gè)主鍵。在memcached中每個(gè)請(qǐng)求查詢100個(gè)主鍵與查詢1個(gè)主鍵之間開銷的差值是很小的。為了擴(kuò)展系統(tǒng)來處理1M請(qǐng)求/秒,假如我們?cè)黾恿说诙_(tái)服務(wù)器,將主鍵平均分配到兩臺(tái)服務(wù)器上。現(xiàn)在客戶端需要將每個(gè)包含100個(gè)主鍵的請(qǐng)求分割為兩個(gè)并行的包含50個(gè)主鍵的請(qǐng)求。結(jié)果兩臺(tái)服務(wù)器都仍然不得不處理每秒1M的請(qǐng)求。然后,如果我們復(fù)制所以100個(gè)主鍵到兩臺(tái)服務(wù)器,一個(gè)包含100個(gè)主鍵的客戶端請(qǐng)求可以被發(fā)送到任意副本(replica)。這樣將每臺(tái)服務(wù)器的負(fù)載降到了每秒500K個(gè)請(qǐng)求。每一個(gè)客戶端依據(jù)自己的IP地址來選擇副本。這種方法需要向所以的副本分發(fā)失效消息來維護(hù)一致性。
3.3 故障處理
??????????? 無法從memcache中讀取數(shù)據(jù)將會(huì)導(dǎo)致后端服務(wù)負(fù)載激增,這會(huì)導(dǎo)致進(jìn)一步的連鎖故障。有兩個(gè)尺度的故障我們必須解決:(1)由于網(wǎng)絡(luò)或服務(wù)器故障,少量的主機(jī)無法接入,(2)影響到集群內(nèi)相當(dāng)大比例服務(wù)器的廣泛停機(jī)事件。如果整個(gè)的集群不得不離線,我們轉(zhuǎn)移用戶的web請(qǐng)求到別的集群,這樣將會(huì)有效地遷移memcache所有的負(fù)載。
??????????? 對(duì)于小范圍的停機(jī),我們依賴一個(gè)自動(dòng)化修復(fù)系統(tǒng)[3]。這些操作不是即時(shí)的,需要花費(fèi)幾分鐘。這么長(zhǎng)的持續(xù)時(shí)間足夠引發(fā)前面提到的連鎖故障,因此我們引入了一個(gè)機(jī)制進(jìn)一步將后端服務(wù)從故障中隔離開來。我們專門準(zhǔn)備了少量稱作Gutter的機(jī)器來接管少量故障服務(wù)器的責(zé)任。在一個(gè)集群中,Gutter的數(shù)量大約為memcached服務(wù)器的1%。
當(dāng)memcached客戶端對(duì)它的get請(qǐng)求收不到回應(yīng)的時(shí)候,這個(gè)客戶端就假設(shè)服務(wù)器已經(jīng)發(fā)生故障了,然后向特定的Gutter池再次發(fā)送請(qǐng)求。如果第二個(gè)請(qǐng)求沒有命中,那么客戶端將會(huì)在查詢數(shù)據(jù)庫(kù)之后將適當(dāng)?shù)逆I-值對(duì)插入Gutter機(jī)器。在Gutter中的條目會(huì)很快過期以避免Gutter失效。Gutter以提供稍微過時(shí)的數(shù)據(jù)為代價(jià)來限制后端服務(wù)的負(fù)載。
??????????? 注意,這樣的設(shè)計(jì)與客戶端在剩下的memcached服務(wù)器重新分配主鍵的方法不同。由于頻繁存取的主鍵分布不均勻,那樣的方法會(huì)有連鎖故障的風(fēng)險(xiǎn)。例如,一個(gè)單獨(dú)的主鍵占服務(wù)器請(qǐng)求的20%。承擔(dān)這個(gè)頻繁存取的主鍵的服務(wù)器也會(huì)過載。通過將負(fù)載分流到閑置的服務(wù)器,我們減少了這樣的風(fēng)險(xiǎn)。
??????????? 通常來說,每個(gè)失敗的請(qǐng)求都會(huì)導(dǎo)致對(duì)后端儲(chǔ)存的一次存取,潛在地將會(huì)使后端過載。使用Gutter存儲(chǔ)這些結(jié)果,很大部分失敗被轉(zhuǎn)移到對(duì)gutter池的存取,因此減少了后端存儲(chǔ)的負(fù)載。在實(shí)踐中,這個(gè)系統(tǒng)每天減少99%的客戶端可見的失敗率,將10%-25%的失敗轉(zhuǎn)化為緩存命中。如果一臺(tái)memcached服務(wù)器整個(gè)發(fā)生故障,在4分鐘之內(nèi),gutter池的命中率將會(huì)普遍增加到35%,經(jīng)常會(huì)接近50%。因此對(duì)于由于故障或者小范圍網(wǎng)絡(luò)事故造成的一些memcached服務(wù)器不可達(dá)的情況,Gutter將會(huì)保護(hù)后端存儲(chǔ)免于流量激增。 ?
4 Region之內(nèi):復(fù)制(Replication)
??????????? 隨著需求的增長(zhǎng),購(gòu)買更多的web服務(wù)器和memcached服務(wù)器來擴(kuò)展集群是誘惑人的。但是幼稚地?cái)U(kuò)展系統(tǒng)并不能解決所有問題。隨著更多的web服務(wù)器加入來處理增長(zhǎng)的用戶流量,高請(qǐng)求率的數(shù)據(jù)項(xiàng)只會(huì)變的更流行。隨著memcached服務(wù)器的增加,Incast擁塞也會(huì)變的更嚴(yán)重。因此我們將web服務(wù)器和memcached服務(wù)器分割為多個(gè)前端集群。這些集群與包含數(shù)據(jù)庫(kù)的存儲(chǔ)集群一起統(tǒng)稱為region。region架構(gòu)同樣也考慮到更小的故障域和易控制的網(wǎng)絡(luò)配置。我們用數(shù)據(jù)的復(fù)制來換取更獨(dú)立的故障域、易控制的網(wǎng)絡(luò)配置和incast擁塞的減少。
??????????? 這一章分析了分享同一個(gè)存儲(chǔ)集群的多個(gè)前端集群的影響。特別地,我們說明了允許數(shù)據(jù)跨集群復(fù)制的影響,以及不允許復(fù)制潛在的內(nèi)存效率。 ?
4.1 region內(nèi)的失效
??????????? 在region中,存儲(chǔ)集群保存數(shù)據(jù)的權(quán)威版本,為了滿足用戶的需求就需要將數(shù)據(jù)復(fù)制到前端集群。存儲(chǔ)集群負(fù)責(zé)使緩存數(shù)據(jù)失效來保持前端集群與權(quán)威版本的一致性。做為一個(gè)優(yōu)化,當(dāng)web服務(wù)器修改數(shù)據(jù)后,它也會(huì)向所在的集群發(fā)送失效命令,提供針對(duì)單用戶請(qǐng)求的讀后寫語義,這樣可以減少本機(jī)緩存的存在時(shí)間。
??????????? 圖6:失效流水線 展示那些需要經(jīng)過守護(hù)進(jìn)程(mcsqueal)刪除的主鍵
??????????? 修改權(quán)威數(shù)據(jù)的SQL語句被改進(jìn)為包含事務(wù)提交后需要使失效的對(duì)應(yīng)的memcache主鍵[7]。我們?cè)谒械臄?shù)據(jù)庫(kù)上部署了失效守護(hù)進(jìn)程(稱作mcsqueal)。每個(gè)守護(hù)進(jìn)程檢查數(shù)據(jù)庫(kù)提交的SQL語句,提取任意的刪除命令,并且將刪除命令廣播到region內(nèi)所有的前端集群。圖6展示了這個(gè)方法。我們發(fā)現(xiàn)大部分發(fā)出的失效命令并不會(huì)造成刪除數(shù)據(jù)的操作,實(shí)際上,所有發(fā)出的刪除命令只有4%導(dǎo)致實(shí)際的緩存數(shù)據(jù)失效。 ?
減少發(fā)包率:如果mcsqueal可以直接聯(lián)系memcached服務(wù),那么從后端集群到前端集群的發(fā)包率將會(huì)高的無法接受。有很多數(shù)據(jù)庫(kù)和很多memcached服務(wù)器跨集群邊界通信造成了發(fā)包率的問題。失效守護(hù)進(jìn)程批量處理刪除操作,使用很少的包把操作發(fā)送到每個(gè)前段集群運(yùn)行著mcrouter的指定服務(wù)器。然后mcrouter就從每個(gè)批量包中分解出單獨(dú)的刪除操作,將失效命令路由到所在前端集群正確的memcached服務(wù)器。通過統(tǒng)計(jì)每個(gè)包中刪除命令的中位數(shù)可見批處理具有18倍的性能提升。
通過web服務(wù)器發(fā)送失效命令:通過web服務(wù)器廣播失效命令到所有前端服務(wù)器更簡(jiǎn)單。很不幸,這個(gè)方法存在兩個(gè)問題。第一個(gè),因?yàn)閣eb服務(wù)器在批處理無效命令時(shí)沒有mcsqueal有效率,所以它具有更高的包成本。第二個(gè),當(dāng)系統(tǒng)性的無效問題出現(xiàn)時(shí),這種方法會(huì)無能為力,比如由于配置錯(cuò)誤造成的刪除命令錯(cuò)誤路由。過去,這經(jīng)常需要?jiǎng)討B(tài)重啟整個(gè)memcache基礎(chǔ)設(shè)施,這樣一個(gè)緩慢的、破壞性的進(jìn)程是我們一直想避免的。相反,將失效命令嵌入SQL語句允許mcsqueal簡(jiǎn)單的重新執(zhí)行可能已經(jīng)丟掉的或者錯(cuò)誤路由的失效命令,因?yàn)閿?shù)據(jù)庫(kù)提交存儲(chǔ)有可靠的日志。

表1: 集群復(fù)制或region復(fù)制的決定性因素

[譯者注:動(dòng)態(tài)重啟(rolling restart)是賽車比賽中的一個(gè)術(shù)語。看看F1比賽就會(huì)有個(gè)直觀的概念,比賽的時(shí)候經(jīng)常會(huì)出現(xiàn)安全車領(lǐng)著賽車跑兩圈,當(dāng)安全車離開后出現(xiàn)綠旗,這就是一次rolling start]

4.2 Region池
??????????? 每個(gè)集群依照混合的用戶請(qǐng)求獨(dú)立地緩存數(shù)據(jù)。如果用戶請(qǐng)求被隨機(jī)的路由到所有可獲得的前端集群,那么所有前端服務(wù)器緩存的數(shù)據(jù)將會(huì)大致上一樣。這就允許我們離線維護(hù)某個(gè)集群,而不會(huì)導(dǎo)致緩存命中率下降。過度復(fù)制數(shù)據(jù)會(huì)使內(nèi)存沒有效率,特別是對(duì)很大的、很少存取的數(shù)據(jù)項(xiàng)。通過使多個(gè)前端集群分享同一個(gè)memcached服務(wù)器集合,我們就可以減少副本的數(shù)量。我們稱此為region池。
??????????? 跨集群邊界通信會(huì)導(dǎo)致更大的延遲。另外,我們的集群間可獲得帶寬比集群內(nèi)的少40%。復(fù)制用更多的memcached服務(wù)器換取更少的集群間帶寬,低延遲和更好的容錯(cuò)。對(duì)于某一些數(shù)據(jù),放棄副本的好處,每個(gè)region一個(gè)拷貝,從成本上來說更有效率。擴(kuò)展memcache的一個(gè)主要挑戰(zhàn)是決定某主鍵是應(yīng)該跨前端集群復(fù)制,還是每個(gè)region一個(gè)副本。當(dāng)region池發(fā)生故障時(shí),Gutter也會(huì)被使用。
表1總結(jié)了我們應(yīng)用中具有巨大價(jià)值的兩類項(xiàng)目。我們將B類型的數(shù)據(jù)移到region池,對(duì)于A類型的不做改變。注意,客戶端存取B類型數(shù)據(jù)的頻率比A類型數(shù)據(jù)低一個(gè)數(shù)量級(jí)。B類型數(shù)據(jù)的低存取率使它成為region池的主要候選者,因?yàn)檫@樣的數(shù)據(jù)不會(huì)對(duì)集群間帶寬造成不利的影響。B類型數(shù)據(jù)也會(huì)占有每個(gè)集群wildcard池25%的空間,所以區(qū)域化提供了顯著的存儲(chǔ)效率。然而在A類型的數(shù)據(jù)項(xiàng)的大小是B類型的兩倍,而且存取更頻繁,所以從region的角度考慮,不會(huì)將它們放在region池中。目前將數(shù)據(jù)遷移到region池的依據(jù)是基于存取率、數(shù)據(jù)大小和存取用戶數(shù)的人工的啟發(fā)式方法。
4.3 冷集群熱身
??????????? 由于存在的集群發(fā)生故障或者進(jìn)行定期的維護(hù),我們?cè)黾有碌募荷暇€,此時(shí)緩存命中率會(huì)很低,這樣會(huì)削弱隔離后端服務(wù)的能力。一個(gè)稱作冷集群熱身(Cold Cluster Warmup)的系統(tǒng)可以緩和這種情況,這個(gè)系統(tǒng)使“冷集群”(也就是具有空緩存的前端集群)中的客戶端從“熱集群”(也就是具有正常緩存命中率的集群)中檢索數(shù)據(jù)而不是從持久化存儲(chǔ)。這利用到了前面提到的跨前端集群的數(shù)據(jù)復(fù)制。使用這個(gè)系統(tǒng)可以使冷集群在幾個(gè)小時(shí)恢復(fù)到滿負(fù)載工作能力而不是幾天。
必須注意避免由于競(jìng)爭(zhēng)條件引發(fā)的不一致。例如,如果冷集群中的一個(gè)客戶端對(duì)數(shù)據(jù)庫(kù)做了更新,另外一個(gè)客戶端在熱集群收到失效命令之前檢索到過時(shí)數(shù)據(jù),這個(gè)數(shù)據(jù)項(xiàng)在冷集群中將會(huì)不一致。memcached的刪除命令支持非零的拖延時(shí)間,也就是在指定的拖延時(shí)間內(nèi)拒絕添加操作。默認(rèn)情況下,冷集群中所有的刪除命令都有兩秒鐘的拖延時(shí)間。當(dāng)在冷集群中發(fā)生緩存不命中時(shí),客戶端向熱集群重新發(fā)送請(qǐng)求,然后將結(jié)果添加到冷集群中。如果添加失敗就表明數(shù)據(jù)庫(kù)中有更新的數(shù)據(jù),因此客戶端將會(huì)重新從數(shù)據(jù)庫(kù)讀數(shù)據(jù)。刪除命令延遲兩秒鐘以上在理論上來說也是有可能的,但是對(duì)于大部分的情況并不會(huì)超過兩秒鐘。冷集群熱身運(yùn)營(yíng)上的效益遠(yuǎn)遠(yuǎn)超過少數(shù)緩存不一致所帶來的成本。一旦冷集群的命中率趨于穩(wěn)定,我們就將冷集群熱身系統(tǒng)關(guān)掉,同時(shí)效益也就減少了。

5 跨地區(qū):一致性

將數(shù)據(jù)中心分布到廣泛的地理位置具有很多優(yōu)勢(shì)。第一,將web服務(wù)器靠近終端用戶可以極大地較少延遲。第二,地理位置多元化可以緩解自然災(zāi)害和大規(guī)模電力故障的影響。第三,新的位置可以提供更便宜的電力和其它經(jīng)濟(jì)上的誘因。我們通過部署多個(gè)region來獲得這些優(yōu)勢(shì)。每個(gè)region包含一個(gè)存儲(chǔ)集群和多個(gè)前端集群。我們指定一個(gè)region持有主數(shù)據(jù)庫(kù),別的region包含只讀的副本;我們依賴MySQL的復(fù)制機(jī)制來保持副本數(shù)據(jù)庫(kù)與主數(shù)據(jù)庫(kù)的同步。基于這樣的設(shè)計(jì),web服務(wù)器無論訪問本地memcached服務(wù)器還是本地?cái)?shù)據(jù)庫(kù)副本的延遲都很低。當(dāng)擴(kuò)展到多region的時(shí)候,維護(hù)memcache和持久化存儲(chǔ)的數(shù)據(jù)一致性成了主要的技術(shù)挑戰(zhàn)。這些挑戰(zhàn)源于一個(gè)問題:副本數(shù)據(jù)庫(kù)可能滯后于主數(shù)據(jù)庫(kù)。

在一致性和性能平衡的廣泛范圍上,我們的系統(tǒng)僅僅表示一個(gè)點(diǎn)。一致性模型已經(jīng)演進(jìn)了很多年來滿足站點(diǎn)擴(kuò)展的需求。在實(shí)踐上一致性模型是可以構(gòu)建的,并且不會(huì)犧牲高性能的需求。系統(tǒng)管理的大容量數(shù)據(jù)隱含著任何增加網(wǎng)絡(luò)和存儲(chǔ)需求的細(xì)小改動(dòng)都有重大的成本。大部分提供嚴(yán)格語義的想法都很少走出設(shè)計(jì)階段,因?yàn)樗鼈儗?shí)在是過分的昂貴。與專門針對(duì)存在的用例而定制的系統(tǒng)不同,memcache和Facebook是一起開發(fā)的。這就允許應(yīng)用工程師和系統(tǒng)工程師可以一起工作來設(shè)計(jì)一個(gè)模型,這個(gè)模型對(duì)于應(yīng)用工程師來說是易于理解的、高效的,而且足夠的簡(jiǎn)單來實(shí)現(xiàn)可靠的擴(kuò)展。我們提供了盡力而為的最終一致性,但是強(qiáng)調(diào)性能和可用性。因此在實(shí)踐上這個(gè)系統(tǒng)工作的非常好,而且我們找到了一個(gè)可以接受的平衡點(diǎn)。
從主region寫:前面我們提到在我們的系統(tǒng)中是通過存儲(chǔ)集群的守護(hù)進(jìn)程來實(shí)現(xiàn)數(shù)據(jù)失效的,這樣的設(shè)計(jì)對(duì)多region架構(gòu)的設(shè)計(jì)具有重要的影響。特別的,這樣的設(shè)計(jì)可以避免一個(gè)競(jìng)爭(zhēng)情況,也就是在數(shù)據(jù)從主region復(fù)制過來之前失效命令先到達(dá)了。考慮一下這種情況,主region中的一個(gè)web服務(wù)器已經(jīng)完成對(duì)數(shù)據(jù)庫(kù)的修改,尋求使現(xiàn)在過時(shí)的數(shù)據(jù)失效。在主region中發(fā)送失效命令是安全的。然而,讓副本region中的web服務(wù)器發(fā)送失效命令可能是不成熟的,因?yàn)閷?duì)主數(shù)據(jù)庫(kù)的改動(dòng)可能還沒有傳播到副本數(shù)據(jù)庫(kù)。接下來對(duì)副本region的數(shù)據(jù)查詢將會(huì)與數(shù)據(jù)庫(kù)復(fù)制產(chǎn)生競(jìng)爭(zhēng),因此增加了將過時(shí)數(shù)據(jù)設(shè)置到memcache中的概率。歷史上,在擴(kuò)展到多個(gè)region之后,我們實(shí)現(xiàn)了mcsqueal。
從非主region寫:現(xiàn)在考慮當(dāng)復(fù)制滯后非常大的時(shí)候,用戶從非主region更新數(shù)據(jù)。如果他最近的改動(dòng)丟失了,那么下一個(gè)請(qǐng)求將會(huì)導(dǎo)致混亂。之后當(dāng)復(fù)制流完成之后才允許從副本數(shù)據(jù)庫(kù)讀取數(shù)據(jù)并緩存。如果沒有這個(gè)保障,后續(xù)請(qǐng)求將會(huì)導(dǎo)致副本中的過時(shí)數(shù)據(jù)被讀取并且緩存。
??????????? 我們使用遠(yuǎn)程標(biāo)記(remote marker)機(jī)制來最小化讀取過時(shí)數(shù)據(jù)的概率。出現(xiàn)標(biāo)記就表明本地副本數(shù)據(jù)庫(kù)中的數(shù)據(jù)可能是過時(shí)的,所以查詢應(yīng)該重定向到主region。當(dāng)web服務(wù)器想要更新主鍵為k的數(shù)據(jù),那么服務(wù)器(1)在region中設(shè)置遠(yuǎn)程標(biāo)記 rk,(2)向主數(shù)據(jù)庫(kù)執(zhí)行寫操作,并且在SQL語句中嵌入應(yīng)該失效的k和 rk,(3)在本集群刪除k。對(duì)于主鍵k的后續(xù)請(qǐng)求,web服務(wù)器找不到緩存數(shù)據(jù),然后就檢查 rk是否存在,如果存在就將請(qǐng)求定向到主region,否則定向到本地region。在這種情況下,我們用緩存不命中時(shí)附加的延遲來換取讀取過時(shí)數(shù)據(jù)概率的下降。 ?
我們通過使用region池來實(shí)現(xiàn)遠(yuǎn)程標(biāo)記。注意,當(dāng)對(duì)于同一個(gè)主鍵并發(fā)修改的時(shí)候,一個(gè)操作可能刪除遠(yuǎn)程標(biāo)記,而這個(gè)標(biāo)記應(yīng)該為另外一個(gè)正在執(zhí)行的操作保留,如果出現(xiàn)這種情況,我們的機(jī)制就可能返回過時(shí)的信息。有一點(diǎn)是需要特別說明的,我們對(duì)遠(yuǎn)程標(biāo)記memcache的使用以一種微妙的方式違反了緩存結(jié)果。做為緩存,刪除或移除主鍵都是安全的;它可能會(huì)引起更多的數(shù)據(jù)庫(kù)負(fù)載,但是不會(huì)削弱一致性。相反,遠(yuǎn)程標(biāo)記的出現(xiàn)可以幫助區(qū)分是否非主數(shù)據(jù)庫(kù)擁有過時(shí)數(shù)據(jù)。在實(shí)踐上,我們發(fā)現(xiàn)移除遠(yuǎn)程標(biāo)記和并發(fā)修改的情況都很少。
運(yùn)行上的考慮:跨region通信是非常耗時(shí)的,因?yàn)閿?shù)據(jù)不得不穿過很大的地理距離(比如穿過合眾國(guó)大陸)。通過分享數(shù)據(jù)庫(kù)復(fù)制刪除流的通信信道,我們?cè)诘蛶掃B接情況下獲得了網(wǎng)絡(luò)效率。
??????????? 上述4.1章提到的管理刪除的系統(tǒng)也部署在了副本region,通過副本數(shù)據(jù)庫(kù)廣播刪除命令到memcached服務(wù)器。當(dāng)下流組件沒有反應(yīng)時(shí),數(shù)據(jù)庫(kù)和mcrouter暫存刪除命令。任何組件的故障和延遲都會(huì)導(dǎo)致讀取過時(shí)數(shù)據(jù)概率的增加。一旦下流組件重新可獲得了,暫存的刪除命令將會(huì)重新發(fā)送。當(dāng)發(fā)現(xiàn)問題時(shí),代替的方案是讓集群下線或者是使前端集群的數(shù)據(jù)失效。這些方法比起所獲得的工作負(fù)荷上的好處將會(huì)導(dǎo)致更多的混亂。 ?

6 單個(gè)服務(wù)器的提升

多對(duì)多的通信模式隱含著單獨(dú)的服務(wù)器將會(huì)成為集群的瓶頸。這章將會(huì)講述性能調(diào)優(yōu)和memcached內(nèi)存效率的提高,這有利于集群更好的擴(kuò)展。提升單個(gè)服務(wù)器緩存的性能是一個(gè)活躍的研究領(lǐng)域[9,10,28,25]。

6.1 性能調(diào)優(yōu)

我們開始使用具有固定大小哈希表的單線程memcached。第一批主要的優(yōu)化是:(1)允許哈希表自動(dòng)擴(kuò)展來避免查找時(shí)間漂移到O(n),(2)通過一個(gè)全局鎖來保護(hù)多數(shù)據(jù)結(jié)構(gòu)使得服務(wù)器多線程化,(3)賦予每個(gè)線程獨(dú)立的UDP端口來減少發(fā)送副本和稍后傳播中斷處理開銷的爭(zhēng)用。前兩個(gè)優(yōu)化都貢獻(xiàn)給了開源社區(qū)。下述章節(jié)將會(huì)探索還沒在開源版本出現(xiàn)的進(jìn)一步優(yōu)化。

我們的實(shí)驗(yàn)主機(jī)擁有一顆2.67GHz(12核、12超線程)的Intel Xeon CPU(X5650),一個(gè)Intel 82574L千兆以太網(wǎng)控制器和12GB內(nèi)存。生產(chǎn)服務(wù)器具有更多的內(nèi)存。更多的細(xì)節(jié)之前已經(jīng)公開過[4]。性能測(cè)試設(shè)備包含15個(gè)生成memcache流量的客戶端和一臺(tái)具有24線程的memcached服務(wù)器。客戶端和服務(wù)器放在同一個(gè)機(jī)架,之間通過千兆以太網(wǎng)連接。這些測(cè)試測(cè)量?jī)煞昼姵掷m(xù)負(fù)載memcached反應(yīng)的延遲。

[譯者注:X5650好像是6核的]
獲取的性能:我們首先研究將原有的多線程單鎖的實(shí)現(xiàn)替換為細(xì)粒度鎖的效益。在發(fā)送包含10個(gè)主鍵的memcached請(qǐng)求的之前,我們預(yù)先填充了擁有32byte值的緩存數(shù)據(jù),然后我們測(cè)量命中的性能。圖7展示了對(duì)不同版本的memcached持續(xù)的亞毫秒級(jí)平均返回時(shí)間的最大請(qǐng)求率。第一組柱狀圖是實(shí)現(xiàn)細(xì)粒度鎖之前的memcached,第二組是我們當(dāng)前的memcached,最后一組是開源版本1.4.10,這個(gè)版本獨(dú)立實(shí)現(xiàn)了一個(gè)我們的鎖策略的更粗粒度的版本。

?

使用細(xì)粒度的鎖使得請(qǐng)求命中的峰值從每秒600K到達(dá)了1.8M提升了3倍。不命中的性能也從每秒2.7M提升到了4.5M。因?yàn)榉祷刂敌枰獦?gòu)建和傳輸,而不命中對(duì)于整個(gè)多請(qǐng)求僅需要一個(gè)表明所有主鍵不命中的靜態(tài)回應(yīng)(END),所以命中的情況更耗時(shí)。
??????????? 我們也研究了使用UDP代替TCP的性能影響。圖8展示了對(duì)于單主鍵獲取和10個(gè)主鍵獲取平均持續(xù)延遲小于一毫秒的請(qǐng)求峰值。我們發(fā)現(xiàn)UDP實(shí)現(xiàn)的性能在單主鍵獲取情況下超出TCP實(shí)現(xiàn)13%,在10主鍵獲取的情況下超出8%。

?

圖7:對(duì)不同memcached版本多獲取命中和不命中的性能比較

圖8:對(duì)TCP和UDP單主鍵請(qǐng)求和10主鍵請(qǐng)求獲取命中的性能比較

因?yàn)槎嘀麈I獲取在單個(gè)請(qǐng)求比單主鍵獲取多打包了很多數(shù)據(jù),所以它們使用了更少的包完成了同樣的事情。圖8展示了10個(gè)主鍵獲取比單主鍵獲取有接近4倍的性能提升。

6.2 適應(yīng)性的slab分配器

memcached使用一個(gè)slab分配器來管理內(nèi)存。這個(gè)分配器將內(nèi)存組織為slab類,每類包含預(yù)分配的均勻大小的內(nèi)存塊。memcached將數(shù)據(jù)項(xiàng)存儲(chǔ)到可以適應(yīng)數(shù)據(jù)項(xiàng)元數(shù)據(jù)、鍵和值大小的最小可能性的slab類。slab類從64byte開始,以1.07為因子指數(shù)性增加到1MB,以4byte對(duì)齊3。每個(gè)slab類維護(hù)一個(gè)可獲得內(nèi)存塊的空閑列表,當(dāng)它的空閑列表是空的,那么就從1MB slab中請(qǐng)求更多內(nèi)存。一旦memcached服務(wù)器再也不能分配空閑內(nèi)存,通過移除slab類中最近最少使用(LRU)的數(shù)據(jù)項(xiàng)來存儲(chǔ)新的數(shù)據(jù)項(xiàng)。當(dāng)工作負(fù)載改變時(shí),原有分配給每個(gè)slab類的內(nèi)存可能不再足夠,這樣將會(huì)導(dǎo)致低命中率。

================= ======================= 3 對(duì)頁取數(shù)據(jù)的量位于第95百分位的是1740個(gè)數(shù)據(jù)項(xiàng)。這個(gè)擴(kuò)展的因子確保我們同時(shí)擁有64byte和128byte,這樣更有利于利用硬件緩存線。

我們實(shí)現(xiàn)了一個(gè)適應(yīng)性的分配器,這個(gè)分配器將會(huì)周期性的重新平衡slab分配來適應(yīng)當(dāng)前的工作負(fù)載。如果slab類正在移除數(shù)據(jù)項(xiàng),而且如果下一個(gè)將要被移除的數(shù)據(jù)項(xiàng)比其它slab類中的最近最少使用的數(shù)據(jù)項(xiàng)的最近使用時(shí)間至少近20%,那么就說明這個(gè)slab類需要更多內(nèi)存。如果找到了一個(gè)這樣的slab類,那么就將存儲(chǔ)最近最少使用數(shù)據(jù)項(xiàng)的slab釋放,然后轉(zhuǎn)移到needy類。注意,開源社區(qū)已經(jīng)獨(dú)立實(shí)現(xiàn)了一個(gè)類似的平衡跨slab類移除率的分配器,然而我們的算法關(guān)注平衡所有類中最久數(shù)據(jù)項(xiàng)的時(shí)長(zhǎng)。平衡時(shí)長(zhǎng)比調(diào)整移除率對(duì)整臺(tái)服務(wù)器單個(gè)全局最近最少使用(LRU)移除策略提供了更好的近似,而且調(diào)整移除率深受接入模式的影響。

6.3 臨時(shí)條目的緩存

因?yàn)閙emcached支持過期時(shí)間,條目在它們過期之后仍可以駐留在內(nèi)存中。 當(dāng)條目被請(qǐng)求時(shí)或者當(dāng)它們到達(dá)LRU的尾端時(shí),Memcached會(huì)通過檢查過期時(shí)間來延時(shí)剔除這些條目。 盡管在一般情況下很有效,但是這種模式允許那些偶爾活躍一下的短期鍵值占據(jù)內(nèi)存空間,直到它們到達(dá)LRU的尾部。

所以我們引入一種混合模式,對(duì)多數(shù)鍵值使用延時(shí)剔除,而對(duì)過期的短期鍵值則立即剔除。我們根據(jù)短期條目的過期時(shí)間把它們放入一個(gè)由鏈接表構(gòu)成的環(huán)形緩存區(qū)(花費(fèi)幾秒編入索引直到過期) – 我們稱之為臨時(shí)條目緩存區(qū)。每一秒鐘,該緩存的頭部數(shù)據(jù)格里的所有條目都會(huì)被剔除,然后頭部向前移動(dòng)一格。當(dāng)我們給一個(gè)頻繁使用的鍵值集合(它們對(duì)應(yīng)條目的壽命很短)設(shè)置一個(gè)短超期時(shí)間后, 該鍵值集合使用的memcache緩沖池的比例從6%下降到0.3%,而沒有影響到命中率。

6.4 軟件升級(jí)

升級(jí)、bug修復(fù)、臨時(shí)診斷或性能測(cè)試都需要頻繁的軟件變更。一個(gè)memcached服務(wù)器能夠在幾小時(shí)內(nèi)達(dá)到 90% 的命中率峰值。接下來,可能會(huì)耗費(fèi)12小時(shí)來進(jìn)行memcached服務(wù)器升級(jí),這將要求我們謹(jǐn)慎管理數(shù)據(jù)庫(kù)負(fù)載。我們修改了memcached,使用 System V 共享內(nèi)存區(qū)來存儲(chǔ)緩存值和主數(shù)據(jù)結(jié)構(gòu),以便在軟件升級(jí)過程中數(shù)據(jù)仍能夠保持可用,進(jìn)而最小化損失。

圖 9: 不同數(shù)量memcached服務(wù)器的訪問數(shù)累積分布圖

7 memcache工作負(fù)載

現(xiàn)在我們用從生產(chǎn)環(huán)境中運(yùn)行服務(wù)器上所獲得的數(shù)據(jù)來描述memcache的負(fù)載。

7.1 web服務(wù)器上的測(cè)量

我們收集了小比例用戶請(qǐng)求的所有memcache操作,然后討論了扇出(fanout)、響應(yīng)大小和我們工作負(fù)載的延遲特征。
扇出:圖9展示了當(dāng)web服務(wù)器回應(yīng)一個(gè)頁面請(qǐng)求時(shí)需要聯(lián)系的memcahced服務(wù)器數(shù)量的分布。由圖可見,56%的頁面請(qǐng)求聯(lián)系少于20臺(tái)memcached服務(wù)器。按照傳輸量來說,用戶請(qǐng)求傾向于請(qǐng)求小數(shù)量的緩存數(shù)據(jù)。然而這個(gè)分布存在一個(gè)長(zhǎng)尾。這張圖也展示了對(duì)于流行頁面的請(qǐng)求分布,這樣的頁面可以更好的展示出多對(duì)多的通信模式。大部分這樣的請(qǐng)求將會(huì)接入超過100臺(tái)獨(dú)立的服務(wù)器;接入幾百臺(tái)memcached服務(wù)器也不是少數(shù)。
響應(yīng)大小:圖10展示了對(duì)memcache請(qǐng)求的響應(yīng)大小。中位數(shù)(135byte)與平均數(shù)(954byte)之間的差值隱含著緩存項(xiàng)的大小存在很大差異。另外,在近似200byte和600byte處有三個(gè)不同的峰值。大的數(shù)據(jù)項(xiàng)傾向于存儲(chǔ)數(shù)據(jù)列表,而小的數(shù)據(jù)項(xiàng)傾向于存儲(chǔ)單個(gè)內(nèi)容塊。

?

延遲:我們測(cè)量從memcache請(qǐng)求數(shù)據(jù)的往返延遲,這個(gè)延遲包含了請(qǐng)求路由和接收回復(fù)的成本、網(wǎng)絡(luò)傳輸時(shí)間和反序列化和解壓縮的成本。通過7天的統(tǒng)計(jì),請(qǐng)求延遲的中位數(shù)是333微秒,位于第75百分位的是475微秒,位于第95百分位的是1.135毫秒。空閑web服務(wù)器端到端延遲的中位數(shù)是178微秒,位于第75百分位的是219微秒,位于第95百分位的是374微秒。在第95百分位上延遲的巨大差異是由處理數(shù)據(jù)量大的回應(yīng)和等待可運(yùn)行線程調(diào)度引起的,這些在3.1章已經(jīng)討論過了。

圖10:讀取數(shù)據(jù)大小的累積分布

7.2 池的統(tǒng)計(jì)

現(xiàn)在我們討論四個(gè)memcache池的測(cè)量。這些池分別是wildcard(默認(rèn)池),app(專門設(shè)定給特定應(yīng)用的池),給存取頻繁的數(shù)據(jù)的replicated pool,給很少存取的數(shù)據(jù)的regional pool。在每個(gè)池中,我們每四分鐘收集一次平均的統(tǒng)計(jì),表2展示了一個(gè)月的統(tǒng)計(jì)周期的最大平均值。這些數(shù)據(jù)近似于那些池的峰值負(fù)載。這張表顯示了對(duì)于不同的池,get、set和delete操作的頻率存在很大差異。表3展示了每個(gè)池響應(yīng)大小的分布。這些不同的特征激發(fā)了我們分隔不同工作負(fù)載的欲望。
??????????? 就像在3.2.3章討論過的那樣,我們?cè)诔貎?nèi)復(fù)制數(shù)據(jù),使用批處理的優(yōu)勢(shì)來處理高請(qǐng)求率。我們觀察到,replicated pool具有最高的get操作率(差不多是第二高的2.7倍),最高的字節(jié)比包的比率,盡管該池有最小的數(shù)據(jù)項(xiàng)大小。這些觀察數(shù)據(jù)與我們?cè)O(shè)計(jì)的期望一致,我們就是想利用復(fù)制和批處理來實(shí)現(xiàn)更好的性能。在app池,更高的數(shù)據(jù)抖動(dòng)自然而然將會(huì)導(dǎo)致更高的不命中率。這個(gè)池傾向于將數(shù)據(jù)保存幾個(gè)小時(shí),然后就會(huì)被新的數(shù)據(jù)踢出。在regional pool中的數(shù)據(jù)傾向于是較大的而且不頻繁被存取的,就像表中的的請(qǐng)求率和數(shù)據(jù)大小分布展示的那樣。

?

7.3失效延時(shí)

我們發(fā)現(xiàn),在確定暴露過期數(shù)據(jù)的概率上,失效的及時(shí)性是一個(gè)關(guān)鍵因素。為了監(jiān)控該生命值,我們從百萬次刪除操作中取樣一次并記錄刪除命令發(fā)出的時(shí)間。隨后,我們定期地為該樣本查詢所有前端集群中memcache的內(nèi)容,如果刪除命令將一個(gè)字段設(shè)定為無效時(shí),該字段仍然緩存,則記錄一個(gè)錯(cuò)誤。

圖11:刪除的管線的延時(shí)

在圖11中,我們使用這種監(jiān)控機(jī)制來統(tǒng)計(jì)30天的失效延遲。我們將數(shù)據(jù)分為兩組:(1)刪除操作由主region中的web服務(wù)器發(fā)起,并被發(fā)送到主region中的一個(gè)memcached服務(wù)器,(2)刪除操作從副本region發(fā)起,并且發(fā)送到另外一個(gè)副本region。由統(tǒng)計(jì)數(shù)據(jù)可以見,當(dāng)參數(shù)操作的發(fā)起地和目的地都是在主region的時(shí)候,成功率非常的高,一秒鐘內(nèi)就可以達(dá)到四個(gè)九的可靠性,一小時(shí)之后就可以達(dá)到五個(gè)九。當(dāng)刪除操作的發(fā)起地和目的地都不在主region的時(shí)候,一秒鐘內(nèi)的可靠性下降到了三個(gè)九,十分鐘內(nèi)才達(dá)到四個(gè)九。按照我們的經(jīng)驗(yàn),當(dāng)幾秒鐘之后失效操作不成功,最可能的原因是第一次嘗試失敗,接下來的重試將會(huì)解決這個(gè)問題。

8 相關(guān)工作

一些其他的大型網(wǎng)站已經(jīng)意識(shí)到key-value存儲(chǔ)的應(yīng)用。DeCandia 等[12]構(gòu)建了高可用的key-value存儲(chǔ)系統(tǒng)(Dynamo),已經(jīng)亞馬遜網(wǎng)站應(yīng)用服務(wù)中大量使用。相比較,Dynamo主要著眼于優(yōu)化高負(fù)荷狀況下的寫操作,而我們系統(tǒng)的負(fù)荷主要是大量的讀操作。類似的有,LinkedIn 使用Voldemort[5],由Dynamo衍生而出。其他被大量使用的key-value存儲(chǔ)方案包括Github,digg和Blizzard使用Redis[6];Twitter[33]和Zynga使用memcahed。Lakshmanet等[1]開發(fā)了Cassandra,一個(gè)基于模式的分布式key-value數(shù)據(jù)庫(kù)。然而我們更趨向于使用和擴(kuò)展memcached,主要是由于其簡(jiǎn)單的設(shè)計(jì)。

我們的工作是擴(kuò)展memecached使其在分布式數(shù)據(jù)架構(gòu)下工作。Gribble等[19]構(gòu)建了一個(gè)早期版本的key-value存儲(chǔ)系統(tǒng)用于Internet擴(kuò)展服務(wù)。Ousterhout等[29]也構(gòu)建了一個(gè)大規(guī)模內(nèi)存key-value存儲(chǔ)系統(tǒng)。與這些方案不同,memcache不保證持久性。我們利用其它的系統(tǒng)來解決數(shù)據(jù)存儲(chǔ)的持久性問題。

????????????

表2:各類型的平均超過7天的memcache程序池流量圖

表 3: 各類型程序池關(guān)鍵詞大小分布(k)

Ports等[31]提供了一個(gè)用于管理事任務(wù)數(shù)據(jù)庫(kù)查詢結(jié)果緩存的類庫(kù)。我們需要的是一個(gè)更靈活的緩存措略。我們利用最近和過期讀優(yōu)先措略用來研究高性能系統(tǒng)下緩存一致性和讀操作。Ghandeharizadeh和Yap等研究也提出了一個(gè)公式,解決基于時(shí)間標(biāo)記而不是確定的版本號(hào)過期集合的問題。

雖然軟路由易于定制和編程,但是相比較硬路由其效率更低。Dobresuet等[13]利用多處理器、多存儲(chǔ)控制器,多隊(duì)列網(wǎng)絡(luò)接口和批處理的方式在通用服務(wù)器上研究了這些問題。利用這些技術(shù)實(shí)現(xiàn)微路由來保持進(jìn)一步的工作。Twitter也獨(dú)立開發(fā)了一個(gè)類似微路由的memcache代理[32]

在Coda[35]中,Satyanarayanan等展示了如何把由于不連貫的操作導(dǎo)致的數(shù)據(jù)集分歧恢復(fù)一致。Glendenninget等[17] 利用杠桿作用Paxos公式[24]和加權(quán)因子[16]構(gòu)建了Scatter,一個(gè)線性語義攪動(dòng)的非貢獻(xiàn)哈希表。

TAO[37]是facebook 的另一個(gè)嚴(yán)重依賴緩存的系統(tǒng),主要用戶保證大數(shù)據(jù)量查詢時(shí)能保持低延遲。TAO和memcache有兩方面的重大不同。(1),TAO由一個(gè)圖形模型實(shí)現(xiàn),在模型中每一個(gè)節(jié)點(diǎn)由一個(gè)固定長(zhǎng)度的持久標(biāo)識(shí)符(64位整數(shù))來標(biāo)識(shí)。(2)TAO 有一個(gè)編碼規(guī)范,把它的圖形模型映射到持久存儲(chǔ),并且對(duì)持久層負(fù)責(zé)。其他大量的組件,比如我們的客戶類庫(kù)和微路由,都可以在兩個(gè)系統(tǒng)中通用。

9 總結(jié)

在這篇文章里,我們展示了使用基于memcached的技術(shù)來滿足Facebook不斷增長(zhǎng)的需求. 文中討論的很多權(quán)衡都不是很基礎(chǔ), 但是卻是在優(yōu)化線上系統(tǒng)性能時(shí)真實(shí)遇到的,而這個(gè)線上系統(tǒng)的規(guī)模還在持續(xù)部署新產(chǎn)品的過程中不停的擴(kuò)大. 在建設(shè)、維護(hù)、擴(kuò)容我們的系統(tǒng)時(shí),我們學(xué)到了一下的經(jīng)驗(yàn)。(1) 分離的緩存和持久化存儲(chǔ)系統(tǒng)使我們可以對(duì)他們進(jìn)行單獨(dú)的度量. (2) 監(jiān)視、報(bào)錯(cuò)、可選的特性和性能一樣重要. (3) 管理有狀態(tài)的組件要比管理無狀態(tài)組件復(fù)雜的多. 所以將邏輯保存在無狀態(tài)的客戶端里會(huì)對(duì)特性的反復(fù)調(diào)用有幫助并且使系統(tǒng)的分裂最小化. (4) 系統(tǒng)要可以逐步的增加或減少新功能,即使這會(huì)導(dǎo)致系統(tǒng)的功能集臨時(shí)的異構(gòu). (5) 簡(jiǎn)潔至關(guān)重要.

總結(jié)

非常感謝Philippe Ajoux, Nathan Bron-son, Mark Drayton, David Fetterman, Alex Gartrell, Andrii Grynenko, Robert Johnson, Sanjeev Kumar, Anton Likhtarov, Mark Marchukov, Scott Marlette, Ben Maurer, David Meisner, Konrad Michels, Andrew Pope, Jeff Rothschild, Jason Sobel, and Yee Jiun Song ,他們提供的杰出貢獻(xiàn). 我們同時(shí)非常感謝那些不知名的評(píng)論者,以及我們的指導(dǎo) Michael Piatek, Tor M. Aamodt, Remzi H. Arpaci-Dusseau, and Tayler Hetherington ,在我們撰寫這篇文章的時(shí)候他們給了我們很多寶貴的反饋. 最后我們要感謝facebook的工程師同事們,他們給出了很多意見,bug報(bào)告,并且支撐memcache成為今天這個(gè)樣子。

-------------------------------------------page 12-------------------------------------------

References ??????????? [1] Apache Cassandra. http://cassandra.apache.org/. ??????????? [2] Couchbase. http://www.couchbase.com/. ??????????? [3] Making Facebook Self-Healing. https://www.facebook.com/note.php?note_id=10150275248698920. ??????????? [4] Open Compute Project. http://www.opencompute.org. ??????????? [5] Project Voldemort. http://project-voldemort.com/. ??????????? [6] Redis. http://redis.io/. ??????????? [7] Scaling Out. https://www.facebook.com/note.php?note_id=23844338919. ??????????? [8] ATIKOGLU, B., XU,Y.,FRACHTENBERG, E., JIANG, S., AND PALECZNY, M. Workload analysis of a large-scale key-value store. ACM SIGMETRICS Performance Evaluation Review 40, 1 (June 2012), 53–64. ??????????? [9] BEREZECKI, M., FRACHTENBERG, E., PALECZNY, M., AND STEELE, K. Power and performance evaluation of memcached on the tilepro64 architecture.Sustainable Computing: Informat-ics and Systems 2, 2 (June 2012), 81 – 90. ??????????? [10] BOYD-WICKIZER, S., CLEMENTS, A. T., MAO, Y., PESTEREV, A., KAASHOEK,M.F.,MORRIS, R., AND ZELDOVICH, N. An analysis of linux scalability to many cores. In Proceedings of the 9th USENIX Symposium on Operating Systems Design & Implementation(2010), pp. 1–8. ??????????? [11] CERF, V. G., ANDKAHN, R. E. A protocol for packet network intercommunication. ACM SIGCOMM Compututer Communi-cation Review 35, 2 (Apr. 2005), 71–82. ??????????? [12] DECANDIA, G., HASTORUN, D., JAMPANI, M., KAKULAP-ATI, G., LAKSHMAN, A., PILCHIN, A., SIVASUBRAMANIAN,S., VOSSHALL, P., ANDVOGELS, W. Dynamo: amazon’s highly available key-value store.ACM SIGOPS Operating Sys-tems Review 41, 6 (Dec. 2007), 205–220. ??????????? [13] FALL, K., IANNACCONE, G., MANESH, M., RATNASAMY, S., ARGYRAKI, K., DOBRESCU, M., ANDEGI, N. Routebricks: enabling general purpose network infrastructure.ACM SIGOPS Operating Systems Review 45, 1 (Feb. 2011), 112–125. ??????????? [14] FITZPATRICK, B. Distributed caching with memcached. Linux Journal 2004, 124 (Aug. 2004), 5. ??????????? [15] GHANDEHARIZADEH, S., ANDYAP, J. Gumball: a race con-dition prevention technique for cache augmented sql database management systems. In Proceedings of the 2nd ACM SIGMOD Workshop on Databases and Social Networks(2012), pp. 1–6. ??????????? [16] GIFFORD, D. K. Weighted voting for replicated data. In Pro-ceedings of the 7th ACM Symposium on Operating Systems Prin-ciples(1979), pp. 150–162. ??????????? [17] GLENDENNING, L., BESCHASTNIKH, I., KRISHNAMURTHY, A.,ANDANDERSON, T. Scalable consistency in Scatter. In Proceedings of the 23rd ACM Symposium on Operating Systems Principles(2011), pp. 15–28. ??????????? [18] GRAY, C., ANDCHERITON, D. Leases: An efficient fault-tolerant mechanism for distributed file cache consistency. ACM SIGOPS Operating Systems Review 23, 5 (Nov. 1989), 202–210. ??????????? [19] GRIBBLE, S. D., BREWER, E. A., HELLERSTEIN, J. M., AND CULLER, D. Scalable, distributed data structures for internet service construction. InProceedings of the 4th USENIX Sym-posium on Operating Systems Design & Implementation(2000), pp. 319–332. ??????????? [20] HEINRICH, J. MIPS R4000 Microprocessor User’s Manual. MIPS technologies, 1994. ??????????? [21] HERLIHY, M. P., ANDWING, J. M. Linearizability: a correct-ness condition for concurrent objects. ACM Transactions on Programming Languages and Systems 12, 3 (July 1990), 463–492. ??????????? [22] KARGER, D., LEHMAN, E., LEIGHTON,T.,PANIGRAHY, R., LEVINE, M., ANDLEWIN, D. Consistent Hashing and Random trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web. In Proceedings of the 29th annual ACM Symposium on Theory of Computing(1997), pp. 654–663. ??????????? [23] KEETON, K., MORREY, III, C. B., SOULES, C. A., AND VEITCH, A. Lazybase: freshness vs. performance in informa-tion management. ACM SIGOPS Operating Systems Review 44,1 (Dec. 2010), 15–19. ??????????? [24] LAMPORT, L. The part-time parliament. ACM Transactions on Computer Systems 16, 2 (May 1998), 133–169. ??????????? [25] LIM, H., FAN, B., ANDERSEN, D. G., ANDKAMINSKY, M. Silt: a memory-efficient, high-performance key-value store. In Proceedings of the 23rd ACM Symposium on Operating Systems Principles(2011), pp. 1–13. ??????????? [26] LITTLE, J., ANDGRAVES, S. Little’s law. Building Intuition (2008), 81–100. ??????????? [27] LLOYD,W.,FREEDMAN, M., KAMINSKY, M., ANDANDER-SEN, D. Don’t settle for eventual: scalable causal consistency for wide-area storage with COPS. InProceedings of the 23rd ACM Symposium on Operating Systems Principles(2011), pp. 401–416. ??????????? [28] METREVELI, Z., ZELDOVICH, N., AND KAASHOEK, M. Cphash: A cache-partitioned hash table. In Proceedings of the 17th ACM SIGPLAN symposium on Principles and Practice of Parallel Programming(2012), pp. 319–320. ??????????? [29] OUSTERHOUT, J., AGRAWAL,P.,ERICKSON, D., KOZYRAKIS, C., LEVERICH, J., MAZI` ERES, D., MI-TRA, S., NARAYANAN, A., ONGARO, D., PARULKAR, G., ROSENBLUM, M., RUMBLE, S. M., STRATMANN, E., AND STUTSMAN, R. The case for ramcloud. Communications of the ACM 54, 7 (July 2011), 121–130. ??????????? [30] PHANISHAYEE, A., KREVAT, E., VASUDEVAN,V.,ANDER-SEN, D. G., GANGER, G. R., GIBSON, G. A., ANDSE-SHAN, S. Measurement and analysis of tcp throughput col-lapse in cluster-based storage systems. InProceedings of the 6th USENIX Conference on File and Storage Technologies(2008), pp. 12:1–12:14. ??????????? [31] PORTS, D. R. K., CLEMENTS,A.T.,ZHANG, I., MADDEN, S.,ANDLISKOV, B. Transactional consistency and automatic management in an application data cache. InProceedings of the 9th USENIX Symposium on Operating Systems Design & Implementation(2010), pp. 1–15. ??????????? [32] RAJASHEKHAR, M. Twemproxy: A fast, light-weight proxy for memcached.https://dev.twitter.com/blog/twemproxy. ??????????? [33] RAJASHEKHAR, M., ANDYUE, Y. Caching with twem-cache. http://engineering.twitter.com /2012/07/caching-with-twemcache.html. ??????????? [34] RATNASAMY, S., FRANCIS,P.,HANDLEY, M., KARP, R., ANDSHENKER, S. A scalable content-addressable network. ACM SIGCOMM Computer Communication Review 31, 4 (Oct.2001), 161–172. ??????????? [35] SATYANARAYANAN, M., KISTLER, J., KUMAR,P.,OKASAKI, M., SIEGEL, E., ANDSTEERE, D. Coda: A highly available file system for a distributed workstation environment. IEEE Trans-actions on Computers 39, 4 (Apr. 1990), 447–459.

-------------------------------------------page 13-------------------------------------------

??????????? [36] STOICA, I., MORRIS, R., KARGER, D., KAASHOEK, M., AND BALAKRISHNAN, H. Chord: A scalable peer-to-peer lookup service for internet applications. ACM SIGCOMM Computer Communication Review 31, 4 (Oct. 2001), 149–160. ??????????? [37] VENKATARAMANI,V.,AMSDEN, Z., BRONSON, N., CABR-ERAIII, G., CHAKKA,P.,DIMOV,P.,DING, H., FERRIS, J., GIARDULLO, A., HOON, J., KULKARNI, S., LAWRENCE, N., MARCHUKOV, M., PETROV, D., ANDPUZAR, L. Tao: how facebook serves the social graph. In Proceedings of the ACM SIGMOD International Conference on Management of Data(2012), pp. 791–792.

英文原文:Scaling Memcache At Facebook

轉(zhuǎn)自:http://www.linuxeden.com/html/news/20130605/139918_2.html

轉(zhuǎn)載于:https://www.cnblogs.com/YuanZhaoBest/p/3856478.html

總結(jié)

以上是生活随笔為你收集整理的Facebook 对 Memcache 伸缩性的增强的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。