李松州,潘正高,辛政華,盧 彪
(宿州學(xué)院 信息工程學(xué)院,安徽 宿州 234000)
軟件定義網(wǎng)絡(luò)(Software Defined Network,SDN)是一種將控制平面和數(shù)據(jù)平面解耦的新型網(wǎng)絡(luò)架構(gòu),SDN帶來了可編程網(wǎng)絡(luò)和網(wǎng)絡(luò)研究的新趨勢[1].SDN架構(gòu)抽取一個邏輯集中的控制器,可以維護(hù)整個網(wǎng)絡(luò)的全局視圖,這使得控制器能夠做出比傳統(tǒng)網(wǎng)絡(luò)更好的路由決策.此外,控制平面通過OpenFlow協(xié)議控制數(shù)據(jù)平面中的交換機(jī),控制器計(jì)算流表下發(fā)給交換機(jī)用于轉(zhuǎn)發(fā)數(shù)據(jù)包,而交換機(jī)只需要根據(jù)接收到的流表項(xiàng)轉(zhuǎn)發(fā)數(shù)據(jù)包即可,具體架構(gòu)如圖1所示.SDN架構(gòu)中允許網(wǎng)絡(luò)開發(fā)人員在控制器上編寫部署應(yīng)用程序來控制網(wǎng)絡(luò),SDN將網(wǎng)絡(luò)智能集中到控制平面中,它增強(qiáng)了可編程性、靈活性和邏輯集中的智能化.但是,使用單個控制器缺乏可擴(kuò)展性和存在單點(diǎn)故障 (Single Point Of Failure,SPOF)問題.
近年來,提出的分布式SDN控制器架構(gòu)[2-3]已成為實(shí)現(xiàn)SDN更好擴(kuò)展性的解決方案.在這樣的架構(gòu)中,存在多個SDN控制器,每個SDN控制器負(fù)責(zé)控制網(wǎng)絡(luò)中的一部分交換機(jī)設(shè)備.由于魯棒性對于數(shù)據(jù)中心網(wǎng)絡(luò)很重要,因此SDN架構(gòu)仍然面臨一個關(guān)鍵挑戰(zhàn),即SDN控制器故障轉(zhuǎn)移問題[4].如果控制器崩潰,故障控制器管理的交換機(jī)將無法工作,則需要使用另一個控制器來接管其角色,并對交換機(jī)進(jìn)行控制,相關(guān)人員已經(jīng)提出了多種SDN控制器架構(gòu)來克服這一問題.
圖1 SDN架構(gòu)原理
為解決分布式SDN網(wǎng)絡(luò)中的控制器故障問題,近年來學(xué)者們提出了一些故障處理機(jī)制.Zhang等[5]提出了基于生存性模型的SDN控制器故障備份方法,設(shè)計(jì)了度量來估計(jì)多控制器網(wǎng)絡(luò)的生存能力,利用傳輸時延要求和定義的生存性度量,為SDN控制器設(shè)計(jì)合適的備份方法,其考慮了網(wǎng)絡(luò)延遲,以減少控制器故障帶來的損失.Muller等[6]提出了啟發(fā)式框架來定義備份控制器列表,該列表可以開發(fā)成兩個特定的啟發(fā)式,基于接近的啟發(fā)式嘗試選擇最近的控制器實(shí)例作為備份,而基于剩余容量的啟發(fā)式嘗試在選擇控制器實(shí)例時考慮資源消耗.兩種方法都可以為每個主控制器生成一個備份控制器列表.
Hsieh等[7]提出了基于模擬退火的高效故障轉(zhuǎn)移 (SAEF) 機(jī)制,作為應(yīng)用程序在全局控制器中運(yùn)行.SAEF使用多個全局控制器來檢測本地控制器故障,并計(jì)算交換機(jī)遷移計(jì)劃,重新進(jìn)行交換機(jī)和控制器關(guān)聯(lián),以恢復(fù)控制器故障.Yang等[8]提出了低錯誤率的故障檢測服務(wù)(FDLM)機(jī)制,使用修改后的 gossip協(xié)議進(jìn)行心跳消息傳輸和失敗識別,并由多個控制器來做出故障決策,重新選擇領(lǐng)導(dǎo)控制器,該方法定義了一個額外的狀態(tài)來報(bào)告對特定控制器的錯誤檢測,以實(shí)現(xiàn)低錯誤率,減少不必要的SDN控制器故障轉(zhuǎn)移.
Kuroki等[9]提出了角色管理服務(wù)器機(jī)制RMS,用于檢查每個控制器的CPU利用率,并請求其它控制器向未發(fā)布RMS利用請求的可疑控制器發(fā)送?;钕?如果超過一半的控制器接收到?;钕⒌幕貜?fù)消息,RMS將把該控制器視為一個健康控制器,否則認(rèn)為是一個故障控制器.Chan等[10]提出了快速控制器故障轉(zhuǎn)移機(jī)制FCF-M,該機(jī)制包括用于多個SDN控制器故障檢測的循環(huán)故障檢測機(jī)制.在這種機(jī)制中,所有控制器都被鏈接成一個圓圈,并且每個控制器使用自適應(yīng)超時來檢測前一個控制器的時間戳以進(jìn)行控制器故障檢測.當(dāng)一個或多個控制器超時發(fā)生故障時,剩余的控制器將接管其職責(zé),以實(shí)現(xiàn)交換機(jī)遷移.該方法僅使用一個檢測控制器進(jìn)行故障判定可能會在故障檢測期間增加假陽性率.
基于以上分析,本文提出了基于消息通知的SDN控制器故障處理機(jī)制FHMN,使用多個控制器檢測故障,以降低故障誤判率,通過遷移算法保證故障遷移后控制器負(fù)載的平衡,具有更好的可靠性.
在SDN網(wǎng)絡(luò)中提出了基于消息通知的SDN控制器故障處理機(jī)制FHMN,用于處理控制器故障問題,F(xiàn)HMN適用于分布式SDN控制器的架構(gòu),并作為控制器中的一部分運(yùn)行,具體包括負(fù)載測量組件、消息通知組件、故障檢測組件和故障遷移組件.各個組件相互協(xié)作共同完成控制器故障的檢測和轉(zhuǎn)移兩個主要任務(wù),具體架構(gòu)如圖2所示.
圖2 FHMN機(jī)制
本文使用負(fù)載測量組件統(tǒng)計(jì)控制器和交換機(jī)的負(fù)載.在SDN中,控制器用于對數(shù)據(jù)平面中的交換機(jī)進(jìn)行管理,負(fù)責(zé)處理交換機(jī)提交的Packet-in、Hello等消息.其中主要任務(wù)是處理Packet-in消息,用于計(jì)算流表下發(fā)給交換機(jī)來轉(zhuǎn)發(fā)數(shù)據(jù)包,而交換機(jī)只需要根據(jù)接收到的流表項(xiàng)轉(zhuǎn)發(fā)數(shù)據(jù)包即可,所以控制器的CPU、內(nèi)存等資源消耗主要是由于處理Packet-in造成的.因此,通過統(tǒng)計(jì)Packet-in消息的總到達(dá)速率來衡量控制器的負(fù)載情況,LP(Ci)表示Ci控制器的負(fù)載,另外將每個交換機(jī)提交Packet-in消息的速率作為每個交換機(jī)產(chǎn)生的負(fù)載壓力,記為LP(Sij),LSi={LP(Si1),LP(Si2)...LP(Sim)}表示控制器Ci下交換機(jī)負(fù)載的集合,按照負(fù)載大小降序排列,如公式(1)所示.
(1)
該組件用于控制器之間通信消息的發(fā)送,本文將控制器的角色分為全局控制器Cg和工作控制器Ci,全局控制器主要負(fù)責(zé)故障決策和遷移,工作控制器主要負(fù)責(zé)處理交換機(jī)的Packet-in等異步消息.
首先用IP地址表示每個控制器的ID,通過ID選擇出ID最小的控制器作為全局控制器,其余作為工作控制器.在正常工作期間,各個控制器每隔周期T,將向其它所有控制器發(fā)送心跳消息,用于告知其它控制器其工作正常,控制器將使用故障檢測組件來檢測控制器的故障.另外,為了便于控制器故障后交換機(jī)遷移計(jì)劃的制定,在全局控制器和工作控制器之間傳遞負(fù)載消息,消息通知組件的工作過程如圖3所示.
圖3 消息通知組件正常工作過程
根據(jù)控制器角色的不同,本文考慮以下兩種控制器故障情況.
(1)情況1:工作控制器故障檢測,控制器之間相互發(fā)送心跳消息,各個控制器會記錄每次接收其它控制器心跳消息的時間戳,將控制器Ck時間戳記為TSk,Tcurrent表示當(dāng)前時間.如果控制器Ci的當(dāng)前時間與最近一次接收控制器Ck心跳消息時間戳的差超過設(shè)定的故障超時閾值?,控制器Ci就將控制器Ck判定為故障懷疑對象,如公式2所示;然后向全局控制器Cg發(fā)送故障通知消息,全局控制器Cg會進(jìn)行故障統(tǒng)計(jì),當(dāng)收到所有控制器發(fā)送的故障通知消息,作出最終的故障決定并廣播故障確認(rèn)消息,則判定控制器Ck為故障控制器,標(biāo)記為Cf.然后啟動故障遷移組件將故障控制器下的交換機(jī)重新分配,具體工作過程如圖4所示.
圖4 工作控制器故障檢測過程
(2)
(2)情況2:全局控制器故障檢測,當(dāng)某個控制器Ci在時間差大于故障超時閾值?,仍未收到全局控制器Cg發(fā)送的心跳消息,則將全局控制器Cg判定為故障懷疑對象,然后將向剩余ID最小的控制器發(fā)送故障通知消息,當(dāng)它能夠收到所有故障通知時,則重新選擇該ID最小的為全局控制器,最后由新選擇的全局控制器Cg啟動故障遷移組件執(zhí)行故障轉(zhuǎn)移,具體控制過程如圖5和圖6所示.
圖5 全局控制器選擇
圖6 故障確認(rèn)
該組件只在全局控制器中被故障檢測組件調(diào)用時執(zhí)行,由于全局控制器與所有工作控制器互相發(fā)送負(fù)載消息,所以全局控制器擁有所有控制器和交換機(jī)的負(fù)載信息.因此,全局控制器Cg可以根據(jù)負(fù)載信息制定遷移計(jì)劃,將故障控制器下的交換機(jī)遷移到正常的工作控制器,從而完成故障的轉(zhuǎn)移.LP={LP(C1),LP(C2),…,LP(Cn)}表示所有控制器負(fù)載的集合,LSf={LP(Sf1),LP(Sf2),…,LP(Sfm)}表示故障控制器Cf下交換機(jī)負(fù)載的集合,并按照負(fù)載大小降序排列.故障遷移計(jì)劃如下:依次遍歷LSf集合,每次從中取出負(fù)載最大的交換機(jī),然后再從LP中找到負(fù)載最小的控制器作為接收控制器Ct(計(jì)算方法如公式(3)),并遷移到接收控制器Ct上,重復(fù)該過程,直到故障控制器下的交換機(jī)遷移完成.具體過程如算法1所示.
Ct=argCimin{LP(Ci)|i∈[1,n])}.
(3)
為了評估提出的FHMN故障處理機(jī)制,在Ubuntu14.04的Linux系統(tǒng)中搭建SDN測試平臺和其他必要工具.Mininet用來創(chuàng)建和模擬SDN網(wǎng)絡(luò),OpenvSwitch用于仿真運(yùn)行OpenFlowv1.3的交換機(jī),配置了16個交換機(jī).在方案中,分布式SDN控制平面是基于4個Floodlight控制器構(gòu)建的,在數(shù)據(jù)平面中,每4個OpenFlow交換機(jī)連接到一臺控制器作為Master角色來管理,提出的故障處理機(jī)制作為控制器的一部分運(yùn)行,以進(jìn)行故障檢測和處理.設(shè)置周期T=1s,故障超時閾值?為2T,使用hping3工具生成流量,用于將Packet-in數(shù)據(jù)包發(fā)送到控制器.
算法1. 故障遷移算法
本文在故障檢測的準(zhǔn)確性方面與FCF-M機(jī)制、RMS機(jī)制進(jìn)行了對比,并考慮了故障轉(zhuǎn)移后的負(fù)載平衡,實(shí)驗(yàn)證明本文方法更有利于提高控制器平面的可靠性和處理性能.
控制器負(fù)載的變化情況如圖7所示,在實(shí)驗(yàn)中關(guān)閉C1控制器模擬全局控制器故障,在未改變各交換機(jī)發(fā)送Packet-in速率的情況下,通過負(fù)載測量組件統(tǒng)計(jì)各控制器接收Packet-in速率的變化情況.當(dāng)時間達(dá)到6s時,C1發(fā)生故障后,其余控制器接收的Packet-in速率明顯增加,說明提出的故障處理機(jī)制能檢測到控制器故障,并進(jìn)行了故障轉(zhuǎn)移,將故障控制器C1下的交換機(jī)遷移到其余控制器.對比遷移前后各控制器負(fù)載,可知故障處理后各控制器的負(fù)載實(shí)現(xiàn)了更好的負(fù)載均衡效果.
圖7 控制器負(fù)載變化
3種故障檢測機(jī)制的誤判率變化情況如圖8所示,在相同的消息丟失情況下,提出的FHMN機(jī)制的故障誤判率明顯低于FCF-M和RMS機(jī)制,能夠有效降低故障的誤判,以免造成控制器資源的浪費(fèi)和不必要的交換機(jī)遷移.本文提出的FHMN機(jī)制在進(jìn)行故障檢測時,使用了未發(fā)生故障的所有控制器進(jìn)行故障判定,不易發(fā)生因?yàn)橄G失而造成的誤判,F(xiàn)CF-M僅通過前一個控制器判定,RMS使用一半以上的控制器進(jìn)行故障的判定.
圖8 故障檢測誤判率
本文提出了基于消息通知的控制器故障處理機(jī)制FHMN,它由控制器故障檢測和故障遷移組成.在控制器故障檢測中,控制器之間通過心跳消息互相監(jiān)測,并通知全局控制器,由全局控制器根據(jù)收集的故障通知做出最終的故障決斷,與相關(guān)機(jī)制相比,提高了故障檢測的可靠性,降低了故障的誤判率;同時在故障轉(zhuǎn)移中重新分配交換機(jī)和控制器之間的關(guān)系,考慮了故障轉(zhuǎn)移后控制器之間的負(fù)載均衡,有利于提高控制器平面的處理性能.