李松州,潘正高,辛政华,卢 彪
(宿州学院 信息工程学院,安徽 宿州 234000)
软件定义网络(Software Defined Network,SDN)是一种将控制平面和数据平面解耦的新型网络架构,SDN带来了可编程网络和网络研究的新趋势[1].SDN架构抽取一个逻辑集中的控制器,可以维护整个网络的全局视图,这使得控制器能够做出比传统网络更好的路由决策.此外,控制平面通过OpenFlow协议控制数据平面中的交换机,控制器计算流表下发给交换机用于转发数据包,而交换机只需要根据接收到的流表项转发数据包即可,具体架构如图1所示.SDN架构中允许网络开发人员在控制器上编写部署应用程序来控制网络,SDN将网络智能集中到控制平面中,它增强了可编程性、灵活性和逻辑集中的智能化.但是,使用单个控制器缺乏可扩展性和存在单点故障 (Single Point Of Failure,SPOF)问题.
近年来,提出的分布式SDN控制器架构[2-3]已成为实现SDN更好扩展性的解决方案.在这样的架构中,存在多个SDN控制器,每个SDN控制器负责控制网络中的一部分交换机设备.由于鲁棒性对于数据中心网络很重要,因此SDN架构仍然面临一个关键挑战,即SDN控制器故障转移问题[4].如果控制器崩溃,故障控制器管理的交换机将无法工作,则需要使用另一个控制器来接管其角色,并对交换机进行控制,相关人员已经提出了多种SDN控制器架构来克服这一问题.
图1 SDN架构原理
为解决分布式SDN网络中的控制器故障问题,近年来学者们提出了一些故障处理机制.Zhang等[5]提出了基于生存性模型的SDN控制器故障备份方法,设计了度量来估计多控制器网络的生存能力,利用传输时延要求和定义的生存性度量,为SDN控制器设计合适的备份方法,其考虑了网络延迟,以减少控制器故障带来的损失.Muller等[6]提出了启发式框架来定义备份控制器列表,该列表可以开发成两个特定的启发式,基于接近的启发式尝试选择最近的控制器实例作为备份,而基于剩余容量的启发式尝试在选择控制器实例时考虑资源消耗.两种方法都可以为每个主控制器生成一个备份控制器列表.
Hsieh等[7]提出了基于模拟退火的高效故障转移 (SAEF) 机制,作为应用程序在全局控制器中运行.SAEF使用多个全局控制器来检测本地控制器故障,并计算交换机迁移计划,重新进行交换机和控制器关联,以恢复控制器故障.Yang等[8]提出了低错误率的故障检测服务(FDLM)机制,使用修改后的 gossip协议进行心跳消息传输和失败识别,并由多个控制器来做出故障决策,重新选择领导控制器,该方法定义了一个额外的状态来报告对特定控制器的错误检测,以实现低错误率,减少不必要的SDN控制器故障转移.
Kuroki等[9]提出了角色管理服务器机制RMS,用于检查每个控制器的CPU利用率,并请求其它控制器向未发布RMS利用请求的可疑控制器发送保活消息.如果超过一半的控制器接收到保活消息的回复消息,RMS将把该控制器视为一个健康控制器,否则认为是一个故障控制器.Chan等[10]提出了快速控制器故障转移机制FCF-M,该机制包括用于多个SDN控制器故障检测的循环故障检测机制.在这种机制中,所有控制器都被链接成一个圆圈,并且每个控制器使用自适应超时来检测前一个控制器的时间戳以进行控制器故障检测.当一个或多个控制器超时发生故障时,剩余的控制器将接管其职责,以实现交换机迁移.该方法仅使用一个检测控制器进行故障判定可能会在故障检测期间增加假阳性率.
基于以上分析,本文提出了基于消息通知的SDN控制器故障处理机制FHMN,使用多个控制器检测故障,以降低故障误判率,通过迁移算法保证故障迁移后控制器负载的平衡,具有更好的可靠性.
在SDN网络中提出了基于消息通知的SDN控制器故障处理机制FHMN,用于处理控制器故障问题,FHMN适用于分布式SDN控制器的架构,并作为控制器中的一部分运行,具体包括负载测量组件、消息通知组件、故障检测组件和故障迁移组件.各个组件相互协作共同完成控制器故障的检测和转移两个主要任务,具体架构如图2所示.
图2 FHMN机制
本文使用负载测量组件统计控制器和交换机的负载.在SDN中,控制器用于对数据平面中的交换机进行管理,负责处理交换机提交的Packet-in、Hello等消息.其中主要任务是处理Packet-in消息,用于计算流表下发给交换机来转发数据包,而交换机只需要根据接收到的流表项转发数据包即可,所以控制器的CPU、内存等资源消耗主要是由于处理Packet-in造成的.因此,通过统计Packet-in消息的总到达速率来衡量控制器的负载情况,LP(Ci)表示Ci控制器的负载,另外将每个交换机提交Packet-in消息的速率作为每个交换机产生的负载压力,记为LP(Sij),LSi={LP(Si1),LP(Si2)...LP(Sim)}表示控制器Ci下交换机负载的集合,按照负载大小降序排列,如公式(1)所示.
(1)
该组件用于控制器之间通信消息的发送,本文将控制器的角色分为全局控制器Cg和工作控制器Ci,全局控制器主要负责故障决策和迁移,工作控制器主要负责处理交换机的Packet-in等异步消息.
首先用IP地址表示每个控制器的ID,通过ID选择出ID最小的控制器作为全局控制器,其余作为工作控制器.在正常工作期间,各个控制器每隔周期T,将向其它所有控制器发送心跳消息,用于告知其它控制器其工作正常,控制器将使用故障检测组件来检测控制器的故障.另外,为了便于控制器故障后交换机迁移计划的制定,在全局控制器和工作控制器之间传递负载消息,消息通知组件的工作过程如图3所示.
图3 消息通知组件正常工作过程
根据控制器角色的不同,本文考虑以下两种控制器故障情况.
(1)情况1:工作控制器故障检测,控制器之间相互发送心跳消息,各个控制器会记录每次接收其它控制器心跳消息的时间戳,将控制器Ck时间戳记为TSk,Tcurrent表示当前时间.如果控制器Ci的当前时间与最近一次接收控制器Ck心跳消息时间戳的差超过设定的故障超时阈值∂,控制器Ci就将控制器Ck判定为故障怀疑对象,如公式2所示;然后向全局控制器Cg发送故障通知消息,全局控制器Cg会进行故障统计,当收到所有控制器发送的故障通知消息,作出最终的故障决定并广播故障确认消息,则判定控制器Ck为故障控制器,标记为Cf.然后启动故障迁移组件将故障控制器下的交换机重新分配,具体工作过程如图4所示.
图4 工作控制器故障检测过程
(2)
(2)情况2:全局控制器故障检测,当某个控制器Ci在时间差大于故障超时阈值∂,仍未收到全局控制器Cg发送的心跳消息,则将全局控制器Cg判定为故障怀疑对象,然后将向剩余ID最小的控制器发送故障通知消息,当它能够收到所有故障通知时,则重新选择该ID最小的为全局控制器,最后由新选择的全局控制器Cg启动故障迁移组件执行故障转移,具体控制过程如图5和图6所示.
图5 全局控制器选择
图6 故障确认
该组件只在全局控制器中被故障检测组件调用时执行,由于全局控制器与所有工作控制器互相发送负载消息,所以全局控制器拥有所有控制器和交换机的负载信息.因此,全局控制器Cg可以根据负载信息制定迁移计划,将故障控制器下的交换机迁移到正常的工作控制器,从而完成故障的转移.LP={LP(C1),LP(C2),…,LP(Cn)}表示所有控制器负载的集合,LSf={LP(Sf1),LP(Sf2),…,LP(Sfm)}表示故障控制器Cf下交换机负载的集合,并按照负载大小降序排列.故障迁移计划如下:依次遍历LSf集合,每次从中取出负载最大的交换机,然后再从LP中找到负载最小的控制器作为接收控制器Ct(计算方法如公式(3)),并迁移到接收控制器Ct上,重复该过程,直到故障控制器下的交换机迁移完成.具体过程如算法1所示.
Ct=argCimin{LP(Ci)|i∈[1,n])}.
(3)
为了评估提出的FHMN故障处理机制,在Ubuntu14.04的Linux系统中搭建SDN测试平台和其他必要工具.Mininet用来创建和模拟SDN网络,OpenvSwitch用于仿真运行OpenFlowv1.3的交换机,配置了16个交换机.在方案中,分布式SDN控制平面是基于4个Floodlight控制器构建的,在数据平面中,每4个OpenFlow交换机连接到一台控制器作为Master角色来管理,提出的故障处理机制作为控制器的一部分运行,以进行故障检测和处理.设置周期T=1s,故障超时阈值∂为2T,使用hping3工具生成流量,用于将Packet-in数据包发送到控制器.
算法1. 故障迁移算法
本文在故障检测的准确性方面与FCF-M机制、RMS机制进行了对比,并考虑了故障转移后的负载平衡,实验证明本文方法更有利于提高控制器平面的可靠性和处理性能.
控制器负载的变化情况如图7所示,在实验中关闭C1控制器模拟全局控制器故障,在未改变各交换机发送Packet-in速率的情况下,通过负载测量组件统计各控制器接收Packet-in速率的变化情况.当时间达到6s时,C1发生故障后,其余控制器接收的Packet-in速率明显增加,说明提出的故障处理机制能检测到控制器故障,并进行了故障转移,将故障控制器C1下的交换机迁移到其余控制器.对比迁移前后各控制器负载,可知故障处理后各控制器的负载实现了更好的负载均衡效果.
图7 控制器负载变化
3种故障检测机制的误判率变化情况如图8所示,在相同的消息丢失情况下,提出的FHMN机制的故障误判率明显低于FCF-M和RMS机制,能够有效降低故障的误判,以免造成控制器资源的浪费和不必要的交换机迁移.本文提出的FHMN机制在进行故障检测时,使用了未发生故障的所有控制器进行故障判定,不易发生因为消息丢失而造成的误判,FCF-M仅通过前一个控制器判定,RMS使用一半以上的控制器进行故障的判定.
图8 故障检测误判率
本文提出了基于消息通知的控制器故障处理机制FHMN,它由控制器故障检测和故障迁移组成.在控制器故障检测中,控制器之间通过心跳消息互相监测,并通知全局控制器,由全局控制器根据收集的故障通知做出最终的故障决断,与相关机制相比,提高了故障检测的可靠性,降低了故障的误判率;同时在故障转移中重新分配交换机和控制器之间的关系,考虑了故障转移后控制器之间的负载均衡,有利于提高控制器平面的处理性能.