異步做業調度系統(代號:Razer)爲網易視頻雲提供底層任務調度和資源管理服務,對非實時做業如視頻轉碼、視頻合成、文件轉換等進行分發,並按照用戶限額原則、資源最大利用原則對底層集羣資源進行支配和規劃。
爲了調度的高可用和調度的能力的水平擴展,Razer自己是一個調度集羣,將上層應用(app server)的做業分發到底層的執行服務器上(worker)。以下圖:算法
1、資源管理
Razer提供多維度的管理服務,包括服務管理(註冊、過時、探活、狀態通知)、用戶管理(增刪、用戶驗證)、任務的實時統計(worker維度、user維度)、資源監控、全局配置信息、及自身的HA。同時,還爲可視化運維平臺提供相應的RPC接口,提供實時的數據來源。
更加全面的統計能夠更好的感知集羣的負載情況,進行合理的容量規劃,以及更細粒度的追蹤做業的生命週期,便於運維等。
資源管理功能模塊以下圖所示:數據庫
核心模塊:
1)ClusterManager
負責服務節點的健康監測和狀態維護,若是有節點服務不可用,會通知其餘節點服務節點的變化狀況。
2)UserManager
負責對上層應用進行管理,並提供用戶粒度的統計信息。
3)JobTracker
對於可視化運維來講,最須要的數據就是實時的集羣運行負載,不一樣粒度下的job信息的統計以及job的追蹤。JobTracker負責跟蹤Job的生命週期中的各個事件,並負責懸掛job的檢查和處理。
2、分發調度
在公有云資源超售的背景下,Razer的分發必須保證必定的公平性,避免飢餓。
應用經過RPC向Razer發起離線任務調度的請求,經過一致性hash按用戶分區調度到不一樣的Razer節點上。Razer將接收的調度任務塞入不一樣用戶的有序隊列,Scheduler模塊根據用戶最大限額原則和公平原則,將不一樣用戶的隊列中的元素丟入分發器的內部隊列,最後由分發器Dispatcher將容許調度的任務分發到MQ中,由worker完成具體視頻處理任務。服務器
核心模塊:
1)Feeder
離線調度任務的生產者,任務能夠來自上層應用,也能夠來自數據庫中的積壓任務。從任務產生的策略上來分,能夠分爲GreedyFeeder和LazyFeeder。
LazyFeeder任務來自數據庫。當用戶隊列的job數小於必定數值時,會觸發LazyFeeder的填充動做。GreedyFeeder任務直接來自於應用,GreedyFeedy始終會主動嘗試feed job。
2)Schuduler
任務調度器,根據用戶最大限額原則和公平原則,封裝了razer異步調度的核心邏輯。
最大限額原則是指,調度到底層worker服務器上去執行的job數不會超過用戶的配額。
公平原則是指,每一個用戶被調度出去的job數的佔比越低,則其調度的優先級越高。
3)Dispatcher
任務分發模塊,負責將Job下發到底層Worker服務器。
Dispatcher對Job進行了進一步的封裝,每一個job會攜帶上一個job。若是任務分發失敗的緣由是底層沒有資源,或者發送超時,則上一個job可能並未發送成功,此時,並行分發轉變爲串行分發,保證做業的順利分發和執行。
4)UserView & GlobalView
UserView是用戶運行時信息,包括任務隊列,running等各類計數,是任務調度的依據。
GlobalView包含了全部UserView,維護全局運行時信息。
3、核心技術
1)基於快照的調度
GlobalView中保存着全部的UserView,是用戶運行時的一個全局視圖。用戶的統計數據是在時刻變化的,因此在調度做業的時候,會對全部可調度的UserView排序造成一個快照,在必定時間內,以快照的數據爲依據進行調度,並在超時後從新構建快照。
基於快照調度能夠解決飢餓問題,若是一個用戶的短任務很是多,若已時刻在變的數據做爲調度的依據,可能致使其餘用戶的任務一直沒法執行。
2)高可用
Razer支持水平擴展,經過一組調度服務器實現高可用。
應用能夠跨節點重試任務,保證任務的順利下發。
Razer在掛掉重啓後,也會recover自身積壓的任務。當某個節點宕機時,資源管理模塊會感知,並通知其餘節點,按照必定的算法指定一個節點take over。
3)負載均衡與配額
Razer經過用戶ID進行分區,不一樣的用戶落在不一樣的Razer服務器上。實現必定的負載均衡。並且,每一個用戶落在一個固定的分區,更加易於實現用戶配額的限制。app