负载均衡程序
while(True): #获取s4端口1的流量 uri = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:4/node-connector/openflow:4:1' response, content = http.request(uri=uri, method='GET') content = json.loads(content) statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics'] bytes1 = statistics['bytes']['transmitted'] #1秒后再次获取 time.sleep(1) response, content = http.request(uri=uri, method='GET') content = json.loads(content) statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics'] bytes2 = statistics['bytes']['transmitted'] #在检测到s4的1口流量空闲时发的流表 speed=float(bytes2-bytes1)/1 if speed !=0 :#获取有效的速度 if speed < 1000 : print 'speed =',speed,', s2端口1空闲,数据包往1口通过' #下发默认的流表 response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/41', body=h2_to_s4_1, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/51', body=h3_to_s4_1, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/61', body=h4_to_s4_1, method='PUT',headers=headers) #在检测到s2的1口流量满载时下发新的流表 else : print 'speed =',speed,', s2端口1满载,数据包改为往2口和3口通过' #h2数据包的流表 response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/41', body=lh2_to_s4_1, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/42', body=h2_to_s4_2, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/43', body=h2_to_s4_3, method='PUT',headers=headers) #h3数据包的流表 response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/52', body=h3_to_s4_2, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/53', body=h3_to_s4_3, method='PUT',headers=headers) #h4数据包的流表 response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/62', body=h4_to_s4_2, method='PUT',headers=headers) response, content = http.request(uri='http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:4/flow-node-inventory:table/0/flow/63', body=h4_to_s4_3, method='PUT',headers=headers)
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' ) host4 = self.addHost( 'h4' ) switch1 = self.addSwitch( 's1' ) switch2 = self.addSwitch( 's2' ) switch3 = self.addSwitch( 's3' ) switch4 = self.addSwitch( 's4' ) # add links self.addLink(host1,switch1) self.addLink(switch1,switch2) self.addLink(switch1,switch3) self.addLink(switch1,switch4) self.addLink(switch2,switch4) self.addLink(switch3,switch4) self.addLink(switch4,host2) self.addLink(switch4,host3) self.addLink(switch4,host4) topos = { 'mytopo': ( lambda: MyTopo() ) }
演示视频
程序分工
赖志平:控制流表下发,负载均衡策略实现,实验的统筹与指导实现
陈敏辉:测试与纰漏修改,ReadMe说明
陈甘霖:流表设计和修正和视频录制
陈家进:拓扑搭建、视频剪辑
学期总结
1.了解了什么是 SDN ,openflow,SDN 的基本思想、特点。 2.掌握了在mninet上创建拓扑并通过floodlight验证器正确 3.运用ODL控制器下发流表并通过OVS命令查看验证;运用Postman通过ODL的北向接口下发流表 4.运用Wireshark抓包验证拓扑结构的正确性 5.对ECMP与负载均衡的定义及实现有一些了解,可以实现较简单的负载均衡场景 6.课程新颖,走在时代前沿,一个学期的学习肯定是不够的,只是皮毛,在接下来的日子会继续了解相关方面的知识,以及考虑如何应用