真实的SDN网络需要很多OpenFlow设备包括控制器、交换机、功能虚拟化等一系列设备共同依赖搭建并应用,但因条件有限,每一位实验者不可能有真实的环境来验证或者实验。使用Mininet设计模拟不同网络数据中心拓扑,可以用来分析网络的总流量,而且此外,还可以通过负载均衡策略来保证数据中心的可用性。不同数据中心网络拓扑管理设计,主要是基于Fat-Tree拓扑来创建网络,Fat-Tree网络的好处是具有一个多层次的树状拓扑结构固有容错能力。
使用Mininet设计模拟一个多数据中心网络。用Mininet模拟仿真测试,主要是用Mininet中的OpenFlow交换机和自己提供的ODL控制器进行测试。一个简单的基于两个数据中心的网络拓扑,如图所示:
具有主要测试及验证交换机下挂主机间的连通性以及主机间收发数据包的速度。Mininet中自带的iperf性能测试工具可以测试不同主机间通信的性能带宽质量,在此例中,主要是对相同边缘交换机下的主机间、相同聚合交换机下不同边缘交换机间、相同核心交换机不同聚合交换机下的主机间进行测试。
在此实验中,使用Mininet通过python自定义拓扑编写脚本创建两个数据中心的网络拓扑,且使用已准备的POX控制器(IP地址为192.168.28.131)进行管控。
应用Mininet创建两个数据中心的网络拓扑设计的脚本代码如下:
拓扑创建代码完成后,可以在Mininet命令行操作界面通过ping 操作和iperf命令进一步验证主机间的连通性以及性能带宽分析,也可以通过编写测试脚本应用Mininet的操作命令进行全自动化测试连通性及性能带宽质量,代码如下:
- #FatTree.py
- """Customtopology example
- Addingthe 'topos' dict with a key/value pair to generate our newly defined
- topologyenables one to pass in '--topo=mytopo' from the command line.
- """
- frommininet.topo import Topo
- classMyTopo(Topo):
- "Simple topology example."
- def __init__(self):
- "create custom topo."
- #initializa topology
- Topo.__init__(self)
- L1 = 2
- L2 = L1 * 2
- L3 = L2
- cSwitch = []
- aSwitch = []
- eSwitch = []
- #add core ovs
- for i in range(L1):
- sw = self.addSwitch('c{}'.format(i+1))
- cSwitch.append(sw)
- #add aggregation ovs
- for i in range(L2):
- sw = self.addSwitch('a{}'.format(L1 + i+1))
- aSwitch.append(sw)
- #add edge ovs
- for in range(L2):
- sw = self.addSwitch('e{}'.format(L1 + L2 + i+1))
- eSwitch.append(sw)
- #add links between core aggregationovs
- for i in range(L1):
- for j in range(L2):
- # self.addLink(sw2, sw1, bw=10,delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
- link = self.addLink(cSwitch[i],aSwitch[j])
- #add links between aggragation andedge ovs
- for i in range(L1):
- for j in range(L1):
- self.addLink(aSwitch[i],eSwitch[j])
- for i in range(L1):
- for j in range(L1):
- # self.addLink(sw2, sw1, bw=10,delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
- self.addLink(aSwitch[L1 + i],eSwitch[L1 +j])
- #add hosts and its links with edgeovs
- count = 1
- for sw1 in eSwitch:
- for i in range(L1):
- host = self.addHost('h{}'.format(count))
- self.addLink(sw1,host)
- count += 1
- topos= {'mytopo':(lambda:MyTopo())}
通过Mininet命令控制台进行手动输入命令测试验证,测试结果如下:
通过Mininet手动操作命令创建拓扑:
- root@ubuntu:/home/wr/study/sdn#mn --custom FatTree.py --topo mytopo--controller=remote,ip=192.168.28.131,port=6633
1、同一交换机内部的主机间连通性及通信带宽测试:h1和h2之间进行ping操作。经验证主机间能够ping通。当操作iperfh1 h2命令时,h1和h2的带宽性能测试结果为:测试TCP带宽发送数据的速率为16.1Gbit/s,接收数据的速率为16.1Gbit/s。
2、相同汇聚交换机下不同机架的主机测试:h1和h3之间进行ping操作,经验证,两主机间能够通信。h1和h3的带宽性能测试结果为:测试TCP带宽发送数据的速率为91.6 Mbit/s,接收数据的速率为98.0Mbit/s。
3、相同核心交换机不同汇聚交换机下的主机间测试:h1和h5主机在相同核心交换机不同汇聚交换机下,h1和h5之间进行ping操作,经验证,两个主机间能够通信。h1和h5的带宽性能测试结果为:测试TCP带宽发送数据的速率为73.7Mbit/s,接收数据的速率为79.3Mbit/s。