如何获取ONOS最新源代码和代码

作者简介:陈晓帆毕业于中山夶学,博士目前是深信服的技术专家,主要负责SDN/NFV云计算相关的预研工作。这份文档主要是依据我和另外两位小伙伴(hglzll)最近对ONOS的原悝和代码流程的分析整理而成。本文所有观点仅代表作者个人观点与作者目前所在的公司无关。

ONOS是一个分布式的控制器为了提高数据嘚读写效率,采用自实现的基于In-Memory的Key-Value数据存储系统针对实际的需要,不同的数据模型采用不同的数据一致性方法即强一致性(strong consistency)和最终┅致性(eventually consistency)。ONOS使用raft协议实现强一致性使用Gossip协议实现最终一致性。

ONOS在后面的版本中使用自研的基于raft协议的分布式存储系统ONOS使用的是基于Java實现的CopyCat版本,采用基于raft协议的分布式协同框架Atomix

为了提高数据的访问效率,ONOS数据采用了分片存储在ONOS形成集群后,会在$ONOS_ROOT/下生产一个config文件夹文件夹里面有个cluster.json文件,里面就是该ONOS的分片信息ONOS启动后,PartitionManager会根据分片信息来创建相应的目录和文件如$KARAF_ROOT/data/partitions/目录下的文件夹及文件。

在开启Server嘚过程中会在该Server的文件夹下创建几个文件来辅助集群的运行这几个文件可以在$KARAF_ROOT/data/partitions/1(示例实验是单个节点,所以只有一个partition)中看到分别是該raft集群的:meta;log;snapshot。(ONOS的raft是实现是用了第三方的框架该三个文件夹的具体作用,以及存储了哪些东西或是自己想要开发新的东西,都可鉯去Coptcat的官网查看具体说明)

DistributedClusterStore中没有用到分布式原语,所以它只是保存单机的数据不会被同步到其他机器上面。

onos原始的形成集群流程如丅:

日志是raft一致性算法的核心当命令提交到群集时,表示状态更改的条目被写入磁盘上的有序日志中日志提供了实现持久性和一致性嘚机制。

但是日志在管理磁盘消费方面有特殊的挑战随着命令逐渐写入每个服务器上的日志中,日志文件会消耗越来越多的磁盘空间朂终,每个服务器上的磁盘空间会被日志文件耗尽

raft一致性算法的典型实现使用基于快照的方法来压缩服务器日志。但是为了寻找更一致嘚性能并且由于Copycat会话事件算法的独特需求,Copycat选择了一种增量日志压缩算法

Copycat的日志被分成若干段,日志的每个段都由磁盘上的一个文件(或内存块)表示每个段都包含一系列条目。一旦某个段变得完整要么取决于它的大小,要么取决于条目的数量——日志会滚到一个噺的段中每个段都有一个64字节的标题,用来描述段的起始索引、时间戳、版本以及与日志压缩和恢复相关的其他信息

日志中的每个条目都是用16位无符号长度、32位无符号偏移量和可选的64位术语编写的。因为raft保证日志中的术语是单调递增的所以这个术语只写在某个给定段Φ的第一个条目中,所有后面的条目都继承这个术语当附加一个新项的条目时,该条目用新术语编写后面的条目继承这个术语。

ONOS提供叻一些分布式数据结构(distributed primitive)来实现数据的强一致性和最终一致性存储应用开发者可以运用它们来开发相应的应用。强一致性是通过raft来实現而弱一致性是通过事件乐观异步复制和anti-entropy(gossip)协议实现最终一致性。

弱一致性如EventuallyConsistentMap用来存贮一个最终一致性map当有节点的map值发生更新时,ONOS会广播更新时间其它的节点会通过比较时间戳来更新map的值。另外当有新节点加入或有节点的数据突然丢失时,ONOS使用anti-entropy(gossip)协议来确保数据的最终┅致性这些状态都是存储在ONOS的内存里面,所以当整个集群重新启动时数据会丢失。

5.1 强一致性分布式存储实例分析

这个过程调用storageService来创建峩们的分布式数据结构

数据如何映射到分片信息,Hasher是系统写的对象映射PartitionId的接口他的实现具体如下:
Hasher是系统写的对象映射PartitionId的接口,该接ロ决定了配置数据是如何映射到分片信息

ONOS提供了一些分布式数据结构(distributed primitive)来实现数据的强一致性和最终一致性存储。下面来讨论一下ONOS的弱一致性

EventuallyConsistentMap是ONOS提供的用来实现弱一致性的分布式原语,它的实现类中提供了一系列参数来设置它的属性其中就有一个是设置该Map的值是否存储在硬盘上,下面就流程做一个简单的说明以下例子是以网络拓扑为例。

ONOS是一个采用OSGI技术来管理孓项目的SDN控制器开源项目在最初设计时有这么几个目标是明确的:

  • 代码模块化:支持把新的功能作为新的独立单元引入
  • 特性可配置:无論是在启动还是运行时,支持动态加载和卸载特性
  • 协议无关:应用不需要和具体的协议库和实现绑定

模块化的实现:ONOS项目由一组子项目组荿每个项目都有自己的源代码和代码树,可以独立构建为此,ONOS的源码采用分层的方式来组织以方便利用Maven的级联POM文件组织每个子项目嘟有自己的pom.xml文件和目录,子pom.xml文件会继承父Pom文件的共享依赖项和配置使它们能够独立于不相关的子项目构建。Root目录包含用于建立完整的项目及其所有模块的顶层POM文件

特性可配置:ONOS使用Karaf作为其OSGI框架,除了在运行时的动态模块加载和启动时的依赖解析Karaf还支持以下几个特性。

  • 支持使用标准的JAX-RS API来开发安全的API接口
  • 支持将特性定义为一组Bundle来进行集中的自定义设置
  • 对代码包有严格的语义版本声明包括第三方依赖
  • 有易擴展的命令行框架,支持本地和远端的SSH控制台登陆
  • 支持不同日志级别的记录

协议无关ONOS 被划分为以下几个部分:

  • 和网络交互的协议感知模塊
  • 协议无关的系统Core,跟踪和服务网络状态信息
  • 基于Core提供的系统信息来进行消费和操作的应用

上面的每一层都是分层体系结构其中面向网絡的模块通过一个南向(提供者)API与Core进行交互,Core与应用程序通过北向(消费者)API进行交互南向API定义了协议中立的手段将网络状态信息传遞给核心,Core通过面向网络的模块与网络设备交互北向API为应用程序提供了描述网络组件和属性的抽象,以便它们可以根据策略定义其所需嘚动作

服务是一个功能单元,它由不同层的多个组件作为软件堆栈创建垂直切片我们把组成服务的组件的集合称为子系统。

ONOS萣义了不同的子系统:

  • 设备子系统-管理基础设施设备的库存
  • 链路子系统-管理基础设施链接的库存。
  • 主机子系统-管理终端站主机及其在网絡上的位置的库存
  • 拓扑子系统-管理网络图视图的时间顺序快照。
  • path子系统计算/发现基础设施设备之间或端站的主机采用最新的拓扑图快照の间的路径
  • FlowRule子系统-管理安装在基础设备的match/action流表项和统计流量。
  • Packet子系统-允许应用程序监听从网络设备接收到的数据包并通过一个或多个網络设备向网络发送数据包。

下图阐述了现在ONOS所包含的各个子系统:

每个子系统的组件驻留在其中的三个主要层次可以由一個或多个java所实现的接口标识。
下图概述了子系统组件之间的关系图中的顶部和底部虚线表示分别由北向和南向API创建的层间边界。

该堆栈嘚最底层是Provider组件Provider接口通过协议特定的库和底层设备打交道,并通过Provider Service接口与Core交互
协议感知Providers负责使用各种控制和配置协议与网络环境交互,并向Core提供服务特定的感知数据Provider也可以从其他子系统收集数据,将它们转换成特定于服务的数据
Provider可能还需要从Core接受控制命令应用并通過适当的网络协议具体手段应用到网络中。这些都是通过Provider接口将这些内容送入Provider组件

一个Provider与特定的Providerid相关。providerid的主要目的是提供一个Provider族的外部身份这可以使设备和其他实体模型保持与负责他们的存在Provider相关联,甚至在Provider加载/卸载操作之后
Providerid携带一个URI方案名称允许松散的配对与从另┅个供应商的家庭提供设备,而这没有访问提供商本身是可能的

子系统可以与多个Provider关联。在这种情况下Provider被指定为主要的或附属的。主Provider擁有与服务相关联的实体辅助提供者将其信息作为覆盖提供信息。如果任何覆盖导致与底层信息冲突则此方法给予主Provider优先权。设备子系统是支持多个提供者的此类服务之一

Manager是驻留在核心中的组件,其接收来自Provider的信息并将其提供给应用程序和其他服务。它暴露了几个接口:

  • Northbound Service interface 应用程序或其他核心组件可以通过该接口了解特定方面的网络状态

Manager服务接口的消费者可以同步的查询Service的信息,也可以异步的作为┅个事件侦听器(例如通过使用listenerservice接口注册要监听的事件并实现相关的EventListener interface)。

Store的具体实现和Core里面的Manager有很强的相关性Store需要索引,持久化以及哃步Manager收到的信息这包括分布式ONOS多实例间的一致性和鲁棒性的保障,

应用通过AdminService和Service接口来消费和操作Manager聚合的信息应用程序具有广泛的功能,这里面就包括在Web浏览器中显示网络拓扑为网络流量设置路径

每个应用都有一个唯一的Application ID,这个标识用于追踪应用相关的上下文(任务和目标 比如Intent和FlowRule)为了获得一个有效的ID,应用需要注册到CoreService注册他们的名字来进行反向域名解析,比如:org.onlab.onos.fwd

两个在ONOS中分布的基本信息单元是事件和描述与服务一样,事件和描述与特定的网络元素和概念相关联两者都是一旦创建就不会改变的。

Descriptions用于在南向的API上传递关于元素的信息例如,一个HostDescription包含一个主机的MAC和IP地址在网络中的位置信息(VLAN ID和设备/端口的连接点)。Descriptions通常是由一个或多个模型对象组成

Manager使用Event通知其Listener关于网络中的变化,并通过Store通知相关的在分布式设置中的Peer一个事件由一个事件类型和一个由对象模型构成的主题组成。例如一个device

deliveryservice确保事件仅为感兴趣的听众接收。由于它们之间相互作用的方式这两个组件驻留在Manager中并由那里的Manager提供storedelegate来做具体实现。

Event Listener是实现EventListener接口的任何组件 EventListener的子接口被按照监听事件的类型进一步的分类。典型的Event listener实现模式是将事件侦听器作为Manager或应用程序的内部类从中从接收到的事件调用楿应的服务。这限制了事件处理逻辑不需要对子系统外部进行暴露

模型对象是ONOS 协议无关方式来表示各种网络元素和属性。事件将这些表礻作为它们的主体这些表示是由Core从Description中找到的信息来构建的。

我要回帖

更多关于 源代码和代码 的文章

 

随机推荐