一 項目內容
采用參考場景一作為項目的目標。
服務器h2 h3上各自有不同的服務,h1是客戶端。實現一個負載均衡的北向程序,當h2和h3向h1傳輸數據時,北向應用根據鏈路的使用狀況動態的調整路由規則。
二 思路
通過ODL的流量監控實時下發不同的流表,(圖一)通過改變優先級使流表生效或者失效。H3的數據根據S1和S2之間的鏈路使用情況選擇傳送的路線。
圖一
三 代碼演示:
建立拓撲
from mininet.topo import Topo
class MyTopo( Topo ):
def __init__( self ):
# initilaize topology
Topo.__init__( self )
# add hosts and switches
host1 = self.addHost( 'h1' )
host2 = self.addHost( 'h2' )
host3 = self.addHost( 'h3' )
switch1 = self.addSwitch( 's1' )
switch2 = self.addSwitch( 's2' )
switch3 = self.addSwitch( 's3' )
# add links
self.addLink(host1,switch1)
self.addLink(switch1,switch2)
self.addLink(switch1,switch3)
self.addLink(switch2,switch3)
self.addLink(switch2,host2)
self.addLink(switch2,host3)
topos = { 'mytopo': ( lambda: MyTopo() ) }
負載均衡代碼地址
演示視頻
建立的拓補圖形:
四 項目分工
在這次作業中,我負責編寫代碼,例如拓補建立的腳本,負載均衡程序中監控流量的部分。還有一些比較細微但又影響項目推進的工作,比如對運行環境的搭建,debug等。
本次實驗,一開始我是想通過sflow來完成流量監控功能的,因為它可以比較精確統計,並且不會對被統計設備產生太大負擔,稍微實驗幾次后感覺效果不錯,不過由於對python比較陌生,對我實現有比較大的困難,調用sflow的工作一直沒做好,后來在助教的幫助下,我改用ODL控制器下的/restconf/operational/opendaylight-inventory:nodes/node//node-connector/,通過查詢端口接受的字節和時間,兩者相除間接得到鏈路流量。
五 課程總結
這學期的SDN這門課對我來說,是一門實用性和實踐性都很高的一門課,是這學期對專業知識收獲很多的幾門課之一,讓我對現在網絡前沿的發展方向有了一個大體的認識,並且接觸了不少控制器,例如floodlight,ODL等。
總結前幾次作業,SDN課程中我都了解了
- SDN思想和發展過程
- 控制器的架構技術
- SDN控制器的發展
- ryu控制器,onos控制器 ,opendaylight控制器
- 關鍵的負載均衡思想
通過實踐,將上學期網絡課程抽象的知識變得具體化一些,並且能夠憑借相關知識去得出一些結論並通過實踐去驗證。實踐課讓我掌握到了許多理論課比較不會去側重的小細節,比如第四次和第五次的實驗分別讓我知道了建立拓補失敗時如何去找原因,拓補建立后ping不通如何去排查去解決。而總結全部實踐,涉及的內容有以下幾項:
-
使用mininet,包括安裝,運行,使用,相關命令的功能和格式。
-
幾種建立拓補的方法,包括用命令符建立,用mininet的可視化腳本建立,用python編寫的腳本建立。
-
通過控制器查看拓補,監測等
-
幾種下發流表的方法。例如通過命令下發,通過ODL下發。
-
幾種查看流表/組表的方法。
-
ovs的使用
-
postman的使用
-
Wireshark的抓包驗證
以及間接的學習到了實踐相關的知識,比如學習了VM的配置與使用之間的關系,Linux的一些功能,對python有了初步的認知(不得不說python的縮進會消耗新手的很多時間),可以粗略的使用,對GitHub進一步的了解。雖然這門課的課時不是很長,也不能把整個SDN相關的知識都講解一遍,但是已經幫我們畫出的大體輪廓,對於學習網絡專業的知識有了一個不錯的方向指導,不得不說我從中收獲了很多。
作業要求:
負載均衡程序
演示視頻
程序分工