王鈺琪++竇偉超
摘要:為了提高可擴(kuò)展性,軟件定義網(wǎng)絡(luò)出現(xiàn)了多控制器架構(gòu)。但是多控制器架構(gòu)中數(shù)據(jù)交互的復(fù)雜性也在快速增加,某個(gè)控制器故障導(dǎo)致網(wǎng)絡(luò)不可用的情況時(shí)有發(fā)生。為了提高多控制器架構(gòu)下軟件定義網(wǎng)絡(luò)的服務(wù)可靠性,本文設(shè)計(jì)了一種多控制器失效備援方法,降低了現(xiàn)有多控制器架構(gòu)下提升網(wǎng)絡(luò)可靠性的技術(shù)的復(fù)雜性,同時(shí)減少了控制器之間狀態(tài)交互消息的數(shù)量,對(duì)提升網(wǎng)絡(luò)服務(wù)質(zhì)量,降低設(shè)備部署的成本和復(fù)雜性,保證網(wǎng)絡(luò)的高可用性方面具有極為重要的意義。
關(guān)鍵詞:軟件定義網(wǎng)絡(luò);多控制器;失效備援
中圖分類號(hào):TN-915
文獻(xiàn)標(biāo)識(shí)碼:A
DOI: 10.3969/j.issn.1003-6970.2016.01.017
本文著錄格式:王鈺琪,竇偉超.SDN網(wǎng)絡(luò)多控制器結(jié)構(gòu)的失效備援設(shè)計(jì)[J].軟件,2016,37 (01):71-75
O 引言
由于互聯(lián)網(wǎng)應(yīng)用的爆發(fā)式增長(zhǎng),全球信息量每年以指數(shù)級(jí)的速度增加;目前諸如路由器的數(shù)據(jù)轉(zhuǎn)發(fā)設(shè)備將控制平面和數(shù)據(jù)轉(zhuǎn)發(fā)平面耦合在一起,導(dǎo)致路由器要支持新功能所需要的升級(jí)成本和難度極大,安全性也不夠高,網(wǎng)絡(luò)需要一種新的結(jié)構(gòu)來(lái)增強(qiáng)可擴(kuò)展性和服務(wù)能力。SDN創(chuàng)造性的將控制平面的邏輯和轉(zhuǎn)發(fā)平面分離,SDN中分為兩種設(shè)備,交換機(jī)和控制器??刂破魍ㄟ^(guò)Openflow協(xié)議向交換機(jī)下發(fā)流表規(guī)則來(lái)控制交換機(jī)的轉(zhuǎn)發(fā)能力,交換機(jī)通過(guò)流表完成數(shù)據(jù)的轉(zhuǎn)發(fā)。SDN的核心在于轉(zhuǎn)發(fā)邏輯不再固化于硬件,所有的轉(zhuǎn)發(fā)邏輯都由控制器通過(guò)Openflow協(xié)議動(dòng)態(tài)下發(fā)至交換機(jī),交換機(jī)因此可以支持各種類型的規(guī)則,極大的增強(qiáng)了網(wǎng)絡(luò)的可擴(kuò)展性。
但是,現(xiàn)有的SDN分布式架構(gòu)同樣遇到一些挑戰(zhàn),控制平面的集中化使得控制器出現(xiàn)單點(diǎn)故障的危害性較大,同時(shí)單個(gè)控制器可支持的交換機(jī)數(shù)量有限,不能滿足網(wǎng)絡(luò)規(guī)模的不斷擴(kuò)展。為了解決這個(gè)問(wèn)題,SDN網(wǎng)絡(luò)出現(xiàn)了多控制器架構(gòu),現(xiàn)有的多控制器結(jié)構(gòu)中,每個(gè)控制器會(huì)控制一部分交換機(jī),這部分交換機(jī)作為此控制器管的一個(gè)域,各個(gè)控制器管控單獨(dú)的一個(gè)區(qū)域內(nèi)的交換機(jī)。如圖1所示,控制器之間交換控制信息達(dá)到全網(wǎng)數(shù)據(jù)包轉(zhuǎn)發(fā)和管理的目的。相鄰的交換機(jī)之間交換拓?fù)錉顟B(tài)、交換機(jī)信息等數(shù)據(jù),這樣使得整個(gè)網(wǎng)絡(luò)中任何兩個(gè)域的數(shù)據(jù)流量可以被轉(zhuǎn)發(fā)。同時(shí)這種結(jié)構(gòu)也解決了聚集式控制平面出現(xiàn)的低擴(kuò)展性和高負(fù)載的問(wèn)題。
但是這種架構(gòu)仍然沒(méi)有解決在某個(gè)控制器出現(xiàn)故障以后出現(xiàn)的網(wǎng)絡(luò)可靠性損失,當(dāng)某一個(gè)控制器出現(xiàn)故障之后,部分交換機(jī)會(huì)失去連接導(dǎo)致一些服務(wù)失效。為了最小化這種故障,必須要有一種快速反應(yīng)機(jī)制使失去連接的交換機(jī)與其他存活的控制器建立連接?,F(xiàn)有的基于多控制器提出扁平化架構(gòu)的失效備援解決方案中,各個(gè)控制器都維護(hù)全網(wǎng)絡(luò)的拓?fù)?,某一控制器失效不?huì)影響到網(wǎng)絡(luò)服務(wù)損失,但是此種方法使控制局部網(wǎng)絡(luò)的控制器維護(hù)全網(wǎng)拓?fù)?,單個(gè)控制器維護(hù)大量狀態(tài),負(fù)載過(guò)高導(dǎo)致性能下降。
l 相關(guān)研究工作
過(guò)去的幾年中,一些方法將軟件定義網(wǎng)絡(luò)中集中化的控制平面邏輯上分布在多個(gè)控制器上,同時(shí)也提出了控制器故障時(shí)的解決方案,但是這些方法都要在各個(gè)控制器之間產(chǎn)生大量控制消息的流量。如.Onix和HyperFlow。Onix作為作為一個(gè)分布式控制器,它基于扁平分布式控制器架構(gòu),通過(guò)網(wǎng)絡(luò)信息庫(kù)進(jìn)行管理。每個(gè)控制器都有各自獨(dú)立的信息庫(kù),并且各個(gè)控制器之間通過(guò)數(shù)據(jù)交互保持信息庫(kù)的一致性,可以實(shí)現(xiàn)控制器之間的數(shù)據(jù)同步和更新。HyperFlow允許部署多個(gè)控制器,并將這些控制器分布在網(wǎng)絡(luò)中的不同位置??刂破髦g物理上分離但是邏輯上集中。HyperFlow在某控制器失效時(shí),通過(guò)手動(dòng)配置的方法將失效控制器管理的交換機(jī)重新配置到新控制器上,保證了可用性。但是使用這種方法網(wǎng)絡(luò)管理員工作量較大而且耗時(shí)較長(zhǎng)。還有一種方法被提出,它在多控制器環(huán)境下能夠在一些環(huán)境下提升網(wǎng)絡(luò)可靠性,但是部署相對(duì)比較復(fù)雜。
上述的這些結(jié)構(gòu)和方法,每個(gè)控制器雖然掌握了全網(wǎng)狀態(tài)信息,但只能控制局部網(wǎng)絡(luò),造成了一定的資源浪費(fèi),同時(shí)一旦有一個(gè)控制器信息出現(xiàn)變更,就要向全部控制器傳輸更新消息,增加了網(wǎng)絡(luò)更新時(shí)控制器的整體負(fù)載。
為了解決多控制器場(chǎng)景下控制器失效導(dǎo)致網(wǎng)絡(luò)服務(wù)質(zhì)量降低的問(wèn)題,本文提出了一種軟件定義網(wǎng)絡(luò)中多控制器失效備援方法,將由于控制器故障而失去連接的交換機(jī)動(dòng)態(tài)切換到其他相鄰控制器上,能夠?qū)刂破魇Х磻?yīng)快速且保證全網(wǎng)的連接性。為此我們?cè)O(shè)計(jì)一個(gè)主控制器管控其他控制器,維持網(wǎng)絡(luò)全局信息,主控制器和其他控制器保持心跳,確保其他控制器正常工作。各個(gè)控制器向主控制器報(bào)告自己控制的交換機(jī)信息。當(dāng)某控制器失效時(shí),失去連接的交換機(jī)能夠向主控制器提出請(qǐng)求,主控制器選擇一個(gè)合適的控制器,保證各個(gè)控制器上交換機(jī)數(shù)量負(fù)載均衡。
2 失效備援機(jī)制
2.1 多控制器失效備援架構(gòu)
本文描述的失效備援機(jī)制的架構(gòu)如圖2所示,使用了層次化設(shè)計(jì),在最頂端設(shè)計(jì)一個(gè)主控制器。主控制器的主要作用是:(1)維持各個(gè)控制器的交換機(jī)連接信息(2)和各個(gè)控制器保持心跳,確認(rèn)控制器工作正常(3)在控制器故障時(shí),將失去連接的交換機(jī)動(dòng)態(tài)遷移到適合的存活控制器上。為了防止主控制器出現(xiàn)單點(diǎn)故障,我們需要對(duì)主控制器做一次熱備。
Fig.2 Failover mechanisms architecture
為了支持多控制器架構(gòu)下各個(gè)層面的控制器可以協(xié)同工作,各個(gè)單個(gè)域的控制器要將各自網(wǎng)絡(luò)的關(guān)鍵信息傳遞給主控制器,所謂的關(guān)鍵信息包括:
控制器所管控的交換機(jī)的ID和交換機(jī)連接拓?fù)?/p>
各個(gè)交換機(jī)上的流量負(fù)載情況
控制器相鄰的控制器的標(biāo)志和自身處理能力和負(fù)載
通過(guò)這些信息,當(dāng)某一個(gè)普通控制器出現(xiàn)故障以后,主控制器可以全面的考察其相鄰控制器的狀態(tài),包括流量負(fù)載,連接的交換機(jī)等數(shù)據(jù),從故障控制器相鄰的控制器中選出負(fù)載最低的一個(gè)作為故障交換機(jī)重新連接的目標(biāo)控制器。
為了統(tǒng)一處理層次間的消息,主控制和普通控制器利用Yang模型設(shè)計(jì)出抽象的數(shù)據(jù)傳輸接口和數(shù)據(jù)格式。Yang模型和工具就是實(shí)現(xiàn)XML字符信息和ODL內(nèi)部Bean Object之間的轉(zhuǎn)換,無(wú)論從可擴(kuò)展性、耦合、開發(fā)效率上都有優(yōu)勢(shì)。同時(shí)Yang模型采用安全的面向連接的通信傳輸方式,相比起SNMP采用UDP傳輸具有更加良好的安全性,且支持更大規(guī)模的數(shù)據(jù)傳輸。
通過(guò)Yang模型定義,通用的API運(yùn)行大量網(wǎng)絡(luò)業(yè)務(wù)傳輸數(shù)據(jù),特別是在多控制器架構(gòu)中,這些不同的普通控制器域可能是由不同的Openflow控制器,但是我們通過(guò)定義通用的接口,使得各種不同類型的Openflow控制器可以協(xié)同工作,減少因?yàn)檐浖煌斐傻募夹g(shù)障礙。我們將普通控制器發(fā)送給主控制器的消息中包括的數(shù)據(jù)利用Yang模型定義內(nèi)容如下:
在本文中,接口基于REST API設(shè)計(jì),實(shí)現(xiàn)數(shù)據(jù)的高速傳輸。主控制器維持其他控制器的交換機(jī)連接信息,為此主控制器內(nèi)維護(hù)一個(gè)交換機(jī)信息表,保存各個(gè)普通控制器的交換機(jī)連接信息,同時(shí)和其他控制器建立socket連接,傳遞最新的交換機(jī)信息。我們定義了一種數(shù)據(jù)格式,如圖3所示,普通控制器向主控制器發(fā)送各自的交換機(jī)連接信息,此消息中包括控制器名稱和交換機(jī)標(biāo)志,交換機(jī)標(biāo)志使用交換機(jī)硬件地址確保唯一性。此數(shù)據(jù)包分為ADD、DEL_ MOD、RESEND四種類型,ADD表示普通控制器向主控制器發(fā)送交換機(jī)信息增加的命令;DEL表示普通控制器向主控制器發(fā)送交換機(jī)信息刪除的命令;MOD表示普通控制器向主控制器發(fā)送交換機(jī)信息更新的命令,更新交換機(jī)所屬控制器,主控制器收到消息后相應(yīng)地更新交換機(jī)信息表;RESEND表示主控制器向普通控制器發(fā)送交換機(jī)信息重傳的命令,讓某控制器利用ADD消息重傳全部交換機(jī)信息。
主控制器和普通控制器之間保持心跳,每5秒鐘發(fā)送一次心跳報(bào)文,心跳報(bào)文用于主控制器確定普通控制器的存在,當(dāng)主控制器發(fā)送的報(bào)文1秒沒(méi)有收到回復(fù),則進(jìn)行重發(fā)動(dòng)作,當(dāng)重發(fā)次數(shù)達(dá)到5次則可以確定普通控制器已經(jīng)失去連接。我們?cè)谥骺刂破魃显O(shè)計(jì)失去連接表,表格會(huì)維護(hù)目前失去連接的控制器表,用于主控制器在收到交換機(jī)失去連接的消息時(shí)能夠決定是否此控制器已經(jīng)故障中斷。
SDN網(wǎng)絡(luò)可以通過(guò)幾種方法發(fā)現(xiàn)有控制器已經(jīng)出現(xiàn)故障:
主控制器和普通控制器之間的心跳
主控制器和每個(gè)控制器之間保持固定間隔的心跳,相互交換機(jī)信息,如果在一定時(shí)間段內(nèi)主控制器收不到某個(gè)普通控制器的心跳返回消息,則可以判斷此普通控制器故障。
交換機(jī)發(fā)出的連接決斷消息
當(dāng)某個(gè)控制器和交換機(jī)之間的連接中斷,交換機(jī)根據(jù)自身的反應(yīng)機(jī)制會(huì)自動(dòng)向主控制器發(fā)送故障控制器和交換機(jī)的信息,主控制器以此可以判斷故障情況。
2.2 0penflow中控制器的角色
在我們?cè)O(shè)計(jì)的分布式多控制器場(chǎng)景中,每個(gè)控制器對(duì)它自己域內(nèi)的控制器管理和控制(這些控制器將此控制器設(shè)置為Master角色)。為了達(dá)到控制器之間的切換,一個(gè)控制器需要能和交換機(jī)保持連接,同時(shí)能夠發(fā)送Role-Reque st消息來(lái)接管交換機(jī)的管理權(quán)。
根據(jù)Openflow協(xié)議的定義,每個(gè)交換機(jī)可以與多個(gè)控制器相連,與交換機(jī)相連的控制器的角色分為Master,Slave,Echo。角色為Master和Echo的控制器可以向交換機(jī)下發(fā)流表等控制消息,而角色為Echo的控制器只能獲取交換機(jī)信息。每個(gè)交換機(jī)只能設(shè)置一個(gè)控制器為Master角色。
利用多控制器的角色機(jī)制,處理控制器故障最簡(jiǎn)單的方法是為每個(gè)域設(shè)計(jì)一個(gè)備援控制器,但是此舉的配置代價(jià)和維護(hù)費(fèi)用也是極其昂貴的。我們?cè)俅侮U述的控制器失效備援機(jī)制中只需要對(duì)主控制器做一次主動(dòng)備援,其他控制器的故障都可以通過(guò)相鄰控制器的接管完成。
如圖4所示,在我們描述的失效備援架構(gòu)中,每個(gè)控制器負(fù)責(zé)的區(qū)域內(nèi)的交換機(jī)都將此控制器設(shè)置為Master角色,將主控制器設(shè)置為Echo角色,同時(shí)將其他相鄰的控制器設(shè)置為Slave角色。當(dāng)交換機(jī)失去連接時(shí),會(huì)主動(dòng)向主控制器發(fā)送失去連接消息,由主控制器決定哪一個(gè)普通控制器接管交換機(jī),接管的控制器會(huì)向交換機(jī)發(fā)送標(biāo)準(zhǔn)Openflow消息Role-Request消息成為此交換機(jī)的Master控制器,保證數(shù)據(jù)流影響盡可能小。
2.3 失效備援機(jī)制流程
整個(gè)備援機(jī)制的流程可以經(jīng)過(guò)如下幾個(gè)階段。
2.3.1 檢測(cè)到故障控制器的出現(xiàn)
這一步主要是通過(guò)主控制器和普通控制器之間的心跳消息以及交換機(jī)發(fā)送給主控制器的連接決斷消息來(lái)完成。如果主控制器和普通控制器之間的心跳中斷,或者主控制器收到交換機(jī)發(fā)送來(lái)的連接決斷消息,都會(huì)激發(fā)主控制對(duì)控制器故障的檢查流程。由于主控制器和某普通控制器的心跳中斷并不能直接說(shuō)明此普通控制器已經(jīng)故障,因?yàn)橛锌赡軆H僅是此普通控制器和主控制器之間網(wǎng)絡(luò)連接斷開等原因造成。主控制器會(huì)根據(jù)不同的情況做出不同的判斷,這部分的操作邏輻會(huì)在本文第3部分中詳細(xì)說(shuō)明。
2.3.2 檢測(cè)到故障控制器的出現(xiàn)
當(dāng)主控制器判斷某普通控制器出現(xiàn)故障時(shí),會(huì)通過(guò)故障控制器相鄰的控制器發(fā)送來(lái)的各自狀態(tài)信息,計(jì)算出一個(gè)合適的控制器,算法會(huì)考察相鄰控制器的交換機(jī)連接數(shù),數(shù)據(jù)流量負(fù)載等因素的權(quán)重,當(dāng)主控制器已經(jīng)決斷出一個(gè)普通控制器進(jìn)行接管時(shí),會(huì)要求此控制器發(fā)送Role-Request消息接管故障控制器的交換機(jī),完成交換機(jī)的動(dòng)態(tài)遷移。
2.3.3 域狀態(tài)更新
當(dāng)切換完成時(shí),主控制器需要獲取實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)信息,接管的普通控制器會(huì)將接收的交換機(jī)信息更新至主控制器的交換機(jī)連接表中,保證各個(gè)域內(nèi)的交換機(jī)信息保持實(shí)時(shí)一致。
3 故障情況分析
此場(chǎng)景如圖5所示,控制器B和控制器A和控制器C相鄰,控制器A、B、C各管理一塊交換機(jī)區(qū)域,并和主控制器保持連接和心跳??刂破鰾管理的交換機(jī)將主控制器設(shè)置為Echo角色,將與控制器B相鄰的交換機(jī)設(shè)置為Slave角色。
3.1 普通控制器故障
當(dāng)控制器B出現(xiàn)故障時(shí),控制器B所控制的交換機(jī)失去連接,同時(shí)主控制器根據(jù)心跳判斷出控制器B出現(xiàn)故障,這時(shí)會(huì)將控制器B加入失去連接的控制器表。此時(shí)失去連接的交換機(jī)會(huì)向主控制器發(fā)送連接決斷消息,此消息中包含交換機(jī)信息和控制器B的標(biāo)志。主控制器收到此消息后會(huì)先判斷控制器B是否在失去連接的控制器表中,如果在則根據(jù)交換機(jī)信息表中存儲(chǔ)的控制器B相鄰的控制器的流量負(fù)載以及交換機(jī)連接數(shù),進(jìn)行如下計(jì)算:
W=C*0.3+L*0.7
其中W標(biāo)示最終加權(quán)值,C表示控制器連接的交換機(jī)數(shù),L表示控制器上的負(fù)載流量。
對(duì)于控制器B相鄰的控制器都進(jìn)行一次加權(quán)計(jì)算,將W值最低的作為交換機(jī)的接管控制器,此時(shí)主控制器會(huì)命令權(quán)值最低的控制器向交換機(jī)發(fā)送Openflow的Role-Request消息,將角色變更為Master,接管此交換機(jī),同時(shí)此控制器向主控制器發(fā)送交換機(jī)信息MOD消息對(duì)交換機(jī)信息表更新。通過(guò)此處理,控制器B管控的交換機(jī)可以均勻的由控制器A和控制器C接管,保證網(wǎng)絡(luò)的負(fù)載均衡。
3.2 控制器B和交換機(jī)連接故障
此種情況下控制器B和某交換機(jī)連接故障,但是和主控制器之間保持心跳。此時(shí)交換機(jī)會(huì)向主控制器發(fā)送連接決斷消息,主控制器收到此消息后查找失去連接的控制器表失敗,則向交換機(jī)發(fā)送重新連接控制器B的命令,如果主控制器仍然收到此交換機(jī)發(fā)送的連接決斷消息,則可以判斷出控制器B和交換機(jī)連接故障,會(huì)根據(jù)上一小節(jié)所述方法選擇出一個(gè)合適的控制器接管此交換機(jī),同時(shí)利用交換機(jī)信息MOD消息更新交換機(jī)信息表。
3.3 控制器B和主控制器連接故障
此種情況下控制器B和主控制器連接故障,和交換機(jī)保持連接。此時(shí)主控制器會(huì)向管理員報(bào)警,當(dāng)網(wǎng)絡(luò)連接正常以后,會(huì)將交換機(jī)信息表中與控制器B相關(guān)的交換機(jī)信息刪除,同時(shí)發(fā)送RESEND消息讓控制器重新傳輸交換機(jī)信息。
4 實(shí)驗(yàn)驗(yàn)證
為了驗(yàn)證基于本文提出的多控制器場(chǎng)景下SDN網(wǎng)絡(luò)失效備援方法的有效性,本文對(duì)同現(xiàn)有的扁平結(jié)構(gòu)下失效備援機(jī)制做出數(shù)據(jù)上的對(duì)比,主要包括為保證可靠性所需要的狀態(tài)信息表的內(nèi)存大小和故障恢復(fù)時(shí)間。
首先是統(tǒng)計(jì)對(duì)比在不同數(shù)量的交換機(jī)場(chǎng)景下,上述兩種方法為了保證可靠性所需狀態(tài)信息表占用的內(nèi)存大小。統(tǒng)計(jì)此項(xiàng)數(shù)據(jù)通過(guò)在程序運(yùn)行時(shí)對(duì)狀態(tài)信息表分配內(nèi)存的數(shù)值存入log完成統(tǒng)計(jì)。對(duì)比數(shù)據(jù)如表2所示:
網(wǎng)絡(luò)從發(fā)生故障到故障切換完成會(huì)造成一定的網(wǎng)絡(luò)服務(wù)質(zhì)量降低,這一段時(shí)間越短,網(wǎng)絡(luò)服務(wù)質(zhì)量越高。為此,本文比較了現(xiàn)有扁平結(jié)構(gòu)的失效備援機(jī)制故障時(shí)間和本文所述備援機(jī)制的故障切換時(shí)間,此數(shù)據(jù)通過(guò)在檢查出故障到完成切換前后加入Linux定時(shí)器統(tǒng)計(jì)出故障切換時(shí)間。所得到實(shí)驗(yàn)數(shù)據(jù)如表3所示:
通過(guò)上述數(shù)據(jù)的對(duì)比,我們可以證明本文描述的層次式多控制器失效備援機(jī)制可以減小設(shè)置的狀態(tài)信息表大小,同時(shí)切換時(shí)間在交換機(jī)數(shù)量增加時(shí)增長(zhǎng)幅度較小,很好的提高了網(wǎng)絡(luò)服務(wù)質(zhì)量。
5 結(jié)論
本文描述了一種軟件定義網(wǎng)絡(luò)中多控制器場(chǎng)景下失效備援機(jī)制,此失效備援機(jī)制基于層次化設(shè)計(jì),減少各個(gè)控制器同步消息所用的帶寬,當(dāng)控制器故障發(fā)生時(shí),可以在盡量小的時(shí)間內(nèi)動(dòng)態(tài)恢復(fù)網(wǎng)絡(luò)連接,提升網(wǎng)絡(luò)故時(shí)的服務(wù)質(zhì)量;在此基礎(chǔ)上設(shè)計(jì)平衡選擇策略,使交換機(jī)連接負(fù)載最小的相鄰控制器,網(wǎng)絡(luò)流量和交換機(jī)連接均衡分配在各個(gè)控制器上,使現(xiàn)有網(wǎng)絡(luò)穩(wěn)定性較高。同時(shí)無(wú)需在各個(gè)控制器之間同步消息,使各個(gè)控制器僅僅維護(hù)局部網(wǎng)絡(luò)拓?fù)浜瓦B接信息,減少各個(gè)控制器不必要的負(fù)載。