Fenzo: Apache Mesos框架的OSS調度器
將Netflix提供給數百萬的用戶不是一件容易的事情。Netflix產品在我們的分布式環境中提供了幾十個服務,其中每一個服務都是用戶體驗 的重要組成部分,并且在不斷發展新的功能。針對Netflix服務的優化在兩方面是必不可少的,一個是客戶體驗的穩定性,另一個是服務的整體性能及成本。 為此,我們很高興介紹Fenzo這款開源的提供給Apache Mesos框架的資源調度器。Fenzo在管理這些部署的調度和資源分配上非常的嚴密。
Fenzo現在在 Netflix OSS 網站中是可用的,關于Fenzo如何工作以及為什么我們要構建它等更多詳細信息可以通過閱讀網站獲得。你還可以在 Github 上找到源代碼及文檔。
為什么使用Fenzo?
不利用社區中的任何一個框架而開發一個新框架的時候,有兩個主要動機,一個是實現調度優化,另一個是能夠根據使用自動縮放集群,這兩方面將會在下 文更詳細的討論。Fenzo能夠使框架更好的管理短暫性問題,這在云上是非常獨特的。我們的用例包括一個提供實時操作見解的反應流處理系統和基于容器的應 用程序管理部署。
在Netflix中我們看到一天的業務作業中會產生大量變化的數據。像典型的數據中心環境,Netflix是依據最高峰值來供應集群的,這是非常浪費的,而且系統可能偶爾被用戶響應異常操作事件的交互作業淹沒。我們需要利用云的彈性以及基于動態負載來縮放集群。
雖然擴大集群似乎看起來相對比較容易,但是當集群中可用資源低于一個閾值時,縮小集群產生了一個新的挑戰。如果存在長期存活的任務,并且不出現負 面后果就不能終止,例如拓撲結構的狀態流處理耗時重構,那么調度器如果想讓集群縮小,就必須讓這樣的主機上的所有任務幾乎同時終止。
調度策略
調度任務需要優化資源分配以最大化預期目標。可能有多個資源分配時,選擇一個和另一個可能在可伸縮性、性能等方面會產生顯著的不同,因此有效的分配選擇對于調度管理器是至關重要的。例如,通過評估每一個可用資源的每一個掛起任務來挑選分配,計算上是望而卻步的。
調度模型
我們的設計專注于大規模部署具有多重約束和優化資源需求的多樣化的任務與資源。如果評估最優化分配需要很長時間,就可能造成兩個問題:
? 資源閑置,等待新的任務
? 任務啟動經歷延遲增加
Fenzo采用了能夠快速推動我們到正確方向的方式,而不是每次都找出最優的調度分配集。
從概念上講,我們認為任務有一個緊迫因素決定多久需要一個任務分配,以及一個適合度因素決定是否適合一個給定的主機。
如果任務是非常緊迫的,或者如果它非常適合于一個給定的資源,我們繼續并分配資源給這個任務。 否則,我們繼續讓任務掛起,直到緊迫性增加或發現另一臺主機具有較大的適合度。
權衡調度速度與優化
Fenzo能夠為你動態的選擇速度與最優分配。它跨多個主機采用一個評價最優分配策略,但是只有當適合度被認為是“足夠好”才能獲得這種策略。然 而用戶為足夠好的合適度定義了閾值以控制調度速度,用一個合適度評估插件來表示集群任務分配的最優化和最高級別的調度對象。這個合適度計算器由多個其他合 適度計算器組成,代表一個多重面向對象。
任務約束
Fenzo任務使用可選的軟或硬約束影響分配來實現與其他任務的locality和/或資源的親和力。軟約束滿足best efforts基準,結合合適度計算器來給可能分配的主機打分,而硬約束則必須滿足和充當一個資源選擇過濾器。
Fenzo把所有相關的集群狀態信息提供給適合度計算器和約束插件,這樣就可以優化基于作業、資源和時間的各方面的任務。
封裝和約束插件
Fenzo目前為封裝提供了內置的基于CPU、內存以及網絡帶寬資源或者是他們集合的適合度計算器。
一些內置的約束用于解決資源類型的常見位置公共用例,將一組任務分配給不同的主機,平衡跨越給定主機屬性的任務,例如可用區、主機位置等。
你可以通過提供的新插件定制合適度計算器和約束。
集群自動縮放
Fenzo支持使用兩種互補的策略集群自動縮放:
? 基于閾值
? 基于資源短缺分析
基于閾值的自動縮放,用戶可以指定每個被用在集群當中的host組(如EC2自動縮放組,ASG)。例如,有可能是使用一個EC2實例類型的計算 密集型工作負載創建一個ASG,也可以使用網絡密集型工作負載創建另一個ASG。每一條規則有助于保持配置可用于快速啟動新作業的一定數量的可用主機。
利用資源短缺分析試圖來估計主機數目,以滿足待處理負載。這補充了在需求激增當中基于集群擴大的規則。 Fenzo的自動縮放還補充了預測自動縮放系統,如Netflix Scryer。
在Netflix上的應用
在Netflix上,Fenzo目前被使用在2個 Mesos框架中,用于各種使用案例,包括長時間運行的服務和批處理作業。我們已經看到調度器在多重約束和自定義的適合度計算器的情況下分配資源比較快。 此外,Fenzo允許我們根據當前的需求,而不是按照需求的峰值集群規模來調整集群大小。
下表顯示了我們觀測到的在我們其中的一個集群中的每個調度運行平均時間和最大時間。每個調度運行可能會試圖分配資源給多個任務,而運行時間非常依賴于需要分配的任務數、約束的數量和種類以及從中選擇資源的主機數量。
下圖顯示了在集群中幾天內Mesos slave的數量變化,作為Fenzo的自動縮放行為的體現,表示3X在最大和最小數值上的不同。
Fenzo 在Mesos 框架上的使用
上面簡易的圖示告訴我們Fenzo怎樣被Apache Mesos框架使用。Fenzo任務調度提供了一個沒有與Mesos自身進行交互的調度核心。Mesos的框架和接口在新的資源和任務狀態更新上得到回 傳,同時它讓Mesos driver 啟動基于Fenzo的分配任務。
總結
Fenzo已經成為云平臺上的一個很好的添加,它在Mesos上給我們一個高級別的控制任務調度,而且使我們在機器效率與作業運行快速化方面達到一個平衡。在這之外,Fenzo支持集群的自動縮放和封裝。通過編寫你自己的插件可以實現自定義調度器。
源代碼在 Netflix Github 上可用,資源庫當中包含了樣本框架教大家如何使用Fenzo,而且在 JUnit tests 中給出了不同類型的例子包括寫自定義的適應度計算器和約束條件。 Fenzo wiki 包含詳細的文檔來幫助大家開始學習Fenzo。