唐乙雙,胡 洋,向 偉
(中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041)
在傳統(tǒng)的互聯(lián)網(wǎng)(Internet Protocol,IP)網(wǎng)絡(luò)體系架構(gòu)中,作為核心設(shè)備的路由器包含路由決策和數(shù)據(jù)轉(zhuǎn)發(fā)等功能。隨著網(wǎng)絡(luò)規(guī)模的急劇膨脹,其結(jié)構(gòu)及其所承載的功能變得繁復(fù)不堪并且有越來越復(fù)雜的趨勢[1]。相對于互聯(lián)網(wǎng)通信協(xié)議第四版(Internet Protocol version 4,IPv4)網(wǎng)絡(luò),軟件定義網(wǎng)絡(luò)(Software Defined Network,SDN)技術(shù)的核心思想是實現(xiàn)網(wǎng)絡(luò)控制面和數(shù)據(jù)轉(zhuǎn)發(fā)面分離的架構(gòu),從而顯著減少了傳統(tǒng)網(wǎng)絡(luò)中路由器所承載的諸多大而全且復(fù)雜的功能。作為現(xiàn)今網(wǎng)絡(luò)通信技術(shù)領(lǐng)域的熱點技術(shù),SDN 被認(rèn)為代表著未來網(wǎng)絡(luò)通信技術(shù)的演進(jìn)發(fā)展方向。松耦合的邏輯控制和數(shù)據(jù)轉(zhuǎn)發(fā)、網(wǎng)絡(luò)狀態(tài)的集中控制、底層網(wǎng)絡(luò)設(shè)備對上層應(yīng)用透明、動態(tài)可編程[2]是其最重要也是SDN 最顯著的特點。
控制與轉(zhuǎn)發(fā)分離是SDN 網(wǎng)絡(luò)架構(gòu)的基本特征之一。SDN 控制器通過網(wǎng)絡(luò)配置交換機(jī),SDN 交換機(jī)通過網(wǎng)絡(luò)發(fā)送設(shè)備信息到控制器。網(wǎng)絡(luò)的穩(wěn)定性問題及SDN 交換機(jī)具體實現(xiàn)的差異性,會導(dǎo)致SDN 控制器與SDN 交換機(jī)之間出現(xiàn)數(shù)據(jù)不一致的問題,甚至?xí)霈F(xiàn)SDN 交換機(jī)配置出錯但是控制器卻一無所知的情況。如何保證控制器與交換機(jī)之間的數(shù)據(jù)一致性是構(gòu)建高可靠、高自愈SDN 網(wǎng)絡(luò)的關(guān)鍵。針對控制器與交換機(jī)之間數(shù)據(jù)一致性問題,在目前大多數(shù)控制器開源框架,如FloodLight、OpenDaylight 等,均專注于核心業(yè)務(wù),極少考慮到實際應(yīng)用中由于各種原因?qū)е碌目刂破髋c網(wǎng)絡(luò)設(shè)備間數(shù)據(jù)不同步的問題。商用的控制器產(chǎn)品雖然具備維護(hù)配置數(shù)據(jù)一致性的相關(guān)功能,但大部分僅支持手動配置維護(hù),自動化程度較低,且在進(jìn)行數(shù)據(jù)查詢時通常才采用一次性拉取方式。該方式在交換機(jī)需要同步海量數(shù)據(jù)時,顯得有些力不從心。
因此,在高安全可靠的SDN 控制器的設(shè)計中,本文提出一種基于數(shù)據(jù)快照的南向數(shù)據(jù)對賬技術(shù),通過該技術(shù),控制器通過定時數(shù)據(jù)快照比對的方式,基于優(yōu)先級、數(shù)據(jù)管理權(quán)限等完成交換機(jī)與控制器之間的數(shù)據(jù)對賬,發(fā)現(xiàn)并糾正出現(xiàn)的差錯。此外,針對控制器與交換機(jī)的數(shù)據(jù)對賬需求,本文通過借鑒用于存儲網(wǎng)絡(luò)中軟故障恢復(fù)的快照技術(shù)[3],從數(shù)據(jù)建模、數(shù)據(jù)拉取、數(shù)據(jù)比對3 個方面出發(fā),設(shè)計一種基于數(shù)據(jù)快照的高可靠南向?qū)~系統(tǒng)。利用該系統(tǒng),控制器可以避免直接從海量數(shù)據(jù)中提取有用信息,而是使用定時數(shù)據(jù)快照比對的方式完成交換機(jī)與控制器之間的數(shù)據(jù)對賬,發(fā)現(xiàn)并糾正出現(xiàn)的差錯,極大提高了數(shù)據(jù)對賬的效率。
基于數(shù)據(jù)快照的南向數(shù)據(jù)對賬系統(tǒng)在設(shè)計上應(yīng)與控制器整體框架保持一致,并將整個設(shè)計融入到SDN 控制器整體框架中,細(xì)化自動化配置數(shù)據(jù)一致性功能的業(yè)務(wù)邏輯,由此得到系統(tǒng)的總體架構(gòu)如圖1 所示。
圖1 系統(tǒng)結(jié)構(gòu)
圖1 展示的系統(tǒng)結(jié)構(gòu)是根據(jù)軟件工程中分層框架設(shè)計原則設(shè)計的?;跀?shù)據(jù)快照的南向數(shù)據(jù)對賬系統(tǒng)的總體架構(gòu)分為北向接口層、控制層以及南向接口層。
北向接口層為網(wǎng)絡(luò)管理員提供自動對賬和日志管理接口。其中,自動對賬接口為網(wǎng)絡(luò)管理員提供對賬管理的控制接口;日志管理接口主要負(fù)責(zé)向網(wǎng)絡(luò)管理員展示數(shù)據(jù)對賬服務(wù)的運維狀態(tài)和輸出結(jié)果。
控制層主要根據(jù)網(wǎng)絡(luò)管理員設(shè)置的抽樣比例周期性地調(diào)用數(shù)據(jù)對賬服務(wù)對一定數(shù)量的網(wǎng)絡(luò)設(shè)備進(jìn)行配置一致性維護(hù)。
控制層提供的數(shù)據(jù)對賬服務(wù)是整個數(shù)據(jù)對賬系統(tǒng)的邏輯主體,主要負(fù)責(zé)根據(jù)抽樣比例自動地選取控制器所管控的網(wǎng)絡(luò)設(shè)備進(jìn)行配置數(shù)據(jù)一致性的維護(hù)工作。在數(shù)據(jù)對賬服務(wù)中,數(shù)據(jù)修復(fù)與數(shù)據(jù)比對模塊是實現(xiàn)數(shù)據(jù)自動對賬功能的基礎(chǔ),對賬管理、對賬設(shè)備選取與對賬權(quán)重維護(hù)模塊則負(fù)責(zé)制定數(shù)據(jù)對賬服務(wù)的依據(jù)。
南向接口層主要為數(shù)據(jù)對賬服務(wù)提供設(shè)備的維護(hù)和管理功能。其中設(shè)備通信模塊除作為數(shù)據(jù)對賬服務(wù)實現(xiàn)設(shè)備對賬管理的渠道外,也是控制器其他功能模塊賴以控制管理網(wǎng)絡(luò)設(shè)備的基礎(chǔ),這里本文僅需要利用控制器已有的設(shè)備通信模塊的完成網(wǎng)絡(luò)設(shè)備參數(shù)的查詢和設(shè)置,無需進(jìn)行特殊改造。數(shù)據(jù)拉取模塊負(fù)責(zé)周期性獲取網(wǎng)絡(luò)設(shè)備的實時配置參數(shù),是實現(xiàn)數(shù)據(jù)對賬服務(wù)完成數(shù)據(jù)比對的依據(jù)。
在南向數(shù)據(jù)對賬系統(tǒng)的3 層結(jié)構(gòu)中,控制層與南向接口層是實現(xiàn)數(shù)據(jù)對賬系統(tǒng)的核心部分,下文將展開具體介紹。
南向接口層是數(shù)據(jù)對賬服務(wù)實現(xiàn)配置數(shù)據(jù)一致性的通道,數(shù)據(jù)對賬系統(tǒng)不僅需要利用設(shè)備通信單模塊來實現(xiàn)設(shè)備的參數(shù)查詢和配置,還需要通過數(shù)據(jù)拉取模塊來獲取實時的網(wǎng)絡(luò)設(shè)備配置數(shù)據(jù)。
1.2.1 設(shè)備通信模塊
設(shè)備通信模塊是控制器對底層網(wǎng)絡(luò)設(shè)備進(jìn)行集中管控的橋梁,該模塊提供了各種南向協(xié)議如OpenFlow、網(wǎng)絡(luò)配置(Network Configuration,NETCONF)等。每個被管控的網(wǎng)絡(luò)設(shè)備通信在設(shè)備通信模塊內(nèi)部都存在一個唯一的映射,每個映射對象都維護(hù)著一個與對應(yīng)設(shè)備建立的南向協(xié)議會話,該會話負(fù)責(zé)控制器與網(wǎng)絡(luò)設(shè)備間的數(shù)據(jù)交互。本文所設(shè)計的數(shù)據(jù)對賬服務(wù)主要利用NETCONF[4]協(xié)議完成與網(wǎng)絡(luò)設(shè)備的信息交互。
1.2.2 數(shù)據(jù)拉取模塊
數(shù)據(jù)拉取模塊負(fù)責(zé)為數(shù)據(jù)比對提供數(shù)據(jù)源。數(shù)據(jù)拉取模塊負(fù)責(zé)利用NETCONF 協(xié)議進(jìn)行基于YANG 的數(shù)據(jù)建模,是針對NETCONF 訪問的數(shù)據(jù)建模語言,它可以描述各種操作、數(shù)據(jù)、以及通知進(jìn)行建模,具有良好的可讀性和可擴(kuò)展性。根據(jù)需要,通過YANG 語言對控制器內(nèi)所要對賬的數(shù)據(jù)進(jìn)行建模,包括流表與業(yè)務(wù)配置??刂破鲾?shù)據(jù)庫在設(shè)計上分為Config datastore 與Running datastore[5]。Config datastore 用于保存控制器各功能模塊成功向網(wǎng)絡(luò)設(shè)備下發(fā)的配置數(shù)據(jù),Running datastore 用于從設(shè)備拉取回來的數(shù)據(jù)保存,用于作為數(shù)據(jù)比對時配置獲取的數(shù)據(jù)源。需要注意的是,設(shè)備的表項內(nèi)部會攜帶狀態(tài)數(shù)據(jù),比如統(tǒng)計、狀態(tài)等,這些數(shù)據(jù)會在建模時與配置數(shù)據(jù)一起定義,在數(shù)據(jù)拉取的時候狀態(tài)數(shù)據(jù)會被一同拉取回來,但是比對的時候不需要考慮狀態(tài)數(shù)據(jù),狀態(tài)數(shù)據(jù)的拉取可用于應(yīng)用層面需要狀態(tài)同步的情形。
數(shù)據(jù)拉取模塊在進(jìn)行數(shù)據(jù)拉取前需要對業(yè)務(wù)數(shù)據(jù)進(jìn)行分類,每一類數(shù)據(jù)是一個datastore,比如Openflow 流表是一類,interface 配置是一類,路由表是一類,標(biāo)簽交換路徑(Label Switched Path,LSP)是一類等等。業(yè)務(wù)數(shù)據(jù)分類后,在設(shè)計業(yè)務(wù)數(shù)據(jù)的時候,需要為每一條業(yè)務(wù)數(shù)據(jù)加Index 標(biāo)簽定義,用于全局唯一標(biāo)識該數(shù)據(jù)表項。比如流表的標(biāo)簽是標(biāo)準(zhǔn)定義的,路由的標(biāo)簽或者LSP 的標(biāo)簽可以自己定義。
交換機(jī)內(nèi)的表項數(shù)據(jù)有時候規(guī)模非常大,比如流表可能達(dá)到上百KB 的級別,這么多表項如果一次同步拉取,一方面將影響控制器的性能,另一方面也會影響設(shè)備的管理性能。為此,本文將數(shù)據(jù)在分類的基礎(chǔ)上再分塊(Data Block),數(shù)據(jù)塊的大小可調(diào)節(jié),默認(rèn)一個塊的數(shù)據(jù)是2 000 條。數(shù)據(jù)分塊之后,控制器向交換機(jī)拉取數(shù)據(jù)的時候,每次最多拉取一個塊的數(shù)據(jù)。由于數(shù)據(jù)存在標(biāo)簽,控制器知道上次拉取的位置,所以下次就從新的標(biāo)簽處開始拉取,具體流程如圖2 所示。
圖2 數(shù)據(jù)拉取流程
控制層是南向數(shù)據(jù)對賬系統(tǒng)的邏輯主體,包括對賬管理、對賬設(shè)備選取、對賬權(quán)重維護(hù)、數(shù)據(jù)比對與數(shù)據(jù)修復(fù)5 個功能模塊。
1.3.1 對賬管理模塊
對賬管理模塊根據(jù)網(wǎng)絡(luò)管理員設(shè)定的時間周期定時地抽樣選取網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)比對工作。對賬管理模塊在初始化時會激活該模塊的守護(hù)進(jìn)程,該進(jìn)程將周期性地調(diào)用對賬設(shè)備選取模塊提供的服務(wù),并根據(jù)選取結(jié)果完成指定設(shè)備的數(shù)據(jù)比對工作。待數(shù)據(jù)比對工作執(zhí)行完畢后,對賬管理模塊將會調(diào)用北向接口層的日志管理接口記錄比對結(jié)果。
1.3.2 對賬設(shè)備選取模塊
考慮到網(wǎng)絡(luò)規(guī)模較大,網(wǎng)絡(luò)節(jié)點較多時,一次性遍歷所有設(shè)備將會占用大量的網(wǎng)絡(luò)和計算資源,極大降低了控制器性能,因此需要增加對賬設(shè)備選取模塊來提高數(shù)據(jù)對賬的效率。對賬設(shè)備選取模塊通過調(diào)用對賬權(quán)重維護(hù)模塊抽樣選出對賬權(quán)重大的網(wǎng)絡(luò)設(shè)備,并將選出的網(wǎng)絡(luò)設(shè)備交給數(shù)據(jù)比對模塊,完成這些設(shè)備的數(shù)據(jù)對賬工作。對于數(shù)據(jù)比對模塊所返回的對賬結(jié)果,對賬設(shè)備選取模塊除了將比對結(jié)果傳遞對賬管理模塊外,還需要將結(jié)果信息作為下次對賬權(quán)重維護(hù)模塊進(jìn)行對賬權(quán)重調(diào)整的依據(jù)。一般而言,數(shù)據(jù)對賬的工作量級會隨著抽樣比例的增大而增加,網(wǎng)絡(luò)管理員可以根據(jù)控制器性能對賬靈活調(diào)整對賬管理任務(wù)的工作量級。
1.3.3 對賬權(quán)重維護(hù)模塊
該模塊主要負(fù)責(zé)為控制器在管的所有網(wǎng)絡(luò)設(shè)備設(shè)定對賬權(quán)重,使對賬設(shè)備選取模塊可以快速且具有針對性地選出將要進(jìn)行數(shù)據(jù)對賬的網(wǎng)絡(luò)設(shè)備。對賬權(quán)重維護(hù)模塊開始運行時會查詢所有網(wǎng)絡(luò)設(shè)備的設(shè)備ID 并為每個設(shè)備交換機(jī)分配一個初始權(quán)重,這個權(quán)重會根據(jù)隨著選取情況及后續(xù)對賬結(jié)果進(jìn)行動態(tài)調(diào)整。對于上次選出且對賬成功的設(shè)備,在本次次選取時應(yīng)降低其對應(yīng)的權(quán)重值;對于在上次選出且對賬結(jié)果異常的設(shè)備,對賬權(quán)重維護(hù)模塊則應(yīng)該提高異常設(shè)備的對賬權(quán)重,確保其能夠在下一次數(shù)據(jù)對賬任務(wù)中被再次選中。另外,對賬權(quán)重也與上次選中進(jìn)行數(shù)據(jù)對賬的時間差成正比,假設(shè)第i次設(shè)備對賬權(quán)重W(si),第i-1 次設(shè)備對賬權(quán)重為W(si-1)。W(si)具體計算公式為:
式中:θ表示調(diào)節(jié)系數(shù);Δt表示本次計算距設(shè)備上次選中的時間差;ri-1表示上次設(shè)備對賬結(jié)果,一共有3 種取值,ri-1=1 時表示對賬成功,ri-1=-1 時表示對賬失敗,其他情況下ri-1=0。
由上述公式計算出的對賬權(quán)重來進(jìn)行設(shè)備選擇,權(quán)重越高表示設(shè)備優(yōu)先級越高。
1.3.4 數(shù)據(jù)修復(fù)模塊
數(shù)據(jù)比對完成后,對于存在異常配置的網(wǎng)絡(luò)設(shè)備,數(shù)據(jù)比對模塊會通知數(shù)據(jù)修復(fù)模塊進(jìn)行配置修復(fù)。數(shù)據(jù)修復(fù)模塊在接到命令后會根據(jù)比對結(jié)果生成對應(yīng)的策略,對網(wǎng)絡(luò)設(shè)備內(nèi)缺少的數(shù)據(jù),需要生成相應(yīng)策略補全對應(yīng)的設(shè)備參數(shù),對于多出來的數(shù)據(jù),同樣需要生成對應(yīng)策略,以便刪除掉這些配置。最后利用設(shè)備通信模塊完成對網(wǎng)絡(luò)設(shè)備配置數(shù)據(jù)的修復(fù),并將設(shè)備側(cè)返回的執(zhí)行結(jié)果加以解析和整理,返回處理結(jié)果給數(shù)據(jù)比對模塊。
1.3.5 數(shù)據(jù)比對模塊
數(shù)據(jù)比對模塊是整個南向數(shù)據(jù)對賬系統(tǒng)的核心模塊,主要負(fù)責(zé)對控制器與其所管控的網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)一致性檢查。數(shù)據(jù)比對模塊執(zhí)行時,需要根據(jù)設(shè)備ID 從Running Datastore 和Config Datastore 中提取對賬設(shè)備的運行數(shù)據(jù)和配置數(shù)據(jù),并將二者數(shù)據(jù)進(jìn)行比對,然后將比對結(jié)果反饋給對賬設(shè)備選取模塊,用以作為對賬設(shè)備模塊進(jìn)行下一次設(shè)備選取的依據(jù)。在進(jìn)行數(shù)據(jù)比對時,為了提高比對效率和速度,本文提出了一種基于差分快照的數(shù)據(jù)比對方法,下面將展開具體介紹。
數(shù)據(jù)比對有兩種選擇,一種是基于數(shù)據(jù)庫內(nèi)抽象數(shù)據(jù)的比對,另外一種基于業(yè)務(wù)類型與條目的比對。由于網(wǎng)絡(luò)設(shè)備內(nèi)數(shù)據(jù)在順序的分布上可能和控制器不一致,所以選擇基于第二種比對方法,即基于業(yè)務(wù)數(shù)據(jù)類型的條目比對。在對業(yè)務(wù)數(shù)據(jù)進(jìn)行條目比對時,難點是比對數(shù)據(jù)量大、任務(wù)重??紤]到控制器的性能問題,必須將比對任務(wù)離散化,即每次數(shù)據(jù)比對只是比對一部分?jǐn)?shù)據(jù),與數(shù)據(jù)拉取類似,通過數(shù)據(jù)表項的索引來進(jìn)行多次的數(shù)據(jù)比對。
在進(jìn)行單條數(shù)據(jù)比對時,考慮到如果對記錄數(shù)據(jù)的所有字段逐一比較來實現(xiàn),需要對整個數(shù)據(jù)庫的所有記錄信息進(jìn)行比對,導(dǎo)致控制器開銷較大??紤]到數(shù)據(jù)指紋技術(shù)可以通過提取記錄信息的特征來對原始信息進(jìn)行唯一的標(biāo)識,由此來提高海量信息的檢索效率。因此,本文完全可以將原始數(shù)據(jù)用數(shù)據(jù)指紋生成單條表項的數(shù)據(jù)快照的方式來替代,解決海量數(shù)據(jù)比對的效率問題。
有了基于數(shù)據(jù)指紋的數(shù)據(jù)快照,無需比較記錄的所有字段,只需比較該記錄的數(shù)據(jù)是否發(fā)生變化。本文中的數(shù)據(jù)指紋由單條數(shù)據(jù)表項的“主鍵”+“摘要信息”的方式構(gòu)成,“主鍵”采用單條數(shù)據(jù)表項的“Index 標(biāo)簽”表示,“摘要信息”采用信息-摘要算法(Message-Digest algorithm 5,MD5)算法[6]對整條項記錄計算出的“摘要”。
基于數(shù)據(jù)快照的數(shù)據(jù)比對的具體流程如下文所述:
輸入:f1、f2(Config Datastore、Running Datastore數(shù)據(jù)快照),f(f1的MD5 臨時表)
輸出:增量文件
開始
按塊讀入方式將MD5 臨時表f 讀入內(nèi)存。
根據(jù)哈希函數(shù)h,計算內(nèi)存中f 每條記錄t1的值h(t1.Key),并建立相應(yīng)的哈希表。
按塊讀入新快照f2。
對f2中的每條記錄t2,計算其記錄摘要即MD5值,將記錄的Key 值和MD5 值暫存到鏈表變量list中,同時根據(jù)哈希函數(shù)h計算h(t2,K),并與(2)中建立的哈希表進(jìn)行Key 值和MD5 值的匹配。
重復(fù)步驟(4),直到f2中的所有記錄都匹配完畢。
對哈希表中剩余的記錄,即未被匹配的記錄,作為被刪除的記錄輸出到增量文件中。
結(jié)束
數(shù)據(jù)快照的數(shù)據(jù)比對的流程中,初始化時,創(chuàng)建表f1(Config datastore 數(shù)據(jù)快照),表f2(Running Datastore 的數(shù)據(jù)快照),臨時表f,這張表包含兩個字段,分別保存控制器Config datastore 每一條數(shù)據(jù)的Key 值和記錄摘要(即MD5 值),并在表f 中記錄Key 值和MD5 值,由此建立了Config datastore Key 值和MD5 值一一對應(yīng)的Hash 表。對通過數(shù)據(jù)拉取模塊獲取的實時更新的Running Datastore 的每一條記錄計算其數(shù)據(jù)指紋信息,并將生成的Key 值和MD5值與臨時表f中的Key值和MD5值進(jìn)行匹配,最后將匹配失敗的記錄輸出到增量文件中。
本文通過分析SDN 網(wǎng)絡(luò)中控制器與網(wǎng)絡(luò)設(shè)備配置數(shù)據(jù)一致性的高可靠性與實時性需求,設(shè)計了一種基于數(shù)據(jù)快照的南向數(shù)據(jù)對賬系統(tǒng)方案。該方案在遵循控制器基本框架的基礎(chǔ)上,巧妙地利用為NETCONF 協(xié)議服務(wù)的YANG 語言構(gòu)建數(shù)據(jù)模型,提出了基于分片分塊的數(shù)據(jù)巡檢拉取方法,避免了因一次同步造成的控制器性能下降問題。并在數(shù)據(jù)比對過程中提出了一種采用數(shù)據(jù)快照來替代整條數(shù)據(jù)記錄的方式,生成數(shù)據(jù)快照由記錄的數(shù)據(jù)指紋(“主鍵+記錄摘要”)構(gòu)成,“記錄摘要”采用在信息摘要中廣泛應(yīng)用的MD5 算法對整條記錄計算生成,利用記錄的數(shù)據(jù)指紋來比較和替代記錄的全部字段比較,極大提高了數(shù)據(jù)比對效率。該機(jī)制為解決大規(guī)模的SDN 網(wǎng)絡(luò)環(huán)境的數(shù)據(jù)配置同步問題提供了一種解決思路,對于新一代高可靠SDN 控制系統(tǒng)的設(shè)計開發(fā)有借鑒意義。