sonic 架构学习
射人先射马,擒贼先擒王
在我们学习sonic的过程中,无疑了解sonic的架构是非常重要的,然后再去了解各个模块的细节,总分学习模式。下面是我自我学习并翻译的链接https://github.com/Azure/SONiC/wiki/Architecture?spm=a2c6h.12873639.0.0.980036b0oeCGJJ
参考文档
SONIC 系统架构
通过依赖redis引擎基础结构提供的发布者/订阅者消息传递范例,应用程序只能订阅他们所需的数据视图,并避免与功能无关的实现细节。
即使SONiC的大多数主要组件都保存在docker容器中,但在Linux主机系统本身中仍存在一些关键模块。 SONiC的配置模块(sonic-cfggen)和SONiC的CLI就是这种情况。
本文档的后续部分将介绍所有可能的组件交互作用以及正在转移的关联状态的更完整描述
SONIC 子系统介绍
本部分旨在提供每个docker容器中包含的功能的描述,以及从linux-host系统运行的主要SONiC组件。目的是为读者提供高层次的介绍。在后续部分中,将采用一种更加图形化(希望如此)的直观方法。
teamed 容器:在SONiC设备中运行链接聚合功能(LAG)。 “ teamed”是基于Linux的LAG协议的开源实现。 “团队同步”过程允许“团队”子系统和南向子系统之间进行交互。
Dhcp中继容器:dhcp中继代理可将DHCP请求从没有DHCP服务器的子网中继到其他子网上的一台或多台DHCP服务器。
Bgp容器:运行支持的路由堆栈之一:Quagga或FRR。即使容器是根据使用的路由协议(bgp)命名的,实际上,这些路由堆栈也可以运行其他各种协议(例如ospf,isis,ldp等)。
BGP容器功能细分如下:
----bgpd:常规的bgp实现。来自外部各方的路由状态通过常规的tcp / udp套接字接收,并通过zebra / fpmsyncd接口下推到转发平面。
----fpmsyncd:小型守护程序,负责收集由zebra生成的FIB状态并将其内容转储到redis引擎中的Application-DB表(APPL_DB)中。
数据库容器:托管redis数据库引擎。 SONiC应用程序可以通过redis-daemon为此目的公开的UNIX套接字访问SONiC应用程序中的数据库。这些是redis引擎托管的主要数据库:
----APPL_DB:存储由所有应用程序容器生成的状态-路由,下一跳,邻居等。这是所有希望与其他SONiC子系统进行交互的应用程序的南向入口点。
----CONFIG_DB:存储SONiC应用程序创建的配置状态-端口配置,接口,VLAN等。
----ASIC_DB:存储必要的状态以驱动asic的配置和操作-此处的状态保持为asic友好格式,以简化已同步(请参见下面的详细信息)和asic SDK之间的交互。
----COUNTERS_DB:存储与系统中每个端口关联的计数器/统计信息。此状态可用于满足CLI本地请求,或用于遥测通道。
Swss容器:交换状态服务(SwSS)容器包含一组工具,以允许所有SONiC模块之间进行有效通信。如果数据库容器擅长提供存储功能,则Swss主要致力于提供机制来促进所有不同方之间的通信和仲裁。
----Intfsyncd:侦听与接口相关的netlink事件,并将收集的状态推送到APPL_DB中。与该接口相关联的属性(例如新/更改的ip地址)由该过程处理。
----Teamsyncd:先前讨论过-在成组的docker容器中运行。与前面的情况一样,将获得的状态推送到APPL_DB中。
----Fpmsyncd:先前讨论过-在bgp docker容器中运行同样,将收集的状态注入到APPL_DB中。
----Lldp_syncd:前面也讨论过-在lldp docker容器中运行。
----SAI API:交换机抽象接口(SAI)定义了API,以统一方式提供了独立于供应商的方式来控制转发元素,例如交换ASIC,NPU或软件交换机。有关SAI API的更多详细信息,请参见[3]。
----ASIC SDK:硬件供应商应提供驱动其ASIC所需的SDK的SAI友好实现。通常以动态链接库的形式提供此实现,该库链接到负责驱动其执行的驱动过程(在这种情况下是同步的)。
SONIC 子系统交互
本节预告为读者提供对各种SONiC组件之间发生的相互关联作用的详细了解。正在交换的特定状态。
LLDP-state 交互
下图描述了在LLDP状态转移事件期间观察到的一组相互作用。在此特定示例中,我们遍历在携带状态更改的LLDP消息到达时发生的一系列步骤。
(1)在LLDP容器初始化期间,lldpmgrd订阅STATE_DB以获得系统中物理端口状态的实时提要-lldpmgrd的轮询周期每5秒运行一次。基于此信息,Lldpd(及其网络对等方)将随时了解系统端口状态的变化以及影响其运行的任何配置变化。
(2)在某个时刻,新的LLDP数据包到达内核空间中lldp的套接字。内核的网络堆栈最终将关联的有效负载交付给lldp进程。
(3)Lldp解析并消化此新状态,该状态最终由lldp_syncd在执行lldpctl cli命令的过程中匹配-通常每10秒运行一次。
(4)Lldp_syncd将此新状态推送到APPL_DB中,具体到表LLDP_ENTRY_TABLE。
(5)从这一刻起,所有订阅此表的实体都应收到新状态的副本(当前,snmp是唯一感兴趣的侦听器)。
SNMP-state 交互
如前所述,snmp容器既托管snmp主代理(snmpd),也托管SONiC特定的agentX进程(snmp_subagent)。该子代理与所有提供可从中导出MIB状态的信息的redis数据库/表进行交互。具体而言,snmp-agent订阅以下数据库/表:
APPL_DB: PORT_TABLE, LAG_TABLE, LAG_MEMBER_TABLE, LLDP_ENTRY_TABLE
STATE_DB: *
COUNTERS_DB: *
ASIC_DB: ASIC_STATE:SAI_OBJECT_TYPE_FDB*
下图描述了系统处理传入的snmp查询期间各种SONiC组件之间的典型交互。
(0)在对snmp-subagent进程中支持的不同MIB子组件进行初始化的过程中,该组件建立与上述各种DB的连接。从此刻开始,将从所有这些DB获得的状态本地缓存在snmp-subagent中。每隔几秒钟(<60)刷新一次此信息,以确保DB和snmp-subagent完全同步。
(1)snmp查询到达内核空间中snmp的套接字。内核的网络堆栈将数据包交付给snmpd进程。
(2)解析snmp消息,并将关联的请求发送到SONiC的agentX子代理(即sonic_ax_impl)。
(3)Snmp-subagent为查询提供服务,该查询超出了其本地数据结构中缓存的状态,并将信息发送回snmpd进程。
(4)Snmpd最终通过通常的套接字接口将回复发送回发起者。
Routing-state 交互
在本节中,我们将遍历SONiC中处理从eBGP对等方接收到的新路由的一系列步骤。我们将假定已经建立了该会话,并且正在学习一条将直接连接的对等方用作下一跳的新路由。
下图显示了此过程涉及的元素。请注意,我故意删除了与此SONiC架构描述无关的细节。
(0)在BGP容器初始化期间,zebra通过常规TCP套接字连接到fpmsyncd。在稳定/非瞬态条件下,确认zebra,Linux内核,APPL_DB和ASIC_DB中保存的路由表是完全一致/等效的。
(1)一个新的TCP数据包到达内核空间中bgp的套接字。内核的网络堆栈最终将相关的有效负载交付给bgpd进程。
(2)Bgpd解析新数据包,处理bgp-update并通知zebra该新前缀及其相关协议的下一跳的存在。
(3)在zebra确定该前缀的可行性/可及性之后(例如,现有的转发nh),zebra生成了一个路由网络链接消息,以将该新状态注入内核。
(4)Zebra利用FPM接口将该网络链接路由消息传递给fpmsyncd。
(5)Fpmsyncd处理netlink消息并将此状态推入APPL_DB。
(6)被安排为APPL_DB订户时,它将接收先前推送到APPL_DB的信息的内容。
(7)处理收到的信息后,orchagentd将调用sairedis API,以将路由信息注入ASIC_DB。
(8)正在同步ASIC_DB订户,它将接收orchagentd生成的新状态。
(9)Syncd将处理该信息并调用SAI API将此状态注入到相应的asic驱动程序中。
(10)新路线最终被推向硬件。
Port-state 交互
本节描述了与端口相关的信息传输期间发生的系统交互。考虑到portsyncd发挥的关键作用以及它在其他SONiC子系统中施加的依赖关系,我们通过覆盖其初始化过程来开始本节。
此练习的目标是双重的。首先,我们在系统中公开了对产生或使用端口相关信息感兴趣的多个组件。其次,我们通过一个图形化的示例向读者介绍STATE_DB在系统中的使用方式,以及不同的应用程序如何依靠其信息进行内部操作。
(0)在初始化期间,portsyncd与redis引擎中的主数据库建立通信通道。 Portsyncd声明打算充当APPL_DB和STATE_DB的发布者,以及CONFIG_DB的订阅者。同样,portsyncd也订阅系统的netlink通道,该通道负责传送端口/链接状态信息。
(1)Portsyncd通过解析与系统中正在使用的硬件配置文件/ sku相关联的端口配置文件(port_config.ini)开始(更多信息,请参阅配置部分)。与通道相关的信息(例如通道,接口名称,接口别名,速度等)将通过此通道传输到APPL_DB。
(2)Orchagent听到了所有这些新状态,但是将推迟对其执行操作,直到portsyncd通知它已完全完成解析port_config.ini信息为止。一旦发生这种情况,orchagent将继续进行硬件/内核中相应端口接口的初始化。 Orchagent调用sairedis API来传递此请求,以通过常规ASIC_DB接口进行同步。
(3)Syncd通过ASIC_DB接收此新请求,并准备调用满足Orchagent的请求所需的SAI API。
(4)Syncd利用SAI API + ASIC SDK创建与正在初始化的物理端口相关的内核主机接口。
(5)上一步将生成一个netlink消息,该消息将被portsyncd接收。与先前从port_config.ini解析的所有端口相关的消息到达portsyncd后(在步骤1),portsyncd将继续声明“初始化”过程已完成。
(6)作为上一步的一部分,portsyncd将记录条目写入与成功初始化的每个端口相对应的STATE_DB中。
(7)从现在开始,以前订阅STATE_DB内容的应用程序将收到通知,以允许这些应用程序开始使用它们所依赖的端口。换句话说,如果在STATE_DB中找不到用于特定端口的有效条目,则任何应用程序都无法使用它。
注意:截止到今天,这些都是活跃的应用程序
监听STATE_DB中的更改:teamsyncd,intfmgrd,vlanmgrd
和lldpmgr。我们将在后续内容中介绍所有这些组件
部分-lldpmgr已在上面解决
现在,让我们遍历物理端口发生故障时发生的步骤顺序:
(0)如概述部分所述,syncd在ASIC_DB上下文中既充当发布者又充当订阅者。 “订阅者”模式显然是需要同步以接收来自北向应用程序的状态的,这是迄今为止所有模块交互的情况。需要使用“发布者”模式来允许同步,以将硬件衍生事件的到达通知给更高级别的组件。
(1)在相应的ASIC的光模块检测到载波丢失后,将向相关的驱动程序发送通知,该驱动程序又将此信息传递给已同步。
(2)Syncd调用适当的通知处理程序,并将port-down事件发送到ASIC_DB。
(3)Orchagent利用其通知线程(专用于此任务)从ASIC_DB收集新状态,并执行“端口状态更改”处理程序以:
----a.生成APPL \ _DB的更新以警告依赖于的应用程序
操作状态(e.g. CLI – “show interface
status”).
----b.调用sairedis API,以提醒同步更新
与端口的主机接口关联的内核状态
拿下来。再次,orchagent传递此请求以进行同步
通过常规的ASIC \ _DB接口。
(4)Syncd通过ASIC_DB接收此新请求,并准备调用满足Orchagent的请求所需的SAI API。
(5)Syncd使用SAI API + ASIC SDK来用受影响的主机接口的最新操作状态(DOWN)更新内核。
(6)在portsyncd处接收到与上一步关联的netlink消息,由于所有SONiC组件现在都已完全意识到port-down事件,因此该消息被静默丢弃。
接口状态交互。
待定
邻居状态交互。
待定
LAG接口状态交互。
待定
配置状态交互。
待定
有关向用户公开的不同CLI命令以及系统配置文件的更多详细信息,将在本文档的后续部分中介绍。
sonic 架构学习相关推荐
- javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...
K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...
- ZT Android4.2蓝牙基础架构学习
Android4.2蓝牙基础架构学习 分类: Jellybean Bluetooth Bluetooth 2013-10-13 23:58 863人阅读 评论(3) 收藏 举报 androidblue ...
- 时序图 分支_BOOM微架构学习(1)——取指单元与分支预测
之前在RISC-V的"Demo"级项目--Rocket-chip一文中曾经简介过BOOM处理器的流水线,这次我们开始一个系列,深入学习一下BOOM的微架构,这样对于乱序执行的超标量 ...
- bpmn2.0业务过程模型和符号_IT帮业务架构学习小组学习内容
关于学习内容,担心大家学完的可能不多,所以考虑是先选择一小部分来学.但考虑到业务架构属于组织级学科,本身就要求体系全面,所以还是决定把全套内容放入到本期学习.下面我列举一下我们这8个月在业务架构自主学 ...
- SpringCloud微服务架构学习(二)常见的微服务架构
SpringCloud微服务架构学习(二)常见的微服务架构 1.Dubbo 阿里开源微服务框架 官网地址:http://dubbo.apache.org/en-us/ 简介: Dubbo是阿里巴巴SO ...
- 《InsideUE4》GamePlay架构学习_Level和World
<InsideUE4>GamePlay架构学习 Level和World 前话 Unity To UE 思考 为什么AWorldSettings[0]的位置,而ALevelScriptAct ...
- MIPS架构学习笔记
MIPS架构学习笔记 来源: ChinaUnix博客 日期: 2007.03.13 23:18 (共有条评论) 我要评论 MIPS架构学习笔记 ...
- 高性能架构学习路线图-分布式架构演进,mybatis一对一一对多面试题
架构演进一: 早期雏形 架构演进二: 数据库开发(LAMP特长) 架构演进三: javaweb的雏形 架构演进四: javaweb的集群发展 架构演进五: javaweb的分布式发展 架构演进 ...
- 高性能架构学习路线图-分布式架构演进
目录 一.分布式架构学习路线图 二.计算机软件发展历史 三.技术架构演进史 架构演进一: 早期雏形 架构演进二: 数据库开发(LAMP特长) 架构演进三: javaweb的雏形 架构演进四: ja ...
- Linux v4l2架构学习
写在开始之前. 网上有很多文章讲v4l2架构,讲的都很好,但是很多都是讲讲主要的结构体已经注册接口这些,个人觉得入门还是要深入的去看代码,至少把整个流程粗略的看一遍,才能真正的了解架构是什么样的,调用 ...
最新文章
- 科普丨人工智能发展的S曲线
- python中findroot_python文件查找之find命令
- oi程序提交注意:bool
- 腾讯数平精准推荐 | 横扫ICDAR 2019,斩获七项冠军
- Filter,FilterChain,FilterConfig
- python实现二叉树和它的七种遍历
- 基于深度学习的图像修补/完整方法分析
- 限时购校验小工具dubbo异步调用实现限
- eclipse配置tomcat,访问http://localhost:8080出现404错误
- mysql 跨数据库联表查询
- stylus 迭代+插值实现css同类型不同值样式序列
- PHP之JWT接口鉴权(二) 自定义错误异常
- Struts2中过滤器和拦截器的区别
- 2019开放大学计算机应用基础,国家开放大学2019年电大计算机应用基础考试试题一试卷(国家开放大学).doc...
- 腾讯新出了一款音乐app,它能代替QQ音乐吗?
- NVT NT98510 SDK介绍
- linux ubuntu 安装odb,Ubuntu 使用C++ ORM框架--ODB
- 最完美的“婚”鞋? NMD_R2“囍”(台灣愛迪達)
- Lua-面试考题附答案解析(一)
- 华为云对象存储obs文件上传