认识一下SONiC到底是啥。开始可能有好多地方理解有误,请多指正。文章参照SONiC文档。

概览

SONiC(Software for Open Networking in the Cloud)是安装在Linux上的软件合集,运行在硬件交换机上,在数据中心网络中提供路由功能。因为是一个合集,所以我们首先看一下他由哪些东西组成。

组件

由上图可以看出SONiC由几层组成,由下到上分别是Hardware components,Drivers,Linux Kernel Interface,Other source/bin,SONiC Open Source,Applications。

Hardware components

硬件组件是指交换机内所有物理组件,包括风扇、电源、LED和网络收发器。

Drivers

应该是各个厂商提供的相关驱动。

Linux Kernel Interface

图上看主要是netdev和sysfs。

Other source/bin

暂时不清楚。

SONiC Open Source

这是重头戏,主要包含了SAI API、ASIC Control Software、Object Library三块。

  • SAI(Switch Abstraction Interface)是标准的C语言API,有特定的交换机ASIC的SDK实现。
  • ASIC Control Software是指SWSS(Switch State Service),主要是收集硬件交换机的状态信息。
  • Object Library

SWSS

SWSS是一组软件,提供了数据库接口,用于网络应用程序和网络硬件交换机进行通信和状态表示。

网络应用程序读写数据库APP_DB。比如netlink route syncer,guagga FPM route syncer,ACL control,QoS control,LB,telemetry control等等。
Orchestration agents同时读写APP_DB和ASIC_DB。他负责验证和传输应用数据到SAI对象的逻辑。
syncd进程同时读写ASIC_DB和SAI SDK。

kv数据库

选择kv数据库,是为了提供与语言无关的接口,并且提供数据持久性,复制和多进程通信的方法。
Redis被选择为底层数据库引擎,但是未来可能会改变。

网络应用

SONiC网络应用程序使用SwSS编写完全独立于硬件的通信细节。应用程序仅仅订阅所需的数据。例子包括L3路由、L2桥接、ACL、QoS、Telemetry streaming、Tunneling、link aggregation、LB和策略路由等。

Orchestration Agent

该模块主要是负责在APP表和ASIC表之间转换和复制数据。每个ASIC表只能有一个生产者。目前只有一个业务流agent,后面可以添加。只有一个Orchestration Agent可以写入ASIC_DB数据库。

syncd

syncd主要是负责在ASIC_DB和符合SAI的ASIC SDK之间复制数据,每个SAI SDK只能有一个syncd进程。

Object Library

主要负责SONiC应用和外部应用的交互。Object Library定义了两种类型的应用程序:

  • 客户端,对Objects执行创建、设置、获取和删除操作。
  • 服务端,执行客户端的请求操作

另外,Object Library实现了publish/subscribe模型。服务端发布事件;客户端订阅事件和对象。客户端可以订阅创建、修改和删除对象时生成的事件。

SONiC架构的关键租户是允许停止、启动、重启和替换进程的。

Applications

主要是通过docker运行一些网络相关功能的app。

Database

SwSS通过使用前缀命名实现redis表的概念,设计producer/consumer时要确保数据的完整性。

APP_表是针对每个场景设计的,比如:ROUTE_TABLE和NEIGH_TABLE。

ASIC_表是从SAI头文件创建的,比如ASIC_sai_unicast_route_entry_t和ASIC_sai_neighbor_entry_t。

Table Operations

Producer

SET - insert or update a key -> fileds and values.
DEL - deletes a key

Consumer

POP - get a table change notification, the key name and the key->feilds and values and operation[SET, DEL]
SELECT - check if a table notifications exists

Transactions

SwSS在内部实现transactions,所以producers和consumers可以使用类似队列的方法与数据库保持同步。

每个TABLE,都有用于内部通知实现的QUEUE key。

下面介绍一个工作实例:

intfsyncd进程使用swss producer API对APP.INTF_TABLE执行SET。producer API在TABLE中配置key/value,并且为每个QUEUE key设置一个等效条目。

OA(the orchestration agent)是APP.INTF_TABLE的consumer,OA将从swss consumer API收到APP.INTF_TABLE数据更改的通知。consumer API将从QUEUE key中pop key、value和OP。intfsyncd写入APP.INTF_TABLE的数据保持不变。

详细信息参照代码:

Tablename+”_KEY_QUEUE”
Tablename+”_VALUE_QUEUE”
Tablename+”_OP_QUEUE”

Switch Data Service Database Schema

定义了两个数据库,APP和ASIC。SwSS之外的APP期望通过明确定义名称的keys添加到APP数据库来存储数据。ASIC数据库存储硬件同步agent使用的数据。ASIC数据库中的key预计严格遵守SAI属性。

keys必须看起来像是表名的字符串作为前缀。允许的key是”[a-z][A-Z][0-9]_”并且以”_TABLE:”结尾

在redis中,数据库只定义我的数字:

数据库0 = APP_DB
数据库1 = ASIC_DB
数据库7 = TEST

schema

详见文档

Database 1 – ASIC_DB

ASIC数据库存储硬件同步agents的数据。ASIC数据库中的keys严格按照SAI属性命名。详情见文档。

Switch state service Layer 3 Implementation

本节提供了如何学习BGP路由并将其传播到ASIC的示例。以quagga为例,但也可以使用其他路由APP。

Platform Management Service

平台管理服务管理外围设备,比如风扇、PDU、LED和收发器。通用交换机平台利用I2C总线,通常与一个或者多个I2C主设备来管理这些设备。这些器件通常通过一些列的I2C多路复用器连接到I2C主器件。

Linux内核具有非常成熟的I2C子系统和定义良好的API。它支持几乎所有常用的I2C设备(主设备、多路复用器、传感器)。然后,SONiC利用Linux内核公开接口来管理这些设备。在这种方式中,SONiC首先为这些I2C设备安装kernel drivers,创建I2C书拓扑,并暴露像hwmon这样的sysfs接口来管理这些设备。

SONiC提供了一些服务和实用程序来管理这些设备:

  • decode-syseeprom:显示系统eeprom信息
  • sensors:监控温度和风扇速度
  • fancontrol:根据传感器温度调整风扇速度
  • ledd:根据链路或者系统状态更改LED灯
  • sfputil:管理收发器,比如show transceiver eeprom,检测存在,重置,更改lpmode

平台供应商有望开发他们的平台模块来构建I2C树,公开sysfs接口并且开发插件已将他们的设备钩挂到SONiC平台管理服务。详细信息可以查看平台移植指南。

主要是了解一下SONiC的features,以便于整理一下一点一点从上往下熟悉。文章参照SONiC Features文档。

Features

L2

  • LAG,链路聚合组,将多个端口合并使用的,常用LACP控制协议。
  • LLDP,链路层发现协议,在本地子网中通告自己的设备标识和性能。
  • COS,服务等级(Class of Service)在数据和语音协议中使用的参数,存在于运行VLAN报文的链路层。
  • VLAN
  • ACL permit/deny
  • Mirroring
  • LACP Fallback,fallback模式时把bond当成一个NIC来用,因为另外一个NIC显示mac为全0
  • Vlan Trunk
  • Dynamic ACL Upgrade
  • MAC Aging

L3

  • BGP,边界网关协议,运行在一个单独的AS中,BGP之间同步路由信息。
  • ECMP,多路径等价路由,用于均衡流量的。
  • QoS-ECN,显式ECN调整QoS
  • QoS-RDMA
  • Priority Flow Control,PFC是普通流控的升级版,普通流控是针对端口的,PFC根据流来进行管理,控制
  • PFC WD,PFC Watchdog Design
  • Asymmetric PFC
  • WRED,加权随机先期检测(Weighted Random Early Detection)是将随机先期检测与优先级排队结合起来,这种结合为高优先级报文提供了优先通信处理能力。当某个接口开始出现拥塞时,它有选择地丢弃较低优先级的通信,而不是简单地随机丢弃报文。
  • COPP,思科私有的安全策略协议。
  • DHCP Relay Agent,把DHCP/BOOTP广播信息从一个网段转播到另一个网段。
  • IPv6
  • Tunnel Decap
  • BGP MP
  • BGP Graceful restart helper,协议重启和另外一台协助重启的设备。
  • BGP/Neighbor-down fib-accelerate,路径上有端口down的时候,收敛快一些
  • IPv6 ACL
  • Routing Stack Graceful Restart
  • FRR,源于quagga,适用于IP路由协议套件的守护进程,支持平台Linux和Unix,协议包括BGP,IS-IS,LDP,OSPF,PIN和RIP
  • IPv6 Link Local
  • VRF
  • Vxlan
  • L3 MLAG
  • EVPN

management

  • SNMP,简单网络管理协议。用于监测连接到网络上的设备。
  • Syslog
  • Sysdump
  • NTP,网络时间同步协议。
  • Post Speed Setting
  • TACACS+(Terminal Access Controller Access Control System)终端访问控制器访问控制系统。
  • MTU Setting
  • gRPC
  • Cirtical Resource Monitoring
  • Incremental Config(IP, LAG, Port shut/unshut)
  • sFlow

模块

kernel & drivers

  • sonic-mgmt,管理、配置和监控SONiC,需要单独编译。

  • sonic-buildimage,编译安装镜像,以下都是该git的子模块。

  • sonic-linux-kernel,内核补丁。
  • SAI(Switch Abstraction Interface)
  • sonic-swss,SwSS(Switch State Service)是一个软件合集,提供数据库接口,用于和网络应用程序以及网络交换机硬件进行通信和状态表示。
  • sonic-swss-common,SwSS公共库提供了用于数据库通信、netlink wrappers、和SwSS所需的其他功能功能的库。
  • sonic-py-swsssdk,用于SONiC交换机状态服务数据库访问的Python实用程序库。
  • sonic-dbsyncd,SONiC SwSS LLDP数据同步daemon。
  • sonic-quagga,Quagga支持BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1, RIPv2, RIPng和IS-IS。
  • sonic-platform-common,为硬件外围设备提供通用接口,Python的软件包集合。
  • sonic-platform-daemons,SONiC中控制指定平台功能的daemon程序。
  • sonic-sairedis,基于redis数据库构建的SAI redis服务,主要包含了两个组件:将SAI对象放入redis数据库的SAI库;获取SAI对象,并且放入ASIC的syncd。
  • sonic-snmpagent,a net-snmpd agentx subagent。
  • sonic-utilities,命令行工具。
  • p4-hlir,仅支持P4_14版本,如果编译P4_16版本,可以使用p4c。
  • p4c-bm,为bmv2(behavioral-model)生成JSON配置。
  • ptf,PTF是基于Python的数据平面测试框架。基于Python发行版中的unittest。
  • frr, FRRouting是实现和管理各种IPv4和IPv6的免费路由协议软件,目前支持BGP4,BGP4+,OSPFv2,OSPFv3,RIPv1,RIPv2,RIPng,IS-IS,PIN-SM/MSDP,LDP和Babel。

初识SONiC,官方文档相关推荐

  1. mysql中括号_手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  2. mysql官方文档中文版_手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  3. OpenCV-Python官方文档学习笔记(上)

    整理自OpenCV-Python官方文档 一. OpenCV-Python Tutorials 1 安装及验证 2 图片读写,展示 3 视频读写,展示 4 绘图功能(绘制几何形状:线.圆.椭圆.矩形. ...

  4. Ant Design 入门-参照官方文档使用组件

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 先来一个按钮组件使用的对比,官方文档的(不能直接用)和实际能用的. 官网demo: import { Tabl ...

  5. 坑爹的微软官方文档:SQL无人值守安装

    我在部署项目的时候,需要用批处理无人值守安装SQLserver,.Net等组件. 于是查了微软官方文档,其中一项内容如下: http://msdn.microsoft.com/zh-cn/librar ...

  6. Tomcat官方文档关于数据源配置的内容

    虽然有网上有网友自己总结的文章,但说明得总是不够清晰,还是参考官方文档理解得比较透彻: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html h ...

  7. python-66:BS4实例--下载BS4官方文档

    2019独角兽企业重金招聘Python工程师标准>>> 前面已经对BS4有了简单的认识和讲解,该讲的都讲了,原本也已经想好了一个实例,但是现在想往后推一推,因为我实在受不了了,我们前 ...

  8. k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S

    前言 本文将带领读者一起, 参照者 Kubernetes 官方文档, 对其安装部署进行讲解. Kubernetes 更新迭代很快, 书上.网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文 ...

  9. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式

    本文翻译自vtk官方文档:vtk_file_format 文末有链接 VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式.创建一种数据文件格式的主 ...

  10. 深入理解Java 8 Lambda表达式(Oracle官方文档版)

    Java 8 问世三年了,9马上也要问世了,所以,嗯,我要开始学8了-- 官方文档:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdae ...

最新文章

  1. Objective-C中的内存管理
  2. Mac VirtualBox 命令行Centos 挂载Mac系统中的文件夹
  3. 商场促销——策略模式
  4. 485有时候从机接收指令没反应_原来微信发语音不好听,是你没掌握这2个技巧!快去试试吧...
  5. libxml2用xpath进行查找
  6. supervisor进程管理工具
  7. 数论--费马小定理求逆元
  8. 前端学习(1854)vue之电商管理系统电商系统之git push后出现错误 ![rejected] master -> master(non-fast-forward) error:failed t
  9. kaggle (02) - 房价预测案例(进阶版)
  10. Google SVN托管和使用学习笔记
  11. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)
  12. 华东理工大学和暨南大学计算机考研,2016华东理工大学VS暨南大学 孰强孰弱?...
  13. 对列表中k之前和之后的元素分别进行逆序
  14. shell 学习之case语句
  15. Office 2016出现加载DLL失败或者库未注册的问题:0x8002801D或者0x80029C4A
  16. java工资高还是web前端工资高_java工资高还是php,java工资高还是web前端工资高,php和java学费...
  17. sdcard里边的东西能删除吗_sdcard是什么意思(小米sdcard文件可以删除吗)
  18. 支付宝 微信 内购 支付
  19. CITA Release v0.18
  20. golang基础面试题总结

热门文章

  1. svn中的文件夹上的标志的意思
  2. Oracle_用户管理
  3. 网络之美:JavaScript中Get和Set访问器的实现
  4. 一个asp.net聊天是源码
  5. 转:Jquery json的超强组合(DataTable2JSON)
  6. jQuery选择器【学习】
  7. elasticdump安装_elasticsearch导入导出工具elasticdump安装和使用小记
  8. maven仓库--私服(Nexus的配置使用)
  9. docker相关实验
  10. 第二章 算法 (大话数据结构)