楊繼偉
(樂視云計(jì)算有限公司,北京 100025)
視頻云服務(wù)是基于云計(jì)算、大數(shù)據(jù)等技術(shù)提供視頻服務(wù)的網(wǎng)絡(luò)應(yīng)用模式。視頻云服務(wù)需要消耗大量的基礎(chǔ)設(shè)施資源,主要包括計(jì)算資源、存儲(chǔ)資源、網(wǎng)絡(luò)資源等[1]。基于視頻市場(chǎng)的海量需求,云計(jì)算廠商為企業(yè)用戶提供了便捷、低成本、高質(zhì)量的視頻云服務(wù),但隨著業(yè)務(wù)的發(fā)展,集群規(guī)模不斷擴(kuò)大,隨之也帶來很多問題,如集群管理、集群利用率偏低等[2],因此如何管理這些資源,如何合理并高效的使用這些資源,從而降低成本,是云計(jì)算廠商關(guān)心的一個(gè)主要問題。
在視頻云源站生產(chǎn)控制系統(tǒng)存在如下幾個(gè)問題:一是生產(chǎn)任務(wù)的獲取采用拉取模式,生產(chǎn)機(jī)器需要定時(shí)訪問生產(chǎn)控制系統(tǒng)來獲取任務(wù),當(dāng)沒有任務(wù)時(shí),機(jī)器仍然要訪問生產(chǎn)控制系統(tǒng),這造成了機(jī)器資源、網(wǎng)絡(luò)資源的浪費(fèi)。二是任務(wù)調(diào)度方式只是簡(jiǎn)單的區(qū)域調(diào)度,沒有考慮資源情況,調(diào)度不均勻,導(dǎo)致節(jié)點(diǎn)利用率不均衡。三是調(diào)度模塊與生產(chǎn)控制系統(tǒng)耦合在一起,隨著業(yè)務(wù)發(fā)展以及調(diào)度策略的復(fù)雜性,使得生產(chǎn)控制系統(tǒng)越來越臃腫。
為解決上述問題,提出視頻云源站的資源調(diào)度系統(tǒng),將調(diào)度功能與生產(chǎn)控制系統(tǒng)解耦,完成生產(chǎn)層機(jī)器的統(tǒng)一管理和動(dòng)態(tài)調(diào)度,均衡的使用機(jī)器資源,從而達(dá)到提高機(jī)器利用率的目的。
視頻云服務(wù)包括視頻生產(chǎn)和終端播放兩個(gè)環(huán)節(jié),如圖1所示。視頻云生產(chǎn)是指源站不同協(xié)議、不同碼率視頻的生產(chǎn)。在這些任務(wù)環(huán)節(jié)中,需要合理的為任務(wù)分配機(jī)器,如分配轉(zhuǎn)碼機(jī)進(jìn)行轉(zhuǎn)碼任務(wù)、分配RTMP服務(wù)器進(jìn)行推流或拉流,分配錄制機(jī)器對(duì)HLS切片進(jìn)行錄制等。
在云計(jì)算開源平臺(tái)中,具有資源管理與調(diào)度功能的軟件有OpenStack、Docker、Hadoop YARN。
OpenStack的作用是整合各種底層硬件資源對(duì)外提供虛擬機(jī)服務(wù)[3],它的調(diào)度功能主要是用來決策虛擬機(jī)創(chuàng)建在哪個(gè)主機(jī)上。生產(chǎn)層機(jī)器一般為物理機(jī),可以使用 OpenStack對(duì)物理機(jī)進(jìn)行管理,提供虛擬機(jī)來部署生產(chǎn)服務(wù)。如果虛擬機(jī)性能滿足點(diǎn)播、直播需求,那么替換掉物理機(jī)將大大提高機(jī)器利用率。
Docker是一個(gè)基于 Linux容器的高級(jí)容器引擎[4],可以快速實(shí)現(xiàn)服務(wù)器擴(kuò)容和自動(dòng)化部署。當(dāng)Docker技術(shù)應(yīng)用在視頻云源站服務(wù)中時(shí),如果每個(gè)容器實(shí)例執(zhí)行一個(gè)生產(chǎn)任務(wù),隨著任務(wù)數(shù)的增加容器實(shí)例也將不斷增多,與生產(chǎn)控制系統(tǒng)間交互的量級(jí)也將急劇增多,為系統(tǒng)帶來了負(fù)擔(dān)。如果每個(gè)容器仍然執(zhí)行多個(gè)生產(chǎn)任務(wù),這種方式需要由上層業(yè)務(wù)方來管理每個(gè)容器上可執(zhí)行的任務(wù)數(shù)量,還需要決策每個(gè)任務(wù)在哪個(gè)容器中執(zhí)行,因此需要搭建資源調(diào)度系統(tǒng)對(duì)容器IP進(jìn)行管理。

圖1 視頻云生產(chǎn)環(huán)節(jié)Fig.1 Production process of video cloud
Hadoop YARN[5]主要應(yīng)用在大數(shù)據(jù)領(lǐng)域,調(diào)度的實(shí)時(shí)性以及與業(yè)務(wù)系統(tǒng)交互方式的缺失,并不適合應(yīng)用在視頻云源站的資源調(diào)度中。
綜上所述,無論視頻云源站生產(chǎn)過程中使用的是物理機(jī)、虛擬機(jī)還是容器,都需要對(duì)其進(jìn)行管理,因此需要搭建視頻云源站的資源調(diào)度系統(tǒng)實(shí)現(xiàn)生產(chǎn)任務(wù)調(diào)度功能。
基于業(yè)務(wù)現(xiàn)狀,資源調(diào)度系統(tǒng)應(yīng)該滿足如下功能:
第一,由于資源復(fù)用,同一臺(tái)機(jī)器上每個(gè)服務(wù)可執(zhí)行的任務(wù)數(shù)是不相同的,因此需要進(jìn)行差別調(diào)度和管理。
第二,在特殊業(yè)務(wù)場(chǎng)景中,需要對(duì)機(jī)器調(diào)度進(jìn)行個(gè)性化配置,如將某個(gè)用戶的請(qǐng)求固定發(fā)送到某一臺(tái)機(jī)器上。
第三,需要返回當(dāng)前資源最優(yōu)的機(jī)器,例如當(dāng)需要轉(zhuǎn)碼時(shí),需要找到一臺(tái)資源最充足、離源站距離最近、網(wǎng)絡(luò)鏈路較好的機(jī)器來進(jìn)行轉(zhuǎn)碼。
由于需要對(duì)資源進(jìn)行管理和配置,同時(shí)還需要向業(yè)務(wù)方提供調(diào)度接口,因此資源調(diào)度系統(tǒng)的用戶有如下兩類:
(1)系統(tǒng)管理員。系統(tǒng)管理員是資源調(diào)度系統(tǒng)的使用者,可以管理生產(chǎn)環(huán)節(jié)用到的節(jié)點(diǎn)、機(jī)器等信息;可以為業(yè)務(wù)方分配資源池,設(shè)置資源使用權(quán)限;可以靈活配置資源調(diào)度策略,屏蔽某個(gè)機(jī)器的資源調(diào)度;可以實(shí)時(shí)監(jiān)控資源使用情況;對(duì)調(diào)度情況、資源情況進(jìn)行統(tǒng)計(jì)分析。
(2)業(yè)務(wù)方系統(tǒng)。業(yè)務(wù)方一般是點(diǎn)播、直播生產(chǎn)控制系統(tǒng),所以需要為其提供一個(gè)實(shí)時(shí)的、穩(wěn)定的資源調(diào)度接口。
考慮到系統(tǒng)的健壯性、模塊化、調(diào)度接口的性能以及便于管理,將系統(tǒng)設(shè)計(jì)分為兩個(gè)子系統(tǒng),一是資源管理子系統(tǒng),二是資源調(diào)度子系統(tǒng),系統(tǒng)架構(gòu)如圖2所示。
3.1.1 資源管理子系統(tǒng)
資源管理子系統(tǒng)為系統(tǒng)管理員提供各種資源創(chuàng)建和配置服務(wù),同時(shí)需要和外部數(shù)據(jù)平臺(tái)、報(bào)警系統(tǒng)交互。系統(tǒng)功能主要分為五個(gè)模塊。
(1)基礎(chǔ)數(shù)據(jù)管理
管理生產(chǎn)環(huán)節(jié)用到的機(jī)器、節(jié)點(diǎn)、網(wǎng)絡(luò)信息,以及國家、省份、城市、運(yùn)營商、IP庫等基本信息,對(duì)數(shù)據(jù)進(jìn)行修改和維護(hù)。
(2)資源池管理
主要用于業(yè)務(wù)資源池創(chuàng)建、資源分配、業(yè)務(wù)角色的配置和修改。將節(jié)點(diǎn)和機(jī)器劃分成不同的業(yè)務(wù)資源池,多個(gè)機(jī)器可以同時(shí)分配給不同的業(yè)務(wù)方。
(3)調(diào)度管理
資源調(diào)度子系統(tǒng)需要依賴基礎(chǔ)的調(diào)度配置實(shí)現(xiàn)調(diào)度功能,調(diào)度管理包括路由調(diào)度配置和定制調(diào)度配置。路由調(diào)度配置指配置節(jié)點(diǎn)間的調(diào)度方向,定制調(diào)度配置指根據(jù)用戶 ID、請(qǐng)求來源 IP、節(jié)點(diǎn) ID等進(jìn)行定向配置。
(4)資源監(jiān)控
指對(duì)資源池中的資源總量、利用率進(jìn)行監(jiān)控和預(yù)警,當(dāng)資源使用量超過某一閾值時(shí),與報(bào)警系統(tǒng)進(jìn)行交互,發(fā)送郵件、短信或電話報(bào)警。
(5)統(tǒng)計(jì)報(bào)表
提供各類統(tǒng)計(jì)報(bào)表,如資源利用率統(tǒng)計(jì)、機(jī)器資源利用率等。報(bào)表的數(shù)據(jù)來源主要是對(duì)資源池中的資源進(jìn)行定期采集,生成不同時(shí)間下的資源使用情況報(bào)表。
3.1.2 資源調(diào)度子系統(tǒng)

圖2 系統(tǒng)架構(gòu)設(shè)計(jì)Fig. 2 The design of system architecture
資源調(diào)度子系統(tǒng)主要是基于資源量、地域、運(yùn)營商等因素實(shí)現(xiàn)實(shí)時(shí)的動(dòng)態(tài)調(diào)度,為業(yè)務(wù)系統(tǒng)返回最優(yōu)的生產(chǎn)機(jī)器。業(yè)務(wù)方包括點(diǎn)播生產(chǎn)控制系統(tǒng)、直播生產(chǎn)控制系統(tǒng)、輪播生產(chǎn)控制系統(tǒng)等。資源調(diào)度子系統(tǒng)功能分為3個(gè)模塊。
(1)調(diào)度API
向業(yè)務(wù)系統(tǒng)提供資源調(diào)度接口,對(duì)業(yè)務(wù)方進(jìn)行身份認(rèn)證和接入鑒權(quán),系統(tǒng)提供的調(diào)度服務(wù)包括轉(zhuǎn)碼調(diào)度、流媒體生產(chǎn)調(diào)度、切片生產(chǎn)調(diào)度、錄制調(diào)度、截圖調(diào)度等。
(2)調(diào)度策略
資源調(diào)度是建立在調(diào)度模型基礎(chǔ)上,通過資源適配器,適配出合適的業(yè)務(wù)資源池,再根據(jù)不同的調(diào)度算法,如定制調(diào)度、路由調(diào)度、機(jī)器調(diào)度等查找合適的機(jī)器資源。
(3)三級(jí)存儲(chǔ)結(jié)構(gòu)
三級(jí)存儲(chǔ)結(jié)構(gòu)指數(shù)據(jù)庫、分布式緩存、內(nèi)存。資源調(diào)度子系統(tǒng)與資源管理子系統(tǒng)共用數(shù)據(jù)庫,管理子系統(tǒng)對(duì)數(shù)據(jù)進(jìn)行添加、修改后將數(shù)據(jù)保存到數(shù)據(jù)庫中等,調(diào)度子系統(tǒng)從數(shù)據(jù)庫中查詢數(shù)據(jù)。為了提高調(diào)度接口的響應(yīng)時(shí)間,減輕數(shù)據(jù)庫的壓力,調(diào)度子系統(tǒng)采用 Redis緩存資源量數(shù)據(jù),并進(jìn)行數(shù)據(jù)一致性處理;采用內(nèi)存存儲(chǔ)使用頻率高且不存在數(shù)據(jù)一致性問題的數(shù)據(jù),如調(diào)度策略的配置、節(jié)點(diǎn)基本信息、機(jī)器基本信息等。
業(yè)務(wù)系統(tǒng)、生產(chǎn)層與資源調(diào)度系統(tǒng)間的交互流程如圖3所示。具體流程如下:
(1)資源調(diào)度系統(tǒng)為業(yè)務(wù)系統(tǒng)預(yù)分配資源池,指定初始資源池大小。
(2)生產(chǎn)層機(jī)器定時(shí)向心跳平臺(tái)上報(bào)資源量、機(jī)器負(fù)載等信息。
(3)資源調(diào)度子系統(tǒng)訪問心跳平臺(tái)的接口,獲取機(jī)器資源量信息并將資源量保存到Redis緩存中。
(4)業(yè)務(wù)系統(tǒng)向資源調(diào)度子系統(tǒng)發(fā)起資源申請(qǐng)。
(5)資源調(diào)度子系統(tǒng)為業(yè)務(wù)匹配資源池,根據(jù)調(diào)度策略查找節(jié)點(diǎn)列表。
(6)資源調(diào)度子系統(tǒng)根據(jù)節(jié)點(diǎn)列表,從節(jié)點(diǎn)下查找滿足資源需求的最優(yōu)的機(jī)器,并對(duì)機(jī)器資源量進(jìn)行減法操作,更新到分布式緩存中。
(7)業(yè)務(wù)系統(tǒng)獲取到機(jī)器后,向生產(chǎn)層機(jī)器下發(fā)任務(wù),機(jī)器收到任務(wù)后執(zhí)行,同時(shí)機(jī)器上報(bào)本機(jī)的剩余資源至心跳平臺(tái)。
由于生產(chǎn)層機(jī)器會(huì)出現(xiàn)業(yè)務(wù)復(fù)用的情況,因此本文采用基于角色模式建立資源模型。在機(jī)房建設(shè)時(shí),每個(gè)機(jī)房是一個(gè)獨(dú)立的集群節(jié)點(diǎn),一個(gè)機(jī)房的機(jī)器會(huì)同時(shí)向多個(gè)業(yè)務(wù)提供服務(wù)。因此需要將同一機(jī)房的機(jī)器資源按照業(yè)務(wù)需求劃分為多個(gè)子節(jié)點(diǎn),每個(gè)子節(jié)點(diǎn)形成一個(gè)業(yè)務(wù)角色,最后將資源劃分為以角色為單位的資源池。資源模型如圖4所示。

圖3 系統(tǒng)架構(gòu)設(shè)計(jì)Fig.3 S ystem interaction process

圖4 資源模型Fig.4 Resouce model
角色資源池由不同節(jié)點(diǎn)的不同機(jī)器組成,一個(gè)角色可以包含多個(gè)機(jī)器,同一個(gè)機(jī)器也可以擁有多個(gè)角色。對(duì)于擁有多個(gè)角色的機(jī)器而言,角色之間共享硬件資源,但在業(yè)務(wù)上,角色之間是獨(dú)立的。一個(gè)業(yè)務(wù)資源池由多個(gè)角色資源池組成,一個(gè)角色資源只能屬于一個(gè)業(yè)務(wù)資源。資源類數(shù)據(jù)結(jié)構(gòu)及關(guān)系如圖5所示。
資源模型中,useful_count表示可用的資源量。以計(jì)算資源為例,CPU、IO等資源在資源調(diào)度時(shí)不能直接使用,需要轉(zhuǎn)換成可以計(jì)算的指標(biāo)。不同于虛擬機(jī)或容器的資源量化方式,本文使用一個(gè)整數(shù)值來表示該類機(jī)器的可用資源量。計(jì)算資源量化的方法是根據(jù)機(jī)器機(jī)型、CPU配置等信息得出最大可執(zhí)行任務(wù)數(shù)或代表機(jī)器計(jì)算能力,例如一臺(tái)轉(zhuǎn)碼機(jī)上可以并行執(zhí)行 12個(gè)轉(zhuǎn)碼任務(wù),12就表示該臺(tái)轉(zhuǎn)碼機(jī)的計(jì)算資源總量。存儲(chǔ)資源的量化是將磁盤容量作為機(jī)器資源總量,如存儲(chǔ)容量為 500 G。帶寬資源量化是將本機(jī)帶寬資源作為資源總量,如本機(jī)當(dāng)前帶寬為1000 Mbps。

圖5 資源數(shù)據(jù)結(jié)構(gòu)Fig.5 Res ource data structure
業(yè)務(wù)方在使用調(diào)度子系統(tǒng)的資源申請(qǐng)功能前,系統(tǒng)管理員必須要通過資源管理頁面給業(yè)務(wù)方系統(tǒng)創(chuàng)建資源池。創(chuàng)建成功后該資源池中的資源為 0,必須經(jīng)過資源分配,綁定節(jié)點(diǎn)和機(jī)器信息時(shí)該資源才可用。資源創(chuàng)建與分配流程如圖6所示。
為每一類資源分配節(jié)點(diǎn)以及節(jié)點(diǎn)下的機(jī)器資源,頁面功能如圖7所示。
例如在分配實(shí)時(shí)轉(zhuǎn)碼資源時(shí),先選擇節(jié)點(diǎn)類型為實(shí)時(shí)轉(zhuǎn)碼節(jié)點(diǎn),系統(tǒng)查出所有的實(shí)時(shí)轉(zhuǎn)碼節(jié)點(diǎn)后,勾選某一節(jié)點(diǎn),然后單擊對(duì)應(yīng)的“選擇機(jī)器”按鈕,系統(tǒng)查出該節(jié)點(diǎn)下的機(jī)器列表,勾選要分配的機(jī)器,提交表單,資源分配完成。
資源調(diào)度從整體上可以分為三步:
第一,節(jié)點(diǎn)調(diào)度,按照調(diào)度策略得到節(jié)點(diǎn)列表;
第二,角色調(diào)度,將節(jié)點(diǎn)列表與業(yè)務(wù)資源池相匹配,最后得到排序的角色列表。
第三,機(jī)器調(diào)度,遍歷角色列表,從中查找符合需求的最優(yōu)的機(jī)器。
資源調(diào)度整體工作流程如圖8所示。
具體步驟如下:
(1)對(duì)用戶申請(qǐng)的資源進(jìn)行適配,按申請(qǐng)的資源類別biz匹配資源池,得到資源ID。
(2)根據(jù)IP庫的數(shù)據(jù),解析用戶的請(qǐng)求IP,獲取用戶的歸屬地信息,包括國家、省份、城市、運(yùn)營商信息。
(3)采用定制調(diào)度查找節(jié)點(diǎn),查找成功則跳轉(zhuǎn)到(6),失敗跳轉(zhuǎn)到(4)。
(4)采用路由調(diào)度查找節(jié)點(diǎn),查找成功則跳轉(zhuǎn)到(6),失敗跳轉(zhuǎn)到(5)。
(5)采用經(jīng)緯度調(diào)度查找節(jié)點(diǎn),查找成功則跳轉(zhuǎn)到(6),失敗則返回未申請(qǐng)到資源。
(6)節(jié)點(diǎn)ID與資源ID相關(guān)聯(lián),得到角色I(xiàn)D。
(7)依次遍歷角色 ID,過濾掉不可用機(jī)器,將機(jī)器按照資源量排序,得到資源量最高的機(jī)器。
(8)對(duì)資源進(jìn)行減法操作,更新機(jī)器資源量緩存,返回機(jī)器IP。
4.4.1 節(jié)點(diǎn)路由調(diào)度模型
路由調(diào)度是將運(yùn)營商、地域和資源量3個(gè)因素作為篩選節(jié)點(diǎn)的條件,根據(jù)實(shí)際IDC機(jī)房的建設(shè)情況,可將節(jié)點(diǎn)按地域進(jìn)行分層劃分,全網(wǎng)節(jié)點(diǎn)可以看成是一個(gè)有向圖,如圖9所示。該模型主要應(yīng)用在節(jié)點(diǎn)機(jī)房較多的國家中。

圖6 資源分配流程Fig.6 Resour ce allocation process

圖7 資源分配頁面Fig.7 Resour ce allocation process

圖8 資源調(diào)度流程Fig.8 Re source schedule process

圖9 路由調(diào)度模型Fig.9 Routing scheduling model
路由調(diào)度模型的生成分成兩步:
首先生成世界地圖,由圖中的節(jié)點(diǎn)和直線箭頭組成。按照國家、省份、地市建立樹形結(jié)構(gòu),即每個(gè)國家用一棵樹表示,根節(jié)點(diǎn)是國家信息,第二層是省份或州信息,第三層是地市信息,第四層是葉子節(jié)點(diǎn),為該地區(qū)的機(jī)房信息。多個(gè)國家之間形成森林,以上形成一個(gè)四層的世界地圖結(jié)構(gòu)。
其次定義路由調(diào)度方向,即節(jié)點(diǎn)之間的調(diào)度方向,為圖中的弧形箭頭。系統(tǒng)維護(hù)調(diào)度路由表,該路由表采用地理上相鄰的國家、省份或州作為基礎(chǔ)數(shù)據(jù)。例如省份 A與省份B、C、D相鄰,則系統(tǒng)生成一條記錄,表示到達(dá)A省的請(qǐng)求可以往B、C、D調(diào)度。
(1)世界地圖
為了方便快速查找,Java中使用HashMap嵌套的結(jié)構(gòu)實(shí)現(xiàn)世界地圖的存儲(chǔ),HashMap實(shí)際上是鏈表散列,即數(shù)組和鏈表的結(jié)合體。數(shù)組中每一個(gè)元素包含一個(gè)key-value鍵值對(duì),此種模式在查找數(shù)據(jù)時(shí)時(shí)間復(fù)雜度為O(1),可以快速實(shí)現(xiàn)查找。Java中創(chuàng)建名稱為WORLD_MAP_NODE的數(shù)據(jù)結(jié)構(gòu),定義如下:
Map
初始化時(shí),首先生成國家Map結(jié)構(gòu),key為國家ID,value為該國家的所有省份Map結(jié)構(gòu);省份Map結(jié)構(gòu)中key為每個(gè)省份ID,value為該省份所有的城市 Map結(jié)構(gòu);依次類推,城市 Map中 key為城市ID,value為節(jié)點(diǎn)Map,節(jié)點(diǎn)Map中key為節(jié)點(diǎn)ID,value為機(jī)房節(jié)點(diǎn)信息。
(2)路由調(diào)度方向
如圖10所示,為路由調(diào)度方向的存儲(chǔ)結(jié)構(gòu),采用鄰接表實(shí)現(xiàn)。例如一共有5個(gè)節(jié)點(diǎn)P0、P1、P2、P3、P4。P0的鄰接點(diǎn)有P1,P1的鄰接點(diǎn)有P0、P2、P3、P4。圖中每個(gè)頂點(diǎn)的所有鄰接點(diǎn)構(gòu)成一個(gè)線性表。

圖10 路由調(diào)度方向存儲(chǔ)結(jié)構(gòu)Fig.10 Storage structure of routing scheduling direction
實(shí)現(xiàn)時(shí),每個(gè)頂點(diǎn)的所有鄰接點(diǎn)也采用HashMap嵌套的結(jié)構(gòu),不同層級(jí)的key值包括國家ID、省份ID,依次遞進(jìn)。Java中創(chuàng)建名稱ROUTE_SCHEDULE_RULE的數(shù)據(jù)結(jié)構(gòu)用來表示調(diào)度方向,定義如下:
Map
使用該數(shù)據(jù)結(jié)構(gòu),表示可以根據(jù)國家ID找到其擁有的省份ID,再根據(jù)省份ID可以找到可調(diào)度到的國家-省份列表。其中ScheduleTargetCountry元數(shù)據(jù)的結(jié)構(gòu)包含兩個(gè)字段,國家ID和省份ID。
4.4.2 節(jié)點(diǎn)經(jīng)緯度調(diào)度模型
由于世界上國家較多,而且不是所有國家都有機(jī)房節(jié)點(diǎn)信息,因此將存在節(jié)點(diǎn)信息的國家使用路由調(diào)度模型方式,沒有節(jié)點(diǎn)的國家使用經(jīng)緯度調(diào)度模型。
經(jīng)緯度調(diào)度是根據(jù)用戶所在地的經(jīng)緯度信息,與全網(wǎng)節(jié)點(diǎn)的經(jīng)緯度分別做差值,節(jié)點(diǎn)間距離最小的離用戶最近,視為較優(yōu)節(jié)點(diǎn)。與路由調(diào)度策略相比,該策略比較單一,但同時(shí)可以減少遍歷節(jié)點(diǎn)的次數(shù),提高查找效率。如圖11所示,為經(jīng)緯度調(diào)度模型。

圖11 經(jīng)緯度調(diào)度模型Fig.11 Schedule model of longitude and latitude
圖中A、B、C、D、E、F共6個(gè)節(jié)點(diǎn),如在A節(jié)點(diǎn),與其他5個(gè)節(jié)點(diǎn)的距離分別為s1、s2、s3、s4、s5,對(duì)這 5個(gè)距離按照從小到大排序,得出距離最小的節(jié)點(diǎn)。經(jīng)緯度模型在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)為:
Map
該結(jié)構(gòu)表示根據(jù)節(jié)點(diǎn)類型可以查找出所有節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)中配置了經(jīng)緯度信息。
4.5.1 IP查找算法
當(dāng)業(yè)務(wù)方傳遞了IP這個(gè)參數(shù)時(shí),調(diào)度系統(tǒng)需要根據(jù)IP庫中的信息,對(duì)參數(shù)IP進(jìn)行解析,得出IP所在的地域信息用來進(jìn)行路由調(diào)度。由于IP庫中存儲(chǔ)的是IP段所在的國家、省份、城市和運(yùn)營商信息,直接查找數(shù)據(jù)庫很難定位IP的地域信息,且調(diào)度接口需要滿足實(shí)時(shí)性,因此將IP庫數(shù)據(jù)加載到內(nèi)存中,在內(nèi)存中判斷IP的地域信息,并由定時(shí)任務(wù)每天定時(shí)更新IP庫到內(nèi)存。
IP庫在內(nèi)存中,采用List集合進(jìn)行存儲(chǔ),即數(shù)組結(jié)構(gòu)。每一條記錄包含了IP的起始地址段、結(jié)束地址段,起始地址長(zhǎng)整型,結(jié)束地址長(zhǎng)整型和地域歸屬信息。首先從數(shù)據(jù)庫查詢IP時(shí),按照起始地址長(zhǎng)整型從小到大排序,再保存到內(nèi)存中,即內(nèi)存中的數(shù)據(jù)是有序的。將請(qǐng)求來源IP轉(zhuǎn)換成長(zhǎng)整型,利用二分查找算法,定位IP所在的IP段信息,IP段信息的數(shù)據(jù)結(jié)構(gòu)包括IP歸屬國家ID、省份ID、運(yùn)營商ID。
使用二分查找IP歸屬信息算法如下:
(1)定義變量low=最小數(shù)下標(biāo),hign=最大數(shù)下標(biāo),mid為中間數(shù)下標(biāo);
(2)初始化low=0,hign=集合大小;
(3)while(low <= high)
(a)中間數(shù)下標(biāo)mid = (low + high)/2
(b)if ( Long IP >= 中間數(shù)List[mid])return 中間數(shù)
(c)else if (Long IP > 中間數(shù))
low = mid + 1
(d)else
high = mid – 1
二分查找代碼實(shí)現(xiàn)如圖12所示。
4.5.2 節(jié)點(diǎn)路由調(diào)度算法
路由調(diào)度算法流程分為四步:
第一步按照?qǐng)D的廣度優(yōu)先遍歷,遍歷所有節(jié)點(diǎn),按照相鄰省份之間的步長(zhǎng)對(duì)節(jié)點(diǎn)分組,相鄰省份間的步長(zhǎng)為1,當(dāng)前節(jié)點(diǎn)到其鄰省的鄰省步長(zhǎng)為2,依此類推。
第二步分別對(duì)步長(zhǎng)相同的節(jié)點(diǎn)按照運(yùn)營商進(jìn)行分組,相同運(yùn)營商的節(jié)點(diǎn)為一組,不同運(yùn)營商的節(jié)點(diǎn)為另外一組。
第三步對(duì)分組后的節(jié)點(diǎn)與業(yè)務(wù)資源ID關(guān)聯(lián),得到角色列表。
第四步對(duì)每一層的角色使用合并排序算法排序,最終得到排序的角色列表。

圖12 二分查找實(shí)現(xiàn)Fig.12 The implementation of Two point lookup
路由調(diào)度算法具體步驟如下:
(1)設(shè)請(qǐng)求所在地的省份為 P0,定義如下變量并初始化。
v:ScheduleTargetCountry數(shù)據(jù)對(duì)象,Q:待訪問的省份隊(duì)列,VisitQ:已訪問過的省份隊(duì)列,TempQ:臨時(shí)節(jié)點(diǎn)隊(duì)列,ReturnList:返回的節(jié)點(diǎn)集合,結(jié)構(gòu)為L(zhǎng)ist>。
其中隊(duì)列均采用鏈表 LinkedList結(jié)構(gòu),隊(duì)列中的元素為ScheduleTargetCountry數(shù)據(jù)對(duì)象,隊(duì)列Q的初值為請(qǐng)求所在地的ScheduleTargetCountry信息。
(2)while(隊(duì)列Q非空)
(3)隊(duì)列Q的隊(duì)頭元素出隊(duì),v入隊(duì)列VisitQ,根據(jù)國家 ID、省份 ID從 ROUTE_SCHEDULE_RULE結(jié)構(gòu)中獲取鄰接省份節(jié)點(diǎn),即可調(diào)度到的ScheduleTargetCountry列表,該列表與VisitQ比較,將v的未被訪問過的鄰接點(diǎn)列表入隊(duì)列Q,同時(shí)記錄v與P0的步長(zhǎng)。
(4)訪問省份v,從世界地圖中查找v的節(jié)點(diǎn)信息,如果v存在機(jī)器節(jié)點(diǎn)且節(jié)點(diǎn)滿足可用性等條件,則v的節(jié)點(diǎn)ID入隊(duì)列TempQ。否則重復(fù)步驟(2)、(3)、(4),直到全部省份被遍歷完。
(5)遍歷結(jié)束后,對(duì)TempQ按步長(zhǎng)分組,形成List>形式的數(shù)據(jù)結(jié)構(gòu)ReturnList。外層List表示步長(zhǎng)序號(hào),內(nèi)層List表示節(jié)點(diǎn)列表。
(6)按照運(yùn)營商對(duì)ReturnList分組,與用戶相同運(yùn)營商的節(jié)點(diǎn)為一組,其它為另一組,返回ReturnList。
通過以上步驟,得到分組后的節(jié)點(diǎn)如圖13所示:

圖13 節(jié)點(diǎn)路由調(diào)度分組Fig.13 Node routing scheduling group
4.5.3 節(jié)點(diǎn)經(jīng)緯度調(diào)度算法
經(jīng)緯度調(diào)度算法如下:
(1)系統(tǒng)保存所有節(jié)點(diǎn)所在省份的經(jīng)緯度信息。
(2)根據(jù)用戶所在省份信息,得出用戶的經(jīng)緯度。
(3)計(jì)算用戶所在地經(jīng)緯度與各節(jié)點(diǎn)的經(jīng)緯度的距離。
(4)根據(jù) Java中自帶的集合排序算法 Collections.sort,對(duì)所有距離排序,找出距離用戶最近的節(jié)點(diǎn)。
計(jì)算用戶所在地與各節(jié)點(diǎn)的距離,采用計(jì)算球面上任意兩點(diǎn)距離的方法。假設(shè)球面上兩點(diǎn)A、B,A點(diǎn)坐標(biāo)為A(j1, w1),B點(diǎn)坐標(biāo)為B(j2, w2),其中j1、w1、j2、w2是經(jīng)緯度信息。

圖14 球面距離模型Fig.14 S pherical distance model
球面距離公式如下:
L=R arccos (cosw1 cos w2 cos(j2-j1) + sin w1 sin w2
計(jì)算球面距離代碼實(shí)現(xiàn)如圖15所示。

圖15 球面距離實(shí)現(xiàn)Fig.15 The implementation of spherical distance
4.5.4 器調(diào)度算法
機(jī)器調(diào)度算法是根據(jù)角色信息查找該角色下的機(jī)器,返回資源量最高的機(jī)器,具體步驟如下:
(1)設(shè)用戶申請(qǐng)的資源量為 count,角色集合為L(zhǎng),大小為s,定義臨時(shí)變量i=0。
(2)遍歷角色,對(duì)角色下的機(jī)器按照資源總量從大到小排序
(3)while ( i < s)
(4)if(機(jī)器 L[i]的剩余資源>最小剩余閾值 and機(jī)器剩余資源>count),對(duì)該機(jī)器開啟 Redis事務(wù)。
(a)機(jī)器資源量減 count,更新緩存,如果更新成功,表示申請(qǐng)機(jī)器資源成功,接口返回機(jī)器IP。
(b)如果更新緩存失敗,對(duì)i加1,跳轉(zhuǎn)到步驟(3)。
(5)else資源不滿足,對(duì)i加 1,跳轉(zhuǎn)到步驟(3)。
在響應(yīng)業(yè)務(wù)方的申請(qǐng)資源請(qǐng)求或者調(diào)度子系統(tǒng)從心跳平臺(tái)查詢資源信息時(shí),都要更新調(diào)度子系統(tǒng)的 Redis緩存。資源調(diào)度在查找機(jī)器時(shí),需要根據(jù)角色I(xiàn)D先查找到機(jī)器信息,然后對(duì)緩存中該機(jī)器的資源量進(jìn)行更新,因此內(nèi)存中需要定義如下結(jié)構(gòu):
Map
該結(jié)構(gòu)表示某一角色下的機(jī)器 IP列表,其中BIZ_IP是業(yè)務(wù)類型和機(jī)器 IP的拼接,ServerCache存儲(chǔ)在緩存中,包括的字段如表1所示。

表1 名稱資源緩存數(shù)據(jù)結(jié)構(gòu)Tab.1 Data struct of resouce cache
當(dāng)申請(qǐng)資源進(jìn)行資源量扣除時(shí),對(duì)可用資源量字段進(jìn)行事務(wù)操作。Java中 Redis的事務(wù)操作通過以下步驟實(shí)現(xiàn):
(1)使用 Redis的 watch()方法對(duì)緩存中 key為BIZ_IP的字段進(jìn)行監(jiān)控。
(2)使用multi()方法開啟事務(wù)。
(3)使用 decrBy()方法將資源量減去申請(qǐng)的數(shù)值。
(4)使用exec()方法提交事務(wù),如果執(zhí)行成功,表示申請(qǐng)資源成功。否則申請(qǐng)失敗,返回。
測(cè)試的主要內(nèi)容是測(cè)試路由調(diào)度的準(zhǔn)確性和靈活性,即運(yùn)營商、省份區(qū)域和資源量對(duì)調(diào)度的影響。
測(cè)試環(huán)境服務(wù)器采用Linux系統(tǒng),8 G內(nèi)存,4核CPU,2.4 GHZ。Web容器采用Tomcat7.0,使用JDK1.7,Redis采用 3.2.9版本,Mysql采用 5.5版本,MongoDB采用3.0.3版本。
模擬多用戶并發(fā)請(qǐng)求資源調(diào)度接口,調(diào)度系統(tǒng)記錄請(qǐng)求日志,從日志中分析調(diào)度到的機(jī)器IP。測(cè)試前需預(yù)置數(shù)據(jù),提前創(chuàng)建多個(gè)資源節(jié)點(diǎn),如表 2所示。

表2 預(yù)置節(jié)點(diǎn)數(shù)據(jù)Tab.2 P repared node data
用戶請(qǐng)求來源可以分為兩類,一是節(jié)點(diǎn)中包含與用戶運(yùn)營商相同的節(jié)點(diǎn),二是節(jié)點(diǎn)中不包含與用戶運(yùn)營商相同的節(jié)點(diǎn),測(cè)試用例如表3所示。

表3 測(cè)試用例Tab.3 Te st case
(1)測(cè)試用例1
請(qǐng)求來源為杭州電信,調(diào)度的節(jié)點(diǎn)順序?yàn)闁|莞電信、長(zhǎng)沙聯(lián)通、北京聯(lián)通,調(diào)度到的IP順序如圖16所示,X軸為請(qǐng)求個(gè)數(shù),Y軸為IP序號(hào)。
(2)測(cè)試用例2
請(qǐng)求來源為安徽歌華有線,由于已知服務(wù)器的節(jié)點(diǎn)中沒有和請(qǐng)求所在地運(yùn)營商相同的節(jié)點(diǎn),且 3個(gè)節(jié)點(diǎn)距離請(qǐng)求所在地步長(zhǎng)都相同,因此節(jié)點(diǎn)調(diào)度只按照資源量進(jìn)行均勻調(diào)度,調(diào)度到的機(jī)器IP也是按照資源量均勻調(diào)度,如圖17所示,X軸為請(qǐng)求個(gè)數(shù),Y軸為IP序號(hào)。

圖16 相同運(yùn)營商請(qǐng)求Fig.16 The request from same ISP
測(cè)試結(jié)果表明:
(1)當(dāng)節(jié)點(diǎn)中包含與請(qǐng)求所在地運(yùn)營商相同的節(jié)點(diǎn)時(shí),會(huì)最先匹配相同運(yùn)營商節(jié)點(diǎn),其次按照距離從近到遠(yuǎn),即調(diào)度配置的臨省關(guān)系,依次匹配不同運(yùn)營商的節(jié)點(diǎn),最后按照資源量從大到小匹配節(jié)點(diǎn)。

圖17 不同運(yùn)營商請(qǐng)求Fig.17 The Request from different ISP
(2)當(dāng)節(jié)點(diǎn)中不包含與用戶運(yùn)營商相同的節(jié)點(diǎn)時(shí),只會(huì)按照距離從近到遠(yuǎn)、資源量從大到小匹配節(jié)點(diǎn)。
(3)無論哪類請(qǐng)求,當(dāng)某節(jié)點(diǎn)內(nèi)有多臺(tái)機(jī)器時(shí),該節(jié)點(diǎn)內(nèi)的機(jī)器資源是均衡使用的,保證了各個(gè)節(jié)點(diǎn)內(nèi)資源利用率的均衡。設(shè)置節(jié)點(diǎn)剩余資源量的最低閾值解決資源不均衡問題,同時(shí)防止節(jié)點(diǎn)被全部打滿。
資源管理問題一直是云計(jì)算廠商關(guān)心的主要問題,通過各種虛擬化、資源整合復(fù)用等技術(shù),提高機(jī)器資源利用率,降低企業(yè)成本。在未來云計(jì)算的資源管理還會(huì)投入更多的研究,使得各種資源進(jìn)行融合,發(fā)揮出巨大的價(jià)值。
本論文設(shè)計(jì)并實(shí)現(xiàn)了視頻云源站生產(chǎn)環(huán)節(jié)的資源調(diào)度系統(tǒng),系統(tǒng)整合了視頻云生產(chǎn)層的所有機(jī)器,使得之前零散的機(jī)器管理得到統(tǒng)一,方便后續(xù)的資源復(fù)用;系統(tǒng)提供了基于資源量、地域、運(yùn)營商的動(dòng)態(tài)調(diào)度算法,解決了原有系統(tǒng)中調(diào)度不準(zhǔn)確、不靈活的問題,提高了機(jī)器利用率,促進(jìn)了各生產(chǎn)環(huán)節(jié)交互的穩(wěn)定性。
通過實(shí)際的應(yīng)用,資源調(diào)度系統(tǒng)解決了原調(diào)度系統(tǒng)中調(diào)度不準(zhǔn)確、不靈活的問題,但同時(shí)也存在著不足:
(1)隨著任務(wù)逐漸增多,機(jī)器資源利用率也逐漸升高,在節(jié)點(diǎn)利用率達(dá)到較高值時(shí),每臺(tái)機(jī)器會(huì)產(chǎn)生一定的資源碎片不能被利用。
(2)節(jié)點(diǎn)間網(wǎng)絡(luò)鏈路情況也是影響調(diào)度的一個(gè)因素,當(dāng)按照距離和資源量進(jìn)行節(jié)點(diǎn)調(diào)度時(shí),會(huì)優(yōu)先打滿距離請(qǐng)求所在地最近的節(jié)點(diǎn),但此種方法在網(wǎng)絡(luò)鏈路好的情況下,節(jié)點(diǎn)間資源利用率出現(xiàn)了不均衡。由于資源池中資源一般較為充足,可以通過
[1] 陳國良, 明仲. 云計(jì)算工程[M]. 北京: 人民郵電出版社,2016: 160-183.
[2] 易觀智庫. 2016中國視頻云專題研究報(bào)告[R/OL].(2016-06-20). [2018-01-05]. http://www.useit.com.cn/thread-12482-1-1.html.
[3] 潘虎. 云計(jì)算理論與實(shí)踐[M]. 北京: 電子工業(yè)出版社,2016: 142-162.
[4] 劉志成, 林東升, 彭勇. 云計(jì)算技術(shù)與應(yīng)用基礎(chǔ)[M]. 北京:人民郵電出版社, 2017: 178-181.
[5] Arun C. Murthy, Vinod Kumar Vavilapalli. Hadoop YARN權(quán)威指南[M]. 羅韓梅,譯.第1版. 北京: 機(jī)械工業(yè)出版社,2015: 27-45.
[6] 武凱, 勾學(xué)榮, 朱永剛. 云計(jì)算資源管理淺析[J]. 軟件,2015, 36(2): 97-101.
[7] 李華清. 云計(jì)算技術(shù)及應(yīng)用服務(wù)模式探討[J]. 軟件, 2014,35(2): 127-128.
[8] 段忠祥. 基于云計(jì)算的網(wǎng)絡(luò)平臺(tái)共享資源模型的建設(shè)[J].軟件, 2013, 34(5): 119-121.
[9] 張棟梁, 譚永杰. 云計(jì)算中負(fù)載均衡優(yōu)化模型及算法研究[J]. 軟件, 2013, 34(8): 52-55.
[10] Ellis Horowitz, Sartaj Sahni, Sanguthevar Rajasekeran. 計(jì)算機(jī)算法[M]. 趙穎, 武永衛(wèi), 等譯. 2版. 北京: 清華大學(xué)出版社, 2015: 96-115, 219-225.