Netflix使用Apache Mesos運行了一系列批處理、流式處理,以及服務類型的工作負載。兩年多來,我們創建了層出不窮的用例,例如實時異常檢測、批處理作業的訓練和模型構建、機器學習編排,以及基于Node.js的微服務。最近發布的Apache Mesos 1.0意味著這項技術已經成熟,相比我們首次使用該服務時已經有了巨大的改進。
我們最初使用Apache Mesos的動力主要在于該技術能夠將來自同一個EC2實例的資源更為細化地分配給不同規模的任務。如果不使用Mesos或其他類似的資源管理器,將無法為數量日益增加的實例進行更細化的分配,導致無法獲得令人滿意的利用率,或只能自行開發類似于Mesos的技術,至少也要開發出其中的部分功能。
越來越多的流式處理和批處理作業開始使用容器,這也推動了基于Mesos的資源調度技術的使用。最近開發者已經可以從基于Docker的容器通過Mesos集群獲得一系列服務類型的工作負載。本文將概括介紹Netflix工程團隊使用Apache Mesos打造的一些項目。我們將介紹該技術所滿足的不同用例,以及每個用例是如何高效使用這種技術的。有關每個項目的進一步細節請參閱下文給出的博文鏈接。
使用Apache Mesos打造云端原生調度機制為了從不同EC2實例為任務分配資源,我們需要一種能對可用資源進行調度,并能在分布式EC2實例上啟動和監控任務的資源管理器。Apache Mesos可將要使用集群的“框架”的資源分配,與框架任務的資源調度區分處理。當Mesos確定要將多少資源分配給框架后,將由框架的調度器決定在什么時候將哪些資源分配給哪個任務。這樣的調度器是一種相當簡單的API,因此也能更專注于調度邏輯,并對分布式系統中不可避免出現的故障做出回應。借此用戶可以針對不同用例編寫不同調度器,不像Mesos那樣為所有用例使用一個統一的調度器。下圖來自Mesos文檔,展示了“框架1”收到“代理1”的指令啟動兩個任務的過程。
一段時間來,Mesos社區已經出現了多種針對不同用例的調度器,并為用戶提供了相應的API。
Netflix在AWS EC2彈性云中運行了多個微服務。在原生云環境中運維Mesos集群要求我們必須確保除了與數據中心內部運維類似的任務外,調度器還能同時處理另外兩方面內容:運行任務的代理壽命更短暫,以及Mesos代理集群具備根據需求變化自動伸縮的能力。另外我們所處理的用例需要實現一種比First fit類型的分配更先進的資源調度機制。例如按照CPU、內存,以及網絡帶寬的用量將多個任務裝箱(Bin packing)到不同代理,借此實現資源碎片最小化。裝箱還可以幫助我們釋放盡可能多的代理,在不影響運行中任務的前提下終止空閑代理,讓代理集群的擴張速度放緩。
為找出現有調度器在此類能力方面的缺失,去年我們開發了一種名為Fenzo的調度庫。Fenzo可以根據需求自動縮放代理集群,并根據由健康標準(Fitness criteria)和約束組成的多種調度目標為任務分配資源。這些健康標準和約束可通過插件進行擴展,并具備少量內建的通用實現,例如為了實現高可用跨越EC2可用區對作業進行任務裝箱和分散。JVM上運行的任何Mesos框架都可使用Fenzo Java庫。
Netflix對Mesos的運用目前我們通過Apache Mesos集群運行了三個項目。
Mantis
Mantis是一種以原生云服務方式運行的反應式流處理平臺,主要側重于運維數據流的處理。Mantis包含多種不同用例,例如實時儀表盤、預警、異常檢測、衡量指標生成,以及流數據的即席交互式探索。我們使用Mantis主要是為了簡化團隊成員訪問實時事件和以此為基礎構建的計費應用程序的過程。目前Mantis的事件流處理能力已高達每秒800萬條事件,可不間斷運行數百個流處理作業。我們有一個此類作業主要側重于視頻內容的處理,可以針對內容提供細化的洞察,例如巴西地區iPad上播放紙牌屋第四季第一集時遇到了問題。這一功能需要不間斷追蹤數百萬不同的數據排列組合方式。
Mantis平臺包含一個主(Master)集群和一個代理(Agent)集群。用戶可以將流處理應用程序以作業的形式提交,并在代理集群內一個或多個工作進程(Worker)上運行。主集群會使用Apache Mesos中包含的Fenzo調度庫優化作業工作進程的資源分配。這種分配操作的目標之一在于將需要持續不間斷運行的流處理作業與只需要短時間運行的交互式作業分布到不同代理上,這樣當短時間運行的作業運行完畢后,即可收縮代理集群的規模。下圖展示了Mantis的體系結構。來自不同作業的工作進程可以通過基于Cgroups的資源隔離機制在同一個代理上運行。
Titus
Titus是一種Docker容器作業管理和執行平臺。最初Titus主要用于實現包含算法訓練(類似于視頻推薦、A/B測試單元體分析等任務)的批處理作業,以及需要每小時運行一次的即席報表和分析作業。最近為了提供一致的本地開發體驗以及實現更細化的資源管理,Titus開始為服務類型的作業(Netflix微服務)提供支持。Titus首個服務類型的用途是使用服務器端的NodeJS進行API的重構。
上述Titus體系結構示意圖展示了使用Fenzo從Mesos代理分配資源的主節點。Titus可與Netflix微服務和AWS生態系統實現緊密集成,包括與服務發現、基于軟件的負載平衡、監控,以及我們的CI/CD管線、Spinnaker等技術進行集成。在Mesos中編寫自定義執行器的能力使得我們能夠輕松地對容器運行時進行優化,使其與生態系統的其他部分更為匹配。
Meson
Meson是一種通用的工作流編排和調度框架,主要可用于管理機器學習管線。
Meson主要適用于對CPU、內存,以及磁盤空間等資源有著不同要求的作業所組成的異構環境。它可以支持通過一個共享集群運行Spark作業和其他批處理作業。在基于Cgroups的隔離機制幫助下,代理上的不同任務將使用相互隔離的資源運行。Meson的調度器會根據圖表(Graph)評估任務的就緒情況,并通過Mesos提供的資源啟動已經就緒的任務。失敗處理措施包括重新啟動失敗的任務,以及自動終止被確定為已經出錯的任務。
上述示意圖展示了Meson的體系結構。Meson團隊目前正在著手使用Fenzo調度庫增強其調度能力。
Apache Mesos的繼續完善在我們持續完善Mantis、Titus和Meson項目的過程中,Apache Mesos提供了穩定、可靠、可伸縮的資源管理平臺。我們通過開源的Fenzo以及在MesosCon大會上分享創意等方式參與到了Mesos的社區貢獻中。您可以在即將舉辦的MesosCon Europe 2016大會上與我們交流,或查看我們之前參與2014、2015年,以及今年上半年活動的總結(學到的經驗和Meson)。
對于這些項目,我們的未來計劃包括增加SLA(服務級別協議,例如為服務和批處理形式的作業提供不同的容量擔保),對代理和容器的安全加固,改善運維效率和能見度,以及對更廣泛用例的支持。為了取得更長足的進展,目前我們正在圍繞Mesos、Fenzo以及我們的框架開展一些非常激動人心的項目。
查看英文原文:Distributed Resource Scheduling with Apache Mesos
感謝陳興璐對本文的審校。