本發(fā)明涉及云計算平臺技術(shù)領(lǐng)域,尤其涉及網(wǎng)絡(luò)虛擬化的實(shí)現(xiàn)方法及其相應(yīng)的插件和代理。
背景技術(shù):
現(xiàn)在的云計算平臺架構(gòu)主要有兩種,一種是以數(shù)據(jù)存儲為主的云平臺,比如Hadoop;一種是以計算為主的云平臺,比如AWS和Openstack。
以計算為主的云平臺擴(kuò)展了虛擬化技術(shù)和容器技術(shù)。使得現(xiàn)代云計算平臺體現(xiàn)出以下特性:按需分配,用戶自服務(wù);寬帶網(wǎng)絡(luò)連接;資源池化;快速的彈性伸縮;可測量的服務(wù)。
服務(wù)器的虛擬化抽象了CPU,內(nèi)存,網(wǎng)卡等資源,使其不依賴于物理硬件。與之類似,網(wǎng)絡(luò)虛擬化抽象了網(wǎng)絡(luò),路由器等網(wǎng)絡(luò)資源,使邏輯網(wǎng)絡(luò)和物理網(wǎng)絡(luò)解耦,各自可以獨(dú)立的演化。
服務(wù)器虛擬化和網(wǎng)絡(luò)虛擬化帶來的好處是,提高硬件使用效率,提升運(yùn)維自動化程度,提高網(wǎng)絡(luò)服務(wù)開發(fā)速度。
云計算平臺不一定需要網(wǎng)絡(luò)虛擬化,但是網(wǎng)絡(luò)虛擬化可以豐富云計算平臺的功能。
云計算平臺網(wǎng)絡(luò)虛擬化剛出現(xiàn)時是以插件的形式。架構(gòu)上通常采取主從的架構(gòu),一個網(wǎng)絡(luò)虛擬化服務(wù)器節(jié)點(diǎn),通過多個計算節(jié)點(diǎn)上的代理搜集和處理網(wǎng)絡(luò)信息。這樣的架構(gòu)在集群規(guī)模擴(kuò)大時,使得服務(wù)器節(jié)點(diǎn)成為瓶頸。后來為了解決瓶頸問題,出現(xiàn)了一些多節(jié)點(diǎn)服務(wù)器的方案,比如Openstack的Neutron DVR,但是在多個服務(wù)器節(jié)點(diǎn)之間,容易出現(xiàn)不平衡的問題。
一些通過SDN實(shí)現(xiàn)網(wǎng)絡(luò)虛擬化的方案也存在單節(jié)點(diǎn)瓶頸問題,比如Openstack的Neutron floodlight插件、NEC插件或者Dragonflow插件的單控制器方式。 Dragonflow支持分布式控制器的方式,在每個計算節(jié)點(diǎn)上部署一個控制器。這種方式解決了單節(jié)點(diǎn)瓶頸問題,但是也存在一些其他問題:1、SDN控制器數(shù)量的多少應(yīng)該由控制器的負(fù)載大小決定。實(shí)際需要的控制器節(jié)點(diǎn)數(shù)量可能大于計算節(jié)點(diǎn)數(shù)量也可能少于計算節(jié)點(diǎn)數(shù)量,將控制器部署在每個計算節(jié)點(diǎn)上使得控制器節(jié)點(diǎn)的數(shù)量不能自由改變。2、每個控制節(jié)點(diǎn)承擔(dān)本地計算節(jié)點(diǎn)虛擬機(jī)的網(wǎng)絡(luò)負(fù)載,各個計算節(jié)點(diǎn)之間負(fù)載常常是不平衡的??刂破鞴?jié)點(diǎn)之間應(yīng)該能動態(tài)的負(fù)載平衡。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種云計算平臺網(wǎng)絡(luò)虛擬化實(shí)現(xiàn)方法及相應(yīng)插件和代理。本方法沒有單節(jié)點(diǎn)瓶頸的問題,而且解決了多個服務(wù)器節(jié)點(diǎn)之間不平衡的問題。
云計算平臺的計算節(jié)點(diǎn)上存在多個的虛擬機(jī)或者容器,這些虛擬機(jī)或者容器可能屬于同一個租戶也可能屬于不同的租戶,可能屬于同一個網(wǎng)絡(luò)也可能屬于不同的網(wǎng)絡(luò)。為了在虛擬機(jī)或容器之間建立數(shù)據(jù)鏈路存在兩種方式。
方式一:如果連接虛擬機(jī)和容器的是可編程交換機(jī),則需要:
在任意兩個虛擬機(jī)或容器之間建立二層連接,在計算節(jié)點(diǎn)上安裝虛擬交換機(jī),比如OpenVSwitch,所有的虛擬機(jī)和容器要連接到虛擬交換機(jī)。
各個計算節(jié)點(diǎn)之間要存在三層連接,所有的虛擬路由器連接到這個三層網(wǎng)絡(luò)上。
通過大二層技術(shù)在,使得任意兩個虛擬機(jī)或者容器之間存在二層連接。
服務(wù)器通過設(shè)置可編程交換機(jī)對數(shù)據(jù)包的修改或轉(zhuǎn)發(fā)規(guī)則,在任意兩個虛擬機(jī)或容器之間連接。虛擬網(wǎng)絡(luò)之間的隔離通過vlan實(shí)現(xiàn)。這種方式下服務(wù)器的負(fù)擔(dān)較輕。
方式二:如果連接虛擬機(jī)、容器的是不可編程的交換機(jī)或者網(wǎng)橋,虛擬機(jī)的數(shù)據(jù)包全部發(fā)給服務(wù)器,并通過服務(wù)器修改或轉(zhuǎn)發(fā)給目標(biāo)。虛擬網(wǎng)絡(luò)之間的隔離也是通過vlan實(shí)現(xiàn)。這種方式下,服務(wù)器的負(fù)擔(dān)較重,但是對交換機(jī)的要求較低。
數(shù)據(jù)中心的網(wǎng)絡(luò)流量通常分為東西流向和南北流向。東西流向指的是數(shù)據(jù)中心內(nèi)主機(jī)之間的流量。南北流向指的是數(shù)據(jù)中心與外部的數(shù)據(jù)流量。在使用可編程的交換機(jī)時,東西流量不經(jīng)過服務(wù)器,南北流量實(shí)現(xiàn)NAT轉(zhuǎn)換有兩種方法:
方法一:流量經(jīng)過服務(wù)器。服務(wù)器對數(shù)據(jù)包做NAT轉(zhuǎn)換,然后轉(zhuǎn)發(fā)給網(wǎng)關(guān)。服務(wù)器可以根據(jù)SOURCE IP、VLAN ID、TUNNEL ID和交換機(jī)ID區(qū)分?jǐn)?shù)據(jù)包的來源,所以允許虛擬網(wǎng)絡(luò)之間共享IP地址空間;
方法二:流量不經(jīng)過服務(wù)器。計算節(jié)點(diǎn)上的可編程交換機(jī)完成NAT轉(zhuǎn)換,然后將數(shù)據(jù)包直接轉(zhuǎn)發(fā)給網(wǎng)關(guān)。
本發(fā)明通過插件的方式向云計算平臺提供網(wǎng)絡(luò)虛擬化服務(wù),比如虛擬網(wǎng)絡(luò)、虛擬路由器等。插件負(fù)責(zé)將云計算平臺的網(wǎng)絡(luò)虛擬化服務(wù)請求轉(zhuǎn)換和轉(zhuǎn)發(fā)給服務(wù)器。
本發(fā)明通過在計算節(jié)點(diǎn)上的代理完成網(wǎng)絡(luò)虛擬化必須的工作,比如鋪設(shè)二層網(wǎng)絡(luò)、修改交換機(jī)配置、搜集網(wǎng)絡(luò)信息等。在有多個服務(wù)器時,代理還負(fù)責(zé)在多個服務(wù)器之間做負(fù)載均衡。每個代理維護(hù)一系列的負(fù)載均衡參數(shù)。負(fù)載均衡參數(shù)包括多個服務(wù)器的地址、活躍狀態(tài)、負(fù)載狀態(tài)。為了支持按照數(shù)據(jù)包的內(nèi)容分配流量,負(fù)載均衡參數(shù)還應(yīng)該包括數(shù)據(jù)包相關(guān)的參數(shù),比如VLAN ID、IP地址、MAC地址等。代理根據(jù)預(yù)先設(shè)定的負(fù)載均衡策略和實(shí)時的負(fù)載均衡參數(shù),將交換機(jī)的請求轉(zhuǎn)發(fā)給服務(wù)器。
當(dāng)使用可編程交換機(jī)時,比如OpenVSwitch,本發(fā)明為了使控制器識別來自某一個交換機(jī)的信息發(fā)出的先后次序,需要為交換機(jī)發(fā)往控制器的信息添加序列號。
本發(fā)明為交換機(jī)發(fā)出的信息添加序列號的方法是為交換機(jī)添加一種序列號匹配規(guī)則。交換機(jī)需要為每個需要序列號的規(guī)則存儲并維護(hù)一個序列號,當(dāng)數(shù)據(jù)包匹配規(guī)則成功時,將信息某一個字段賦值為序列號,并將序列號加1,然后才將信息發(fā)往控制器。這個字段可以是Openflow協(xié)議已經(jīng)規(guī)定的字段,比如metadata或者cookie,也可以是通過擴(kuò)展Openflow協(xié)議新添加的字段,比如一個新的sequence_number字段。
例如,在OpenVSwitch上,可以通過如下命令添加匹配規(guī)則:ovs-ofctl addflow br0 “{match rules},metadata=sequence,action=controller” 。{match rules}是匹配規(guī)則;metadata=sequence不參與匹配,只是標(biāo)明規(guī)則匹配成功時metadata需要被設(shè)為當(dāng)前的序列號,并將序列號加1;action=controller指明信息將要發(fā)往控制器。為了簡化,匹配規(guī)則也可以如下的方式實(shí)現(xiàn),交換機(jī)保留某些數(shù)值作為序列號的標(biāo)志。撰寫匹配規(guī)則時,可以用這些保留的數(shù)值代替sequence,比如metadata=0xffffffffffffffff。交換機(jī)遇到metadata=0xffffffffffffffff的流就會將metadata字段設(shè)為當(dāng)前的序列號,并將序列號加1。Action可以是controller也可以是任何其他交換機(jī)支持的動作。
目前SDN交換機(jī)不支持metadata=sequence這樣地規(guī)則,也不支持為規(guī)則維護(hù)和存儲序列號。需要對交換機(jī)的實(shí)現(xiàn)作出更改,才能實(shí)現(xiàn)本發(fā)明提出的功能。本發(fā)明用到的添加序列號匹配規(guī)則的方法可以在包括虛擬交換機(jī)OpenVSwitch的SDN交換機(jī)上實(shí)現(xiàn)。
控制器的前端節(jié)點(diǎn)需要為來自同一個交換機(jī)的帶序列號的相同匹配規(guī)則的流建立一個分布式隊(duì)列。控制器收到交換機(jī)發(fā)送的帶有序列號的信息并不直接處理信息而是將信息添加到隊(duì)列尾端。控制器可以訂閱任意一個隊(duì)列,但是每個隊(duì)列在任意時刻都只能有一個訂閱者。這樣是為了保證任意時刻只有一個控制器在處理一個隊(duì)列的消息??刂破饕獮槊恳粋€隊(duì)列維護(hù)一個最大序列號值??刂破魇盏綇年?duì)列訂閱的信息時,先比較信息的序列號和維護(hù)的最大序列號。如果信息的序列號小于最大序列號,則不對信息進(jìn)行處理。
隊(duì)列的消息訂閱者可以改變。改變消息訂閱者的方式有兩種,主動式和被動式。主動式是指訂閱消息的控制器節(jié)點(diǎn)在繁忙時可以主動放棄訂閱消息,改由其他控制器節(jié)點(diǎn)繼續(xù)處理隊(duì)列消息。被動式是指隊(duì)列的訂閱者由于系統(tǒng)崩潰或網(wǎng)絡(luò)故障等原因不能繼續(xù)處理隊(duì)列消息,系統(tǒng)發(fā)現(xiàn)當(dāng)前訂閱者無法繼續(xù)處理消息而選擇另一個控制節(jié)點(diǎn)作為新的訂閱者。
當(dāng)被動式訂閱者切換發(fā)生時,為了避免因?yàn)榭刂乒?jié)點(diǎn)崩潰丟失最大序列號和消息,控制器節(jié)點(diǎn)處理消息和更新最大序列號的動作應(yīng)該保持原子性(Atomic)。
本系統(tǒng)實(shí)現(xiàn)原子性的方法是使用一個預(yù)寫式日志(Write-Ahead Logging)??刂乒?jié)點(diǎn)在處理消息之前,先將最大序列號、消息和處理消息需要執(zhí)行的動作以及回滾動作寫入一個日志中。如果一個訂閱者在處理消息過程中發(fā)生故障,另一個訂閱者可以檢查日志以決定是繼續(xù)處理還是回滾。為了保障日志的存儲安全性,日志應(yīng)該有多個備份。
網(wǎng)絡(luò)虛擬化服務(wù)器以鍵值對的方式存儲路由信息,比如根據(jù)虛擬網(wǎng)絡(luò)ID和IP查找MAC地址等。存儲鍵值對的數(shù)據(jù)庫可以是一個也可以是多個存儲設(shè)備。
每一個鍵值對的鍵都是唯一的,每一個鍵值對都有一個或多個副本,每一個副本都有一個副本號。鍵值對的副本數(shù)是指有多少條等同的鍵值對存儲在所有存儲節(jié)點(diǎn)上。如果一個鍵值對的副本數(shù)是n,第一個副本的副本號是1,第二個副本的副本號是2,以此類推。副本有提高數(shù)據(jù)的安全性和可用性的作用。
服務(wù)器根據(jù)鍵和副本號選擇存儲節(jié)點(diǎn)。在一個鍵值對有多個副本時,一個鍵值對的多個副本可能會選擇同一設(shè)備,這種情況叫做沖突。在存儲設(shè)備多于副本數(shù)時,如果存儲策略不允許有沖突,則為沖突的副本選擇n+1為新的副本號,如果仍然有沖突,則選擇n+2為新的副本號,以此類推直到?jīng)]有沖突為止。程序在讀鍵值對時只需讀一個副本,但是在寫入時需要修改所有的副本。
附圖說明
圖1是本發(fā)明多節(jié)點(diǎn)軟件定義網(wǎng)絡(luò)控制器系統(tǒng)的總體架構(gòu)圖。
圖2是本發(fā)明多節(jié)點(diǎn)軟件定義網(wǎng)絡(luò)控制器系統(tǒng)中發(fā)送和處理帶序列號的消息的流程圖。