编者按:本文介绍的是如何在RYU上通过使用select group 来实现multipath,从而实现流量的调度,完成简单的负载均衡Demo。在OpenFlow13中有group table,可用于实现组播和冗余容灾等功能。实验中还使用了OpenvSwitch的队列queue完成了对链路带宽的保障。
要完成多径传输,那么网络拓扑必然有loop,所以首先要解决由于loop而可能产生的storm,解决方案在《基于SDN的RYU应用开发之ARP代理》文中已经提出。
网络拓扑:
"""Custom loop topo example
There are two paths between host1 and host2.
|--------switch2 --------|
| |
host1 --- switch1 switch4 -----host2
| | |------host3
-------- switch3 ---------
|
host4
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
class MyTopo(Topo):
"Simple loop topology example."
def __init__(self):
"Create custom loop topo."
# Initialize 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(switch1, host1, 1)
self.addLink(switch1, switch2, 2, 1)
self.addLink(switch1, switch3, 3, 1)
self.addLink(switch2, switch4, 2, 1)
self.addLink(switch3, switch4, 2, 2)
self.addLink(switch4, host2, 3)
self.addLink(switch4, host3, 4)
#self.addLink(switch3, host4, 3)
topos = {'mytopo': (lambda: MyTopo())}
Multipath:
解决网络可能形成风暴的问题之后,可以使用select类型的group_table来实现多径功能。
def send_group_mod(self, datapath):
ofp = datapath.ofproto
ofp_parser = datapath.ofproto_parser
port_1 = 3
actions_1 = [ofp_parser.OFPActionOutput(port_1)]
port_2 = 2
actions_2 = [ofp_parser.OFPActionOutput(port_2)]
weight_1 = 50
weight_2 = 50
watch_port = ofproto_v1_3.OFPP_ANY
watch_group = ofproto_v1_3.OFPQ_ALL
buckets = [
ofp_parser.OFPBucket(weight_1, watch_port, watch_group, actions_1),
ofp_parser.OFPBucket(weight_2, watch_port, watch_group, actions_2)]
group_id = 50
req = ofp_parser.OFPGroupMod(
datapath, ofp.OFPFC_ADD,
ofp.OFPGT_SELECT, group_id, buckets)
datapath.send_msg(req)
不知道现在OVS的select的