Pinterest大規(guī)模緩存集群的架構剖析_第1頁
Pinterest大規(guī)模緩存集群的架構剖析_第2頁
Pinterest大規(guī)模緩存集群的架構剖析_第3頁
Pinterest大規(guī)模緩存集群的架構剖析_第4頁
Pinterest大規(guī)模緩存集群的架構剖析_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Pinterest大規(guī)模緩存集群的架構剖析隨著越來越多的用戶到Pinterest尋求靈感,Pinterest核心基礎設施系統(tǒng)的需求增長的比以往任何時候都快。我們的核心存儲系統(tǒng)之一是位于許多微服務和數(shù)據(jù)庫前面的分布式緩存層。它處于Pinterest基礎架構技術棧的底部,負責吸收由用戶增長驅動的絕大多數(shù)后端流量。Pinterest的分布式緩存集群建立在AWS的EC2實例上,由數(shù)千臺機器組成,緩存了數(shù)百TB的數(shù)據(jù),高峰時,每秒可處理1.5億個請求。該緩存層通過降低整個后端技術棧的延遲,來優(yōu)化頂層性能,并通過減少昂貴的后端所需的容量來提供顯著的成本效率。本文中,我們將對支持Pinterest的大規(guī)模緩存集群的架構進行深入的技術研究。1應用數(shù)據(jù)緩存每個對Pinterest的API請求都會在內(nèi)部根據(jù)技術棧分發(fā)到復雜的RPC樹,并在完成其關鍵路徑前會涉及數(shù)十個服務。這可能包括查詢關鍵數(shù)據(jù)(例如Pinterest的圖片和收藏板)的服務,推送相關圖片的推薦系統(tǒng)和垃圾內(nèi)容檢測系統(tǒng)。在這些服務中,只要其輸入數(shù)據(jù)可以被唯一鍵值表示,就可以將該離散的查詢單元的結果緩存在臨時存儲系統(tǒng)中,以便將來重用。在Pinterest,分布式緩存層的最常見用途是通過后備語義(look-asidesemantics)來存儲這類中間計算的結果。這使得緩存層能吸收一大部分流量。如果沒有緩存層,這些流量會流向涉及復雜計算和昂貴存儲的服務和數(shù)據(jù)庫。憑借著毫秒級的尾延遲(taillatency),以及極低的單位請求基礎架構成本,這個分布式緩存層提供了一個高性能低成本的后端擴展機制,以滿足Pinterest不斷增長的需求。簡化版的Pinterest的API請求生命周期:經(jīng)過主要API服務,其依賴項后端以及分布式緩存層。通過提供分布式緩存層即服務,應用開發(fā)人員可以專注于實現(xiàn)業(yè)務邏輯,而不必擔心分布式數(shù)據(jù)的一致性、高可用性或者內(nèi)存容量。緩存層用戶使用通用的路由抽象層,以確保應用程序具有容錯性和一致的數(shù)據(jù)視圖。此外,緩存服務端集群可以獨立于應用層橫向擴展,從而透明地調整內(nèi)存或吞吐量,以適應資源使用情況的變化。2分布式緩存的骨干:Memcached和McrouterMemcached和mcrouter構成了Pinterest分布式緩存基礎架構的骨干,并且在Pinterest的存儲基礎架構中起著至關重要的作用。Memcached是由純C語言編寫的開源且高效的內(nèi)存鍵值存儲。Mcrouter是應用層的Memcached協(xié)議代理,位于Memcached集群的前面,并提供強大的高可用性和路由功能。Memcached是緩存解決方案中非常有吸引力的選擇:得益于其異步事件驅動的體系結構和多線程處理模型,memcached非常高效且易于進行橫向擴展以滿足容量需求。Extstore通過實例的NVMe閃存磁盤上的二級溫存儲(secondarywarmstorage)層,幫助實現(xiàn)了驚人的存儲效率。Memcached精心設計的簡單體系結構提供了在其之上構建抽象層的靈活性,以及簡單易行的水平可擴展性以滿足日益增長的需求。一個Memcached進程本身只是一個簡單的鍵值存儲,根據(jù)設計,它對其它的Memceched進程的存在毫無了解,甚至沒有Memcached集群的概念。Memcached在數(shù)十年的開發(fā)過程中已經(jīng)經(jīng)過準確性和性能的嚴格測試,并擁有非常活躍的開源社區(qū)(該社區(qū)還將多個Pinterest提交的補丁合并至上游。)。Memcached自帶了對TLS終止功能的原生支持,從而使我們能通過TLS雙向身份驗證的流量(該過程還額外包括內(nèi)部搭建的基于SPIFFE授權訪問控制)來保護整個集群。Mcrouter在2014年由Facebook開源,在擴展其Memcached部署方面發(fā)揮了關鍵作用。Mcrouter也非常適合Pinterest的架構,原因如下:通過為應用開發(fā)人員提供與整個緩存集群進行交互的單個終端節(jié)點,Mcrouter充當了Memcached服務器集群的有效抽象。此外,將mcrouter用作整個系統(tǒng)的唯一接口可以確保Pinterest上所有服務和機器之間有通用及全局一致的流量行為。Mcrouter提供了解耦的控制平面和數(shù)據(jù)平面:Memcached服務器集群的整個拓撲結構被劃分為多個“池”(邏輯集群),而管理客戶端和服務器池之間交互的請求路由策略和行為均被獨立管理。Mcrouter的配置API為復雜的路由提供了強大的基礎,包括區(qū)域親和性路由,用于實現(xiàn)數(shù)據(jù)冗余的復制,多層緩存層和影子流量。作為使用memcached的ASCII協(xié)議的應用層代理,mcrouter開放了針對智能協(xié)議的功能,例如請求處理(TTL修改、運行中壓縮等)。Mcrouter原生地提供了豐富的可觀察性功能,并且對客戶端應用來說不需要任何成本。這為我們整個基礎架構中的Memcached流量提供了詳細的可見性。對我們而言,其中最重要的指標包括百分位請求延遲,按單個客戶端和服務器維度劃分的吞吐量,與鍵前綴和鍵模式有關的請求趨勢以及用于檢測服務器行為異常的錯誤率。從mcrouter到Memcached的請求路由總覽。每個鍵前綴都與一個路由策略相關聯(lián),圖中展示了兩個例子。在實踐中,mcrouter作為邊車代理(proxysidecar)被部署在和服務同一機器的單獨進程。如圖2所示,應用程序(可以由任何語言編寫)在回送時將Memcached協(xié)議請求發(fā)送給mcrouter,然后mcrouter作為代理將這些請求發(fā)送到數(shù)千個上游memcached服務器。這種架構能使我們在完全托管的緩存服務器集群中構建強大功能的同時,對客戶端服務保持完全透明。盡管從Pinterest早期開始,memcached一直就是Pinterest基礎架構的一部分,我們對其客戶端的拓展策略在這些年來也在不斷進化。具體來說,路由和服務發(fā)現(xiàn)在最開始是通過客戶端庫完成的(這其實很脆弱,而且它還與二進制部署緊密耦合)。然后,該方法被內(nèi)部構建的一個路由代理取代(該路由代理沒有提供用于高可用性的基礎功能),最終被mcrouter取代。3計算和存儲效率Memcached的效率很高:單個r5.2xlargeEC2實例每秒能支持超過10萬個請求和數(shù)以萬計的并發(fā)TCP連接,同時不會顯著地增加客戶端的延遲。這使Memcached成為Pinterest吞吐效率最高的生產(chǎn)服務。這部分歸功于編寫良好的C語言代碼以及其體系結構。該體系結構利用了多個工作線程,每個工作線程獨立地運行由”libevent“驅動的事件循環(huán),來支持傳入的連接。在Pinterest,Memcached的extstore在存儲效率方面取得了巨大的成功,具體的用例包括可視搜索以及個性化搜索推薦引擎。extstore擴展了緩存數(shù)據(jù)容量,在DRAM之外增加了掛載在本地的NVMe閃存盤,從而將每個實例的可用存儲容量從約55GB(r5.2xlarge)增加到將近1.7TB(i3.2xlarge),而實例成本只是略有增長。在實踐中,extstore大大優(yōu)化了數(shù)據(jù)用量受限的用例,盡管DRAM和SSD響應時間之間有幾個數(shù)量級的差異,extstore卻沒有犧牲端到端延遲。extstore的內(nèi)置調整工具使我們能找到一個平衡了磁盤I/O、磁盤到內(nèi)存的重新緩存速率、壓縮頻率和壓縮程度以及客戶端尾部響應時間的最佳平衡點。4高可用性Pinterest的所有基礎架構系統(tǒng)都是高可用的,我們的緩存系統(tǒng)也不例外。通過利用mcrouter提供的豐富的路由功能,我們的memcached集群有著一系列的容錯功能:針對部分失控或完全宕機的服務器的自動故障轉移。網(wǎng)絡本身就是不可靠且有損耗的。我們整個緩存架構假定這是不可改變的事實,在服務器不可用或速度緩慢時也可以保持可用性。幸運的是,緩存數(shù)據(jù)在本質上是瞬態(tài)的,這放寬了對數(shù)據(jù)持久性的要求,而持久性存儲(例如數(shù)據(jù)庫)對數(shù)據(jù)持久性的要求很高。在Pinterest中,mcrouter會自動地在請求響應緩慢時,或者某個服務器宕機時故障轉移到全局共享集群,并且mcrouter還會通過主動的運行狀況檢查將服務器加入服務池中。通過自動故障轉移以及一系列的單個服務器故障的代理層檢測,運維人員可以在最短的生產(chǎn)停機時間內(nèi)識別并更換行為異常的服務器。通過透明的跨區(qū)域復制實現(xiàn)數(shù)據(jù)冗余。我們的關鍵用例是跨不同的AWS可用區(qū)(AZ)進行多集群復制的。這樣就可以在完全丟失可用區(qū)的情況下實現(xiàn)零停機時間:所有請求都將自動重定向到位于另一個可用區(qū)中的運行狀況良好的副本節(jié)點(replica),在該副本節(jié)點中有完整的數(shù)據(jù)冗余副本。與實際生產(chǎn)流量隔離的影子測試。mcrouter中的流量路由功能使我們可以進行各種彈性測試,包括集群到集群的暗流量以及在實際生產(chǎn)請求中人為加入的延遲和停機時間的測試,而不會影響生產(chǎn)。搜索后端架構師公眾號回復“架構整潔”,送你一份驚喜禮包。5負載均衡和數(shù)據(jù)分片分布式系統(tǒng)的關鍵功能之一是水平可伸縮性,這是一種可以橫向擴展而不是縱向擴展以適應額外的流量增長的能力。在Pinterest,我們絕大多數(shù)的緩存工作量都是受吞吐量限制的,這需要集群中實例的數(shù)量與請求的數(shù)量大致呈線性比例關系。然而,memcached本身是一個非常簡單的鍵值存儲,它本身并不會知道集群中的其他節(jié)點。那么每秒數(shù)億個請求是如果通過網(wǎng)絡發(fā)送到正確的服務器上的呢?Mcrouter通過對每個請求的緩存鍵運用哈希算法,來將請求確定性地發(fā)送到池中的某一個主機。這對于在服務器之間平均分配流量非常有幫助,但是memcached有一個獨特的要求,即它的集群需要任意可伸縮性,也就是說運維人員要能夠自由地根據(jù)不斷變化的流量需求,來調整集群容量,同時最大程度地減少客戶端的影響。一致性哈希確保了在合格分片的總數(shù)增加或減少時,大多數(shù)鍵空間分區(qū)也可以映射到同一服務器。高度集中和可預測的命中率影響,允許系統(tǒng)在擴展時對客戶端透明,從而防止容量的小范圍變化導致集群命中率出現(xiàn)災難性下降。一致性哈希算法保證了當單一節(jié)點加入現(xiàn)有集群時,大多數(shù)鍵值空間所分配的服務器不變客戶端路由層將單個鍵值前綴映射到一個或多個這樣的一致哈希池,這些一致哈希池位于某個路由策略之后,包括跨可用區(qū)復制集群的可用區(qū)親和性偏好路由,針對位于基于閃存的容量集群后方的基于內(nèi)存集群的L1L2路由(具有穿透)等。這樣可以隔離流量,從而按客戶端的用例情況來分配容量,并且可以確保來自Pinterest集群中任何客戶端機器的一致緩存路由行為。6優(yōu)劣權衡和我們的考慮所有足夠復雜的基礎架構系統(tǒng)都具有一個共同特點:充滿了(往往非常細微的)優(yōu)劣權衡。在構建和擴展我們的緩存系統(tǒng)的過程中,我們權衡了許多方案的成本和收益。如下是最重要的幾點:中間代理層會產(chǎn)生大量的計算和I/O開銷,特別是對于具有嚴格的延遲SLO并且注重性能的系統(tǒng)而言。但是,mcrouter所提供的高可用性抽象,靈活的路由行為以及許多其他功能遠遠比性能損耗更重要。全局共享的代理配置會給更改部署帶來風險,因為在部署時,所有控制平面更改都會應用到Pinterest的含有數(shù)萬臺機器的整個集群中。然而,這也確保了全局一致的memcached集群拓撲和與之相關的路由策略,無論客戶端通過何種方式在Pinterest內(nèi)何處進行部署。我們管理維護著約一百個不同的Memcached集群,其中,許多集群具有不同的租戶(tenancy)特征(專用與共享)、硬件實例類型和路由策略。雖然這給團隊帶來了相當大的運維負擔,但它也允許每個用例達到有效的性能和可用性隔離,同時還能通過選擇最適合某個特定工作負載使用情況的參數(shù)和實例類型來達到效率優(yōu)化。在大多數(shù)情況下,一致性哈希方案在上游服務器池之間進行負載分配的效果很好,即使在鍵空間由類似前綴的鍵簇組成的情況下也是如此。但是,這不能解決熱鍵問題——特定鍵集的請求量的異常增加仍然會產(chǎn)生因服務器集群中的熱分片所

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論