一 项目内容
采用参考场景一作为项目的目标。
服务器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相关的知识都讲解一遍,但是已经帮我们画出的大体轮廓,对于学习网络专业的知识有了一个不错的方向指导,不得不说我从中收获了很多。
作业要求:
负载均衡程序
演示视频
程序分工