OpenVirteX体系结构之组件(一)


【SDNLAB独家译稿】(接本系列上一篇《OpenVirteX体系结构之综述》,本文翻译第二章2.1-2.5小节,其他部分的翻译会陆续发布。)

2 组件

概要

本节描述OVX所使用的代表各种网络元素和OpenFlow消息的类和包。

2.1 概述
2.2 组件状态机
2.3 组件持久性
2.4 交换机(Switches)
2.5 端口(Ports)
2.6 链路和路由(Links and Routes)
2.7 地址(Addresses)
2.8 主机(Hosts)
2.9 网络拓扑
2.10 全局共享映射(Shared Global Mappings)
2.11 信息(Messages)

2.1 概述

OVX的网络表示,无论是物理的还是虚拟的,均是交换机、端口、链路、主机和地址对象的集合。对于一个租户来说,这些组件与实际的数据路径(datapath)、端口、链路、主机相比并不会表现出什么差异。在上一节中所描述的全局映射在虚拟组件对象和物理组件对象之间建立了一个N对1的映射,用于将租户拓扑映射到基础设施上。

为了减少基础设施和OVX对象的混淆,在文档中,我们遵循以下几个约定:

  • “基础设施”是指运营商或供应商的实际网络。
  • “路径”(datapath)一般在提及基础设施使用,与“交换机”(switch)可互换使用。
  • “网络”本身指的是基础设施建设,OVX中以“物理网络”和“虚拟网络”来表示。
  • 任何像交换机和链路这样的资源均是OVX的结构。
  • “租户控制器”,“控制器”,“网络操作系统”和“NOS”是可互换使用的。

2.1.1 实现类(Implementing Classes)

OVX由Java语言实现。这些组件被定义为包中的类,在[net.onrc.openvirtex.elements.*]下,每个组件是由一个基类定义。基类如下表所示:

OVX-2.1.1 table1

这些类派生出子类来实现物理和虚拟版本的每个组件,当前的组件类和他们的父类如下表所示:

OVX-2.1.1 table2

例如,“PhysicalPort”是网络交换机的端口,“OVXSwitch”提出的是OVX提供给租户的一个虚拟交换机。为了方便,大多数表示基础设施的组件名称以“Physical”开头,代表租户网络的组件以“OVX”开头。值得注意的是,Host只有虚拟表示形式。

OVX通过创建一个PhysicalNetwork实例来建立物理网络的声明。该PhysicalNetwork实例由交换机、链路和端口对象填充创建,通过各种网络发现技术,使得他们在基础物理设施中被发现。虚拟网络表示或OVXNetwork实例通过调用创建网络对象的API来建立,并且可将它们映射到物理网络组件。网络发现和JSONRPC API分别在3.4和3.9节介绍。

2.2 组件状态机

网络元素与多个状态均有关,这些状态与其他元素的状态相互依赖。例如,如果网络中的一台交换机关机,它的全部端口和这些端口连接的链路也将失效,网络拓扑结构的改变将被OVX所感知。

为了允许OVX追踪和描述这些组件的状态和它们是怎样交互的,组件类实现有限状态机(FSM),状态的转移是依据其他状态所触发的,FSM驱动是由隐式依赖图所决定的。

本部分将介绍这些状态。

2.2.1 基本FSM状态

除了Address类和OVXSwitch子类,每个组件类目前处理四个状态:

  • INIT:刚刚创建,也就是说,它的构造器刚被调用
  • INACTIVE:惰性的网络事件,也就是OpenFlow消息和网络发现
  • ACTIVE:正常操作状态,所有事件处理像预期的那样进行
  • STOPPED:毁坏,必须重新创建对象才可以再次使用

例如,管理端口禁用状态是INACTIVE,操作者将OVXSwitch从网络中移除后为STOPPED。

有限状态机现在用Java枚举来实现。选择这种方法是由于这样较易于修改—如果需要一个新状态,我们仅是简单地添加另一个状态和一些默认行为到FSM,有限状态机的每个组件类被命名为State,例如,PhysicalSwitch和OVXSwitch的有限状态机被表示为SwitchState。

2.2.2 组件FSM接口

FSM组件类继承于Component接口,该接口定义了一些状态转移的方法,为了统一,每个方法与一系列动作相关联,使得可以对一个组件进行函数化的状态转移:

  • register() [INIT->INACTIVE]: 将组件添加到映射和存储,检查依赖关系(例如,一个新端口在交换机不存在的时候是不可以被创建的)
  • boot() [INACTIVE -> ACTIVE]:打开控制信道,激活相关依赖组件(例如:在两个端口都boot()的状态下建立链路连接)
  • teardown() [ACTIVE -> INACTIVE]:关闭控制信道,关闭相关组件(例如:一个端口被禁用,链接的链路也会被禁用)
  • unregister() [INACTIVE -> STOPPED]:从映射和存储中移除,在必要时关闭或解注册相关组件(例如:链路的连接端口若已处于unregister()状态,那么这一条链路将不再存在,并且也必须处于unregister())

图2.1总结了一般组件的有限状态机和状态转移的相关方法。每个OVX类衍生自实现类Component和有限状态机(FSM)的某种形式或另一种形式。

OVX-2.1fig

图2.1

注意:一个组件只能从INACTIVE状态激活或停止,这样做是为了保证在把某些东西加入网络表示或从网络表示中删除之前相关的依赖关系会得到安全处理。本节讨论如何将组件的有限状态机连接在一起,以实现组件的依赖,并实现网络状态同步。

2.3 组件持续性

虚拟组件是由管理员配置。管理员可能需要在OVX重启过程中持续配置。OVX可在远程数据库中存储配置以用于在OVX重启的系统恢复。

可被存储的组件类实现Persistable,接口类有如下抽象方法:

OVX-2.3 table1

接口类Persistable定义于[net.onrc.openvirtex.elements],继承于Persistable类的这些方法涉及到与数据库的序列化/反序列化。具体实现细节会在第三部分介绍。

其余的小节描述包含实现各种元素的类。

2.4 交换机Switches[包net.onrc.openvirtex.elements.datapath]

交换机是一个数据路径的表示,由一组端口、交换机ID(DPID)、功能/属性摘要以及一个通道来描述。

交换机子类作为OVX和租户NOS(OVXSwitch)之间以及OVX和数据通道(PhysicalSwitch)之间的OpenFlow信道的定位点。到达OVX的所有消息,要么会被北向或南向事件循环直接处理,要么通过特定消息处理方法sendMsg()和handleIO()处理。下面的类继承基类Switch:

PhysicalSwitch (extends Switch):代表网络中已经连接到OVX的交换机。在OVX与交换机握手期间,PhysicalSwitch的属性由OVX接收到的OpenFlow信息内容来进行填充,在OVX运行期间status信息被接收。PhysicalSwitch保持交换机中发现的流表,并且为OpenFLow XID设置XID转换器,OpenFlow XID用来控制发送到租户控制器或从租户控制器接收到的流量。

组件:

  • StatisticsManager statsMan : 相关datapath统计集合
  • AtomicReference<Map<Integer,List>>flowStats :以租户为key建立的流表、流表项
  • AtomicReference<Map<Short, OVXPortStatisticsReply>> portStats : 以端口号为key的端口统计
  • XidTranslator translator : XID 复用器
  • SwitchState state : 物理交换机实例的有限状态机

PhysicalSwitch包含一个内部类SwitchDeregAction,用于同步虚拟元素和它映射的物理元素之间的状态。3.6部分会详细地解释OVX的状态管理。

OVXSwitch (extends Switch):是OVX虚拟交换机表示的父类,即租户控制器可见的交换机。OVXSwitch实现送到租户FeaturesReply信息,和维护虚拟流表以及通过buffer ID进行对PacketIn的缓冲区映射。此外,OVXSwitch能够连接到多个控制器和处理控制器角色。角色管理在3.4节中讨论。

组件:

  • LRULinkedHashMap<Integer, OVXPacketIn> bufferMap
  • Integer tenantId : 该交换机所属的租户网络ID
  • OVXFlowTable flowTable : 维护交换机流表条目的结构
  • XidTranslator channelMux : 信道复用,支持多种NOS连接
  • RoleManager roleMan: 角色消息管理
  • SwitchState state : OVXSwitch实例的有限状态机

此外,OVXSwitch直接实现一些OFFeaturesReply字段:

OVXSwitch的两个子类表示交换机虚拟化的两种模式:

OVXSingleSwitch:在网络中映射到一台交换机的虚拟交换机。

OVXBigSwitch:在网络中映射到多台交换机的一台虚拟交换机,并把这一组交换机作为一个单独的大虚拟交换机(BVS)的”crossbar”,OVXBigSwitch通过它虚拟的“crossbar”来维护路由表。

组件:

  • RoutingAlgorithms alg:计算路径算法,可以手动指定(手动),也可以是最短路径(SPF)。
  • HashMap<OVXPort, HashMap<OVXPort, SwitchRoute>> routeMap:通过BVS的映射,给定入口和出口端口。

图2.2显示在虚拟网络中的3个交换机类。

OVX-2.2fig

图2.2:每个PhysicalSwitch(PSW1,2和3)直接映射到一个交换机(交换机1,2和3)中的基础设施。虚拟交换机vsw1是直接映射到PhysicalSwitch PSW1的OVXSingleSwitch实例。vsw2是映射到PSW2和PSW3一个OVXBigSwitch实例,并且使用SwitchRoute作为它们之间的链接。租户网络可以有两种类型OVXSwitch,只要他们不使用相同的PhysicalSwitches即重叠的PhysicalNetwork。最后,交换机实例是OpenFlow信道(蓝色)的终止点。

2.5 端口[package net.onrc.openvirtex.elements.port]

交换机端口作为存储在交换机portMap结构中Port的子实例。端口有部分属性从OpenFlow协议中的ofp_phy_port结构中继承。OVX又加入了如下内容:

关于ofp_phy_port的细节,请查阅OpenFlow协议。标识isEdge为true代表没有链路连接在此端口上。注意,端口有一个state属性,这是ofp_phy_port的一部分,这与端口的有限状态机并没有关系,但这个值会影响到Port子类的有限状态机,在3.6节会说明这个问题。

OVX实现如下两个端口子类:

PhysicalPort(extends Port<PhysicalSwitch,PhysicalLink>)代表物理交换机上的一个端口。端口数和特性可以在交换机的Feature Reply中找到。PhysicalPort保持了它与虚拟端口之间的映射。在租户网络中,物理端口至多映射一个OVXPort。

组件:

  • Map<Integer, HashMap<Integer, OVXPort>> ovxPortMap
  • PortState pstate : 端口的状态机

OVXPort(extends Port<OVXSwitch,OVXLink>)是OVXSwich上的一个端口。OVXPorts通过管理配置来实现实例化。

组件:

  • Integer tenantId : 该端口OVXSwitch所属网络的租户ID
  • PhysicalPort physicalPort : 端口映射到的PhysicalPort
  • PortState pstate : 端口状态

更多精彩请访问下一篇《OpenVirteX体系结构之组件(二)》

译自:北邮FNL实验室张歌,http://ovx.onlab.us/documentation/architecture/


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/2703.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于14-10-28
1