一种云计算中高性能路由转发方法
技术领域:
本发明涉及网络仿真领域,特别是涉及一种云计算中高性能路由转发方法。
背景技术:
互联网在过去几十年里得到了快速的发展,云计算已经作为当下一个非常重要的服务方式,越来越多的人和企业通过网络以自助服务的方式获得所需的IT资源。面对日益增长的用户需求,云计算中的网络虚拟化性能受到了更大的挑战。
Openstack作为当前开源云计算的代表,其虚拟网络存在着一定性能问题。如宿主机内跨网段云主机间的东西向数据流量,需要经过网络节点的路由功能进行转发。其数据转发性能受到集群间硬件设备的限制,同时也造成了网络节点的负载过大等问题。另外,网络节点的路由功能,仅仅依靠路由命名空间中的静态路由实现三层网络互通,在一些网络仿真场景中,不具备动态路由协议的路由自学习能力,因此存在着一定程度上逼真性的不足。
NFV(网络功能虚拟化)作为当前网络领域的研究热点,旨在将众多的网络设备通过IT虚拟化的手段融合到有着工业标准的服务器中去,所有的网络功能通过软件实现。在科学研究中,不少研究者基于路由控制软件实现虚拟路由器用于在云计算中构建逼真的虚拟网络,但是网络性能却随着虚拟路由器数量的增加而降低。
Openflow是起源于斯坦福大学的一种新型网络技术,其最主要的特征在于将传统网络设备的控制层和数据转发层分离。由一个集中式的统一控制器控制,数据转发层根据控制层写入的流表进行数据包的转发,因此,这是一种基于流的转发方式。然而,Openflow网络是一种二层网络,工作在数据链路层,对三层路由转发支持不足,无法满足部分网络层的实验需求。
Openvswitch(OVS)是一种虚拟交换机,在Openstack中可采用OVS提供虚拟网络的二层连接,所有虚拟节点都通过linux桥接入OVS创建的br-int桥。同时OVS提供了对Openflow协议的支持,因此,可通过Openflow协议对虚拟交换机下发流表项,用来匹配经过虚拟交换机的数据包并对数据包进行修改和重定向。
发明内容:
本发明解决的技术问题是要提供一种云计算中高性能路由转发方法,采用SDN设计思想实现路由控制平台,该平台可根据具体网络拓扑的构建情况将路由表映射成Openflow流表,实现了宿主机内跨子网数据包转发由虚拟路由器决策但通过虚拟交换机直接转发。解决了当前Openstack宿主机内虚拟网络跨子网通信性能受限的问题,在保证了数据路由逼真性的同时提升了网络的性能。
本发明解决上述技术问题的技术方案如下:
S1:搭建Openstack云计算平台,其中虚拟二层网络基于Openvswitch虚拟交换机构建,搭建好的云平台包括一台控制节点,若干台计算节点。
S2:在Openstack平台中引入自主研发的虚拟路由器,该虚拟路由器提供对外查询路由表的Restful API,并基于该虚拟路由器、虚拟交换机以及虚拟节点进行虚拟目标网络构建。
S3:在控制节点中编写虚拟路由器信息处理模块,该模块的功能是查询当前网络中虚拟路由器信息,并将信息插入数据库,具体执行步骤如下:
(1):在数据库中新建route_controller数据库,并在该数据库中创建routerinfo表。
(2):编写虚拟路由查询子模块,根据Openstack提供的python SDK编写虚拟路由器查询方法get_router_info()。
(3):编写虚拟路由器信息处理模块,调用(2)中的虚拟路由器查询方法得到当前虚拟网络中所有虚拟路由器信息并插入数据库表routerinfo中。
S4:在控制节点编写虚拟网络处理模块,该模块的功能是根据虚拟路由器的路由表分析出可达性网络表,并将其插入数据库。具体执行步骤如下:
(1):在数据库router_controller中创建routetable表。
(2):查询数据库中当前虚拟网络中所有网络信息并保存在network_info变量中。
(3):查询数据库表routerinfo中所有路由器连接的网络信息。同时根据(2)中network_info的具体网络id,在对应网络命名空间namespace中调用虚拟路由器路由表查询API远程查询所有路由器的路由表信息。
(4):编写路由表分析子模块,对(3)中得到的所有路由器的路由表进行处理。取出所有路由器路由表中交集网络,并过滤掉不符合条件的网络,得到可达性网络表并将其插入数据库表routetable中。
S5:在控制节点编写可达主机处理模块,该模块的功能是根据数据库中可达性网络表,得到可达性网络覆盖区域中所有虚拟主机信息并插入数据库,具体执行步骤如下:
(1):在数据库router_controller中创建vminfo表。
(2):编写虚拟主机查询子模块,根据Openstack提供的python SDK编写虚拟主机查询方法get_need_hosts_information(*need_nets)。
(3):编写可达主机处理模块,首先查询数据库表routetable中可达性网络表,将其作为参数传入(2)中虚拟主机查询方法得到可达性网络覆盖区域内的虚拟主机信息并将其插入数据库中vminfo表。
S6:在计算节点编写可达主机信息查询模块,该模块用来收集Openflow流表项所需的参数。具体执行步骤如下:
(1)首先远程查询控制节点数据库vminfo表中可达主机信息,包括各主机IP地址,MAC地址,和实例名称。
(2)调用python libvirt库,根据(1)中各主机的实例名称得到其虚拟网卡信息,并通过OVS命令根据其网卡信息得到虚拟主机在br-int交换机中对应的端口号。
S7:在计算节点中编写虚拟网络拓扑检测模块,该模块用来将当前路由网络拓扑抽象成无向图,并计算各虚拟节点间最短路径,得到动态的路由跳数变化。具体执行步骤如下:
(1)首先远程查询控制节点数据库routerinfo表中虚拟路由器信息,结合python的字典根据路由器信息抽象出网络拓扑无向图。
(2)编写最短路径算法,计算出各可达主机间的最短路由路径,得到动态变化的TTL值。
S8:在计算节点中编写流表生成与下发模块,该模块用来根据数据库信息和拓扑信息收集流表下发所需的参数并在br-int交换机中进行流表下发,具体执行步骤如下:
(1)编写流表生成模块,收集步骤S6中各可达主机对的信息,包括各主机对的IP地址,MAC地址,端口号,以及步骤S7中得到的各虚拟主机对间的TTL参数。
(2)通过OVS流表添加命令将流表项参数以流表的形式下发到br-int虚拟交换机,最终的流表格式为:
“ovs-ofctl add-flow br-int table=0,priority=10,dl_type=0x0800,nw_src=ip1,nw_dst=ip2,actions=mod_dl_src=mac1,mod_dl_dst=mac2,mod_nw_ttl:x,output:host2_port”,其中ip1和ip2位两个主机的IP地址,mac1和mac2为两个主机的MAC地址,x为两个主机通信时的TTL值,host2_port为虚拟主机2对应的OVS端口号。通过源和目的IP匹配数据流,并修改源和目的MAC以及TTL值,最后通过端口重定向将数据流发往指定端口,该条流表成对出现以实现虚拟主机双向通信。至此完成对各虚拟主机节点间数据包的匹配、修改、和重定向。
S9:将上述步骤S3到S8进行整合,形成一个统一的路由控制平台,通过RestfulAPI实现控制节点和计算节点的通信,并编写统一的入口函数,完成该路由控制平台的一键启动。
可选地,所述步骤S2中虚拟路由器具备启动后自动部署动态路由协议的功能,用以简化用户交互复杂度。
可选地,所述步骤S3、S4、S5、S6、S7中通过调用统一的数据库控制模块完成对数据库信息的增删改查操作。该数据库控制模块采用python语言基于MySQLdb库开发,用来对上层应用程序需提供数据库增删改查的北向接口。
可选地,所述步骤S6、S8中通过调用计算节点中Openvswitch代理模块中的方法实现对OVS命令的操作。该Openvswitch代理模块对OVS的所有命令和流表操作进行封装,并对上层应用程序提供易于使用的北向接口。
本发明的有益效果如下:
1.宿主机内跨子网三层路由流量直接在宿主机内通过流表转发,无需在经过网络节点进行路由,有效避免了物理链路对数据转发的影响、减轻了网络节点的负载同时降低了网络节点单点故障的概率。
2.通过虚拟网络拓扑监测,实时计算云主机间动态路由跳数,并准确修改数据包TTL值,保证了数据包转发的逼真性。
3.实现网络通信控制层与转发层分离,通过路由控制层计算路由路径,映射成流表下发到OVS,并通过Openflow虚拟交换机进行数据转发,极大地提高了宿主机内跨子网路由的数据转发性能。
附图说明:
图1为一种云计算中高性能路由转发方法的流程图
图2为路由控制平台的执行设计流程图
图3为一种云计算中高性能路由转发方法的总体架构图
图4为构建的虚拟网络跨子网数据包流向图
图5为本发明实施例子所使用的的网络拓扑图
图6为启动路由控制平台后的链路连通效果图
图7为链路带宽对比图
图8为链路延时对比图
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步描述。
本实施方式的流程图如图1和图2所示,技术方案如下:
在步骤S1中,本实例中采用两台戴尔R820服务器搭建Openstack平台,包括一个控制节点,一台计算节点,其中虚拟链路基于Openvswitch构建。硬件架构如图3所示,其中,控制节点连接管理网、隧道网、外部网络,其对应管理网IP为192.168.1.11;隧道网IP为10.0.1.11。计算节点连接管理网、隧道网,其对应管理网IP为192.168.1.31;隧道网IP为10.0.1.31。
在步骤S2中,搭建如图5所示的典型虚拟网络拓扑,其中包括虚拟网络net1:192.168.1.0/24,net2:192.168.2.0/24,net3:192.168.3.0/24,net4:192.168.4.0/24,net5:192.168.5.0/24,net7:192.168.7.0/24。包括虚拟路由器R1(net1,net2)、R2(net2,net3,net4)、R3(net4,net5)、R4(net4)、R5(net5,net7)。包括虚拟主机H1:192.168.1.6,H2:192.168.2.7,H5:192.168.5.13,H7:192.168.7.6。其中,虚拟网络中所有虚拟主机和虚拟路由器不是直接连接,而是以图3中计算节点里的连接方式通过接入统一的虚拟交换机br-int完成逻辑互联。各虚拟路由器运行OSPF协议,使得各虚拟主机间可通过虚拟路由器进行跨子网数据通信。
在步骤S3中,首先在数据库中创建router_controller数据库并在其中创建routerinfo表。通过调用控制节点中官方提供的Openstack python SDK对虚拟路由器信息进行查询,将查询到的所有虚拟路由器信息预处理后保存为字典{'R1':['192.168.1.11','192.168.2.15'],'R2':['192.168.2.8','192.168.3.6','192.168.4.6'],'R3':['192.168.3.12','192.168.5.3'],'R4':['192.168.4.11'],'R5':['192.168.5.4','192.168.7.12']},并将虚拟路由器信息插入数据库routerinfo表中。
在步骤S4中,首先在数据库中创建routetable表接着查询数据库中routerinfo表,得到所有虚拟路由器的接口信息,并在网络命名空间中通过curl发送虚拟路由器路由表查询接口查询各虚拟路由器路由表,在本实例中,查询虚拟路由器R1的路由表,可在控制节点运行如下命令“ip netns xxx exec curl http://192.168.2.15:4501/getroute”,其中xxx为虚拟路由器R1所连接网络net2所在的网络命名空间号,192.168.2.15为虚拟路由器R1的一个接口,4501为虚拟路由器的web服务端口号。用同样的方法获取所有虚拟路由器路由表,并分析出所有路由表中共有的互通网络,最终得到拓扑收敛后的路由可达性网络表['192.168.1.0/24','192.168.2.0/24','192.168.3.0/24','192.168.4.0/24','192.168.5.0/24','192.168.7.0/24'],将其插入数据库routetable表。
在步骤S5中,首先在数据库中创建vminfo表,编写主机信息查询函数get_need_hosts_information(*need_nets),并以可达性网络表作为参数,查询可达性网络表覆盖区域中存活的虚拟主机信息,本实例中可查询虚拟主机信息如下,{'H1':['192.168.1.6','fa:16:3e:10:2b:19','instance-00000370'],'H2':['192.168.2.7','fa:16:3e:5c:2e:a7','instance-00000371'],'H5':['192.168.5.13','fa:16:3e:83:34:51','instance-00000372'],'H7':['192.168.7.6','fa:16:3e:17:f3:34','instance-00000373']},每一台虚拟主机信息中包括IP地址、MAC地址、实例名称,并将其插入数据库vminfo表中。
在步骤S6中,基于libvirt接口编写虚拟网卡查询程序,本实例中根据控制节点数据库表vminfo中虚拟主机H1的instance_name获得该虚拟主机的虚拟网卡tap10e13643a-d5,将其转换为OVS上的虚拟网卡qvo10e1364a-d5,通过OVS命令“ovs-vsctl getInterface qvo10e1364a-d5 ofport”查询虚拟主机H1接入的br-int虚拟交换机端口号为11。重复该过程查询虚拟主机H2、H5、H7的端口号分别为12、13、14。
在步骤S7中,实现虚拟网络拓扑检测模块,首先查询数据库表routerinfo中所有虚拟路由器信息,并基于python字典以邻接表的形式抽象出网络拓扑无向图,在本实例中虚拟网络拓扑可通过以下字典形式表示成一个无向图,{'R1':['R2'],'R2':['R1','R3','R4'],'R3':['R2','R5'],'R4':['R2'],'R5':['R3']},并以该无向图为输入参数,编写最短路径算法,计算各路由节点间的最短路由路径和路由跳数。同时根据各虚拟主机接入情况,计算出各主机对间的路由跳数和数据包转发的TTL值。在本实例中,H1和H2通信经过3跳虚拟路由器,其TTL值为63;H1和H5通信的TTL值为61;H1和H7通信的TTL值为60;H2和H5通信的TTL值为62;H2和H7通信的TTL值为61;H5和H7通信的TTL值为63。该TTL值可准确的体现出数据包在路由转发时的路由跳数情况,因此,需将其作为流表项参数传给流表下发模块。
在步骤S8中,收集前面的虚拟主机参数生成流表项,包括每一个虚拟主机的IP、MAC、端口号以及每一对可通信主机间的TTL值。通过命令“ovs-ofctl add-flow”将流表参数以流表项的形式下发到br-int交换机中。如本实例中H1与H7通信,最终会添加流表如下,该流表成对出现,完成双向通信:ovs-ofctl add-flow br-int table=0,priority=10,dl_type=0x0800,nw_src=192.168.1.6,nw_dst=192.168.7.6,actions=mod_dl_src=fa:16:3e:10:2b:19,mod_dl_dst=fa:16:3e:17:f3:34,mod_nw_ttl:60,output:14
ovs-ofctl add-flow br-int table=0,priority=10,dl_type=0x0800,nw_src=192.168.7.6,nw_dst=192.168.1.6,actions=mod_dl_src=fa:16:3e:17:f3:34,mod_dl_dst=fa:16:3e:10:2b:19,mod_nw_ttl:60,output:11
同时针对其他可达主机对添加相应的流表。添加完各虚拟主机通信的流表规则后,H1发往H7的数据包经过br-int时会首先被流表项匹配,同时根据流表内容对数据包修改和重定向,不会进入虚拟路由器进行转发。当网络拓扑变化或删除时,会自动更改和删除相应流表。
在步骤S9中,整合上述过程,在计算节点运行web服务,向控制节点Restful API。当控制节点中向数据库中插入可达主机信息之后便通过API向计算节点发送通知,计算节点开始进行流表的生成与下发。最后编写统一入口函数,实现该路由控制平台的一键启动。虚拟网络中跨子网数据通信流程如图4所示,控制平台启动之前,VM1与VM2通信流量会经过Router1和Router2进行转发,存在一定的性能损耗;控制平台启动后,由于数据转发基于流表控制,可直接从br-int转发,无需再经过虚拟路由器。
进一步的,上述技术方案中,步骤S2中自主研发的虚拟路由器中部署了路由协议自动配置程序,可用于虚拟路由器启动时自动配置OSPF路由协议并与邻接路由器进行路由学习,用户无需登录每一个虚拟路由器进行路由协议的手动配置,降低了用户交互复杂度。
进一步的,上述技术方案中,步骤S3、S4、S5、S6、S7中所有对数据库的操作均通过调用统一的数据库控制模块完成对数据库信息的增删改查操作。该数据库控制模块采用python语言基于MySQLdb库开发,最终向上层应用程序提供一个对象,用户可调用该对象中的方法对数据库中的数据进行增删改查操作。
进一步的,上述技术方案中,步骤S6、S8中所有对OVS的命令操作均通过调用计算节点中Openvswitch代理模块中的方法完成对OVS命令的执行。该Openvswitch代理模块对OVS的所有命令和流表操作进行封装,向上层应用程序提供一个OVSBridge对象,用户可以对该对象实例化一个br-int实例,用户程序中通过该实例的方法对OVS的命令和流表进行操作,如可通过br-int.find_port('instance_name')查询虚拟主机对应的虚拟交换机端口号、通过br-int.add_flow()向虚拟交换机添加流表。
基于本实例,可展开但不限于以下测试工作:
(1)在路由控制平台启动前后,采用ping程序测试虚拟主机H1和H7之间的链路连通性,直观的观察该路由控制平台对网络性能的提升,测试结果如图6所示,在TTL值保持不变的情况下,网络延时得到大幅度降低,表明本发明实现的路由控制平台能够在保证数据包转发逼真性的同时大大提高网络性能。
(2)可通过netperf工具对网络性能的提升做进一步验证,本测试对比了采用Openstack默认的L3-agent路由、虚拟路由器、路由控制平台等三种不同路由方法时虚拟网络的吞吐量和链路延时,测试结果如图7和图8所示,结果表明在宿主机内采用本发明中的路由控制平台能够比L3-agent路由和虚拟路由器具有更大的网络吞吐量以及更小的链路延时。
本发明提出了一种云计算中高性能路由转发方法,采用SDN设计思想,设计了一种路由控制平台,能够实时的将云计算中虚拟网络拓扑中的路由表映射成数据转发层中的流表,实现对宿主机内跨子网数据包的修改和重定向。在保证了跨子网数据包转发逼真性的同时,实现了网络性能对用户的无感提升
上述具体实施方案仅用于说明本发明,而并非对本发明的限制,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化,所做的任何修改、改进,均应在本发明的保护范围之内。