論文閱讀:Elastic Scaling of Stateful Network Functions

摘要:

彈性伸縮是NFV的核心承諾,但在實際應用中卻很難實現。出現這種困難的緣由是大多數網絡函數(NFS)是有狀態的,而且這種狀態須要在NF實例之間共享。在知足NFS上的吞吐量和延遲要求的同時實現狀態共享是有挑戰性的,而且迄今爲止,尚未解決NFV對於全頻譜NFS的性能目標的解決方案。算法

S6是一個新框架,能夠在不影響性能的狀況下支持NF的彈性縮放。 它的設計基於這樣的看法:分佈式共享狀態抽象很是適合NFV背景。 咱們將狀態組織爲分佈式共享對象(DSO)空間,並使用旨在知足NFV工做負載的彈性和高性能需求的技術擴展DSO概念。編程

S6簡化了開發過程:NF編寫器程序不瞭解狀態的分佈和共享方式。 相反,S6透明地遷移狀態並處理對共享狀態的訪問。 在咱們的評估中,與最新的NFs動態縮放解決方案相比,S6在縮放事件期間可將性能提升100倍,在正常操做下可將性能提升2-5倍。緩存

背景/問題:

網絡功能虛擬化(Network Function Virtualization,NFV)主張將稱爲網絡功能的中間盒功能從專用硬件設備轉移到在VM或共享服務器硬件上的容器中運行的軟件應用程序,NFV願景的一個重要好處是提供彈性伸縮——可以根據所提供的負載的變化,增長或減小當前專用於特定NF的虛擬機/容器的數量。然而,實現這種彈性伸縮已經被證實是具備挑戰性的,並且迄今爲止的解決方案在性能、功能和/或開發的易用性方面都付出了巨大的代價。服務器

困難在於大多數NFS是有狀態的,其狀態能夠很是頻繁地被讀取或更新(例如,每一個包或每一個流)。所以,彈性伸縮須要的不只僅是簡單地更新一個負載平衡器,將部分通訊量發送給另外一個VM/容器。擴展可能涉及跨NF實例遷移狀態,遷移對於高性能很重要(由於它避免了遠程狀態訪問),可是它的實現必須是快速的,而且不該該給NF開發人員帶來負擔。此外,彈性伸縮必須確保數據包與其狀態之間的關聯,而且即便在狀態遷移時,也必須正確地實施這種關聯。最後一個複雜的狀況是,某些類型的狀態是不可分割的,而是跨實例共享的,在這種狀況下,彈性縮放必須以確保知足該狀態的一致性要求的方式支持對共享狀態的訪問,而且對NF吞吐量和延遲的影響最小。網絡

任何彈性伸縮解決方案的核心是如何組織狀態並將其抽象爲NF應用程序。最近的工做探討了這方面的不一樣選擇:一些假設全部的狀態都是本地的,但既不是共享的,也不是遷移的,咱們稱之爲僅本地的方法。其餘則支持更豐富的模型,在這種模型中,NF開發人員能夠將狀態公開爲本地或遠程,開發人員能夠將狀態從遠程遷移到本地存儲,或者顯式地訪問遠程狀態——咱們稱之爲本地+遠程方法。還有一些假設全部狀態都是遠程的,存儲在一個集中的存儲中,咱們稱之爲僅遠程的方法。數據結構

以上是探索NF狀態管理設計空間的開拓性努力,可是它們仍然沒有一個理想的解決方案:多線程

  • 僅本地方法實現了高性能,可是它所支持的NF功能有限併發

  • 本地+遠程方法支持任意NF功能,但會使NF開發複雜化,而且在縮放事件期間會因總體從新分區狀態而致使長時間的停機負載均衡

  • 僅遠程方法很優雅,但即便在正常操做下也會帶來高性能開銷。框架

解決方法:

本文提出了一種將狀態組織爲分佈式共享對象(DSO)空間的彈性伸縮方法:對象封裝NF狀態,並生活在全局命名空間中,全部NF實例均可以讀/寫任何對象。雖然DSO是一個古老的概念,但它尚未應用到NFV背景中。特別是,DSO尚未被證實知足NFV強加的彈性和性能要求。

咱們提出了S6,一個針對NFV的開發和運行框架

爲了知足NFV工做負載的須要,S6擴展了DSO的概念:

  • 對於空間彈性,咱們引入了DSO密鑰空間的動態重組

  • 爲了最小化與縮放事件相關的停機時間,咱們引入了「聰明但懶惰」的狀態重組

  • 減小遠程訪問開銷,咱們引入了每包微線程

  • 爲了在不增長開發人員負擔的狀況下優化性能,咱們公開了每對象提示,開發人員能夠經過這些提示向DSO框架通知適當的遷移或緩存策略。

S6隱藏了分佈式狀態管理在引擎蓋下的全部內部複雜性,簡化了NF開發。

咱們提出了在S6之上實現的三個彈性NFS:NAT、PRADS(網絡監控系統)和SNORT ID的子集。

咱們展現了s6上的NFS以最小的性能開銷進行彈性擴展,並將它們與使用先前方法構建的NFS進行了比較:像E2這樣的本地系統不能支持咱們的兩個用例(NAT和PRADS),由於它不支持共享狀態。與基於本地+遠程方法的最新框架OpenNF相比,S6在擴展事件期間實現了10x-100x的低延遲,同時保持了10x的高吞吐量。與無狀態NF相比,S6是一個基於僅遠程方法的最新框架,在正常操做下能夠得到2-5倍的高吞吐量。

具體實現細節:

狀態管理涉及到許多設計選項,例如在哪裏放置狀態和什麼時候啓動遷移,它們都會影響NF的總體性能,例如吞吐量和延遲。

下圖顯示了先前行業研究所假定的NFV體系結構的典型組成部分。

不管是僅本地狀態模型、僅遠程狀態模型仍是本地+遠程模型都有其缺陷,沒法達到一個比較好的效果。

因而咱們提出了一種新的模型——分佈式共享狀態模型,這是分佈式計算所熟悉的。在該模型中,狀態在NF之間分佈,而且能夠由任何NF訪問,可是本地狀態與遠程狀態對NF開發人員而言沒有區別,全部狀態變量都位於共享的地址空間中,而且狀態管理框架透明地解析全部狀態訪問。該框架還負責肯定狀態的放置位置,並在適當的狀況下跨NF實例遷移狀態。正確完成後,經過將狀態遷移到與訪問它的NF實例位於同一位置,該模型能夠實現與僅本地模型至關的吞吐量和延遲,避免本地+遠程方法所致使的長時間停頓。因爲本地狀態和遠程狀態之間沒有區別,所以在擴展事件期間不須要主動遷移,數據包到達時,遷移的開銷將逐步攤銷。

例如,對於上述相同的PRADS方案,暫停時間能夠降至1毫秒如下。出於一樣的緣由,狀態遷移再也不須要與流量負載平衡進行緊密協調,從而下降了與本地+遠程模型關聯的系統複雜性。最後,分佈式共享狀態模型簡化了NF的開發,開發人員能夠在用於狀態訪問(本地或遠程)的統一界面之上編寫NF,將狀態查找,遠程訪問和向狀態管理框架的遷移的基本細節外包。

S6與現有的NF狀態管理解決方案不一樣,全部解決方案都須要在NFV控制器,SDN控制器和NF實例之間進行復雜的運行時協調,而S6與負載均衡器和SDN控制器的分離下降了系統的複雜性。

咱們總結了主要的設計思想:

  • S6提供了全部NF實例共享的全局DSO,咱們選擇「對象」做爲狀態的基本單位,對象封裝了一組數據及其關聯的操做,從而容許訪問控制和狀態的完整性保護。不管對象實際位於何處,均可以使用統一的API訪問該空間中的全部對象。

  • 咱們的對象抽象爲NF開發人員提供了指定對象訪問模式的旋鈕, S6框架使用此信息經過減小遠程狀態訪問的次數來提升性能。

  • 當不可避免要進行遠程狀態訪問時,S6經過隱藏微線程的延遲來下降其成本, NF工做器實例只有在不依賴於對遠程對象的出色訪問的數據依賴下,才能繼續處理其餘流。

  • 在發生縮放事件時,S6從新組織空間,同時讓工做人員處理流量,S6經過智能但延遲的對象及其元數據遷移來最大程度地減小服務中斷。

S6編程模型表(下表)總結了S6的API。從用戶的角度來看,S6的核心組件是共享對象空間和任務,根據對象是否容許從多個編寫器(NF實例)進行更新。咱們提供兩種類型的對象—— SingleWriter容許從單個實例進行獨佔寫入, MultiWriter容許同時從多個實例進行併發寫入。能夠對對象上的方法進行適當註釋,以容許進行更多優化,例如緩存讀取,更新後遺忘或按期將合併的本地更新推入對象全部者。而後,S6支持基於對象類型在後面進行適當的優化。

下圖顯示了PRADS 中使用的對象類的示例實現。

S6提供兩種類型的任務:數據平面和控制平面。數據平面任務對輸入網絡流量執行數據包處理,控制平面任務執行帶外操做,例如更新配置或處理用戶查詢,兩種類型的任務均可以使用統一的接口訪問共享對象空間。

S6實現包含三個主要組件:S6運行器,S6編譯器NFV控制器

S6運行器:運行時,S6運行器扮演三個角色:首先,它管理跨節點分佈的DSO空間,它跟蹤對象的位置並控制來自多個實例的對象訪問,以支持每種對象類型的互斥或併發訪問。其次,它管理與S6兼容的對象引用以提供S6編程接口,S6運行時介導對對象的每次訪問,並在須要時執行遠程操做或啓動對象遷移。第三,它爲數據平面和控制平面任務調度微線程,每當微線程因爲遠程訪問而將要阻塞時,運行時都會調度另外一個未決的微線程,並繼續處理數據包而不會阻塞。

S6編譯器:咱們使用BOOST協同例程庫來實現非搶先的用戶級多線程。 S6編譯器雖然S6在源代碼中須要自定義編程接口,可是沒有方便的方法來擴展C ++語法,咱們實現了一個源代碼到源代碼的編譯器,該編譯器將S6擴展的C ++代碼轉換爲純C ++,生成的代碼抽象化了DSO實施的實現細節。例如,當調用方法時,生成的代碼將檢查狀態對象是本地對象仍是遠程對象,以調用適當的函數。咱們在Clang-3.6庫的頂部實現了編譯器,以對開發人員的代碼進行語法分析。

NFV控制器:NFV控制器咱們構建了一個簡單的NFV控制器來管理S6實例,它經過啓動S6實例來運行NF羣集,並根據網絡工做負載啓動橫向擴展事件。控制器還從操做員到NF實例中繼帶外任務,例如查詢或更新配置。

討論與思考:

超越對象的其餘狀態:

集合:許多NF應用程序都包含集合數據結構(例如,鏈表,樹或哈希表),在S6中,能夠構建諸如C ++ STL之類的對象引用的非侵入式容器之類的集合。

多對象事務:S6本機支持線性化-對單個對象的寫入之間的排序,但不支持串行化——對多個對象的排序。爲了支持多對象事務,NF開發人員可使用可徹底更新的對象來實現自定義鎖,只容許單個實例引用該鎖對象,其餘實例須要等待,直到從先前的實例中釋放引用。密鑰全部者序列化對鎖對象的訪問。

容錯:

Pico 和FTMB等現有系統已經解決了中間盒和網絡功能的容錯問題。這些系統保證,當NF在非橫向擴展環境中發生故障時,新的NF會迅速恢復聯機-並顯示發生故障的NF的全部狀態-並繼續處理數據。最直接的補救措施是在每一個節點基礎上採用Pico(基於檢查點的按狀態快照)或FTMB(基於檢查點和重播的VM快照)算法,兩種系統都在數據包處理過程當中介入對中間盒狀態的訪問。

容錯的另外一種方法是經過基於DHT的經典故障轉移恢復功能來擴展S6的狀態管理。密鑰全部權(甚至數據自己)能夠在多個DHT節點之間複製三次。所以,若是任何單個節點發生故障,集羣的其他部分能夠當即繼續處理傳入流,從而訪問其他的複製狀態。

相關文章
相關標籤/搜索