当前位置: 首页 > news >正文

揭秘大数据 | 23、软件定义网络

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员+网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机,一切归软件控制,从而实现自动化部署这就是网络虚拟化在数据中心中最大的价值所在,也是大家明知商品现货服务器的性能远远比不上专用硬件交换机,但还是使用网络虚拟化技术的根本原因。

甚至可以说软件定义网络概念的提出,在很大程度上是为了解决数据中心里面虚拟机部署复杂的问题。云计算是软件定义网络发展的第一推动力,而软件定义网络为网络虚拟化、软件定义和云计算提供了强有力的自动化手段

数据中心作为IT资源的集中地,是数据计算、网络传输、存储的中心,为企业和用户的业务需求提供IT支持。

网络作为提供数据交换的模块,是数据中心中最为核心的基础设施,并直接关系到数据中心的性能、规模、可扩展性和管理性。

随着云计算、物联网、大数据等众多技术和应用的空前发展及智能终端的爆炸式增长,以交换机为代表的传统网络设备为核心的数据中心网络已经很难适应企业和用户对业务和网络快速部署、灵活管理和控制以及开放协作的需求,网络必须能够像用户应用程序一样可以被定制和编程,这也是软件定义网络要做的事。

软件定义网络的出现对IT产业乃至科技界的各个方面产生了巨大的影响,甚至在一定程度上重新划分了当今的IT生态利益格局。对网络用户,特别是互联网厂商和电信运营商而言,软件定义网络意味着网络的优化和高效的管理,可以用于提高网络的智能性和管控能力,大幅降低网络建设与运维成本,还可以促进网络运营商真正开放底层网络,大大推动互联网业务应用的优化和创新。

一方面,软件定义网络的兴起为产业注入了新的活力,带来了新的需求和增长点。传统厂商可以抓住软件定义网络的机遇扩大市场,增加收入和利润。

另一方面,软件定义网络意味着目前网络设备软硬件一体的架构将被打破,软硬件解耦,网络设备只负责数据的转发,这样会让网络设备愈发标准化、低廉化,网络功能将逐渐由软件实现,设备利润转移到软件领域,传统厂商的传统地盘和利益将会受到威胁。

在这种背景下,传统厂商对软件定义网络的态度各不相同,有的是处于观望甚至是抵制的态度,有的则是积极探索软件定义网络相关技术和产品,利用自己的地位制订标准,掌握话语权,并准备在合适的时候收购一些初创厂商,继续维护自己的领地。

和软件定义存储一样,在软件定义网络中,首先要实现管理接口与数据读写分离。由软件定义的不仅仅是网络的拓扑结构,还包含层叠的结构。前者可以利用开放的网络管理接口(如OpenFlow)来完成,后者则可以是基于VXLAN的层叠化虚拟网络。

软件定义网络可以用图1所示的逻辑架构来定义,一个软件定义网络中包含3个架构层级。

图1:软件定义网络的逻辑架构


(1)数据平面

数据平面主要由网络设备,即支持南向协议的软件定义网络交换机组成。这些交换机可以是物理交换机或者虚拟交换机,它们保留了传统网络设备数据转发的能力,负责基于流表的数据处理、转发和状态收集。

在当前软件定义网络方案中,供应商只是把应用和控制器作为单独产品提供,例如,Nicira/VMware公司将其应用和控制器打包到了一个单独的专属应用堆栈中,思科公司则通过把控制器嵌入互联网操作系统(Internetwork Operating System,IOS)软件的方式把控制器打包到了OnePK产品中。

(2)控制平面

控制平面主要包含控制器及网络操作系统,负责处理数据平面资源的编排,维护网络拓扑、状态信息等。控制器是一个平台,该平台向下可以直接使用OpenFlow协议或其他南向接口与数据平面会话;向上为应用层软件提供开放接口,用于应用程序检测网络状态、下发控制策略。大多数的软件定义网络控制器提供图形界面,这样可以将整个网络以可视化的效果展示给管理员。

(3)应用平面

顶层的应用平面由众多应用软件构成,这些软件能够根据控制器提供的网络信息执行特定控制算法,并将结果通过控制器转化为流量控制命令,下发到基础设施层的实际设备中。

事实上,应用平面是软件定义网络最吸引人的地方,其原因是软件定义网络实现了应用和控制的分离,开发人员可以基于控制器提供的API来自定义网络,只需专注于业务的需求,而不需要像传统方式那样从最底层的网络设备开始部署应用。

这大大简化了应用开发的过程,而且大部分软件定义网络控制器向上提供的API是标准化、统一化的,这使得应用程序不用修改就可以自由在多个网络平台移植。

软件定义网络控制器与网络设备之间通过专门的控制面和数据面接口连接,这一系列接口是支持软件定义网络技术实现的关键,我们接下来分别对北向接口、南向接口、东西向接口这三大类接口结构进行简述。

北向接口:

是软件定义网络控制器和应用程序、管理系统和协调软件之间的应用编程接口,是通过控制器向上层业务应用开放的接口,使业务应用能够便利地调用底层的网络资源和能力。通过北向接口,网络业务的开发者能以软件编程的形式调用各种网络资源,同时上层的网络资源管理系统可以通过控制器的北向接口全局把控整个网络的资源状态,并对资源进行统一调度。比如OpenStack项目中的Neutron(Quantum)API就是一个典型的北向接口,通过与多种软件定义网络控制器集成对外开放,租户或者应用程序可以利用这组接口来自定义网络、子网、路由、QoS、VLAN等,并且可以通过这些接口查看当前网络的状况。

当前的北向接口并没有完全统一的标准,所用标准更多的是跟平台相关。软件定义网络的相关组织正致力于定义统一规范的北向接口。ONF执行总监Dan Pitt曾经指出,可开发一种标准北向接口,但要通过一定规范来控制其潜在用途,供网络运营商、厂商和开发商使用。

北向接口的设计对软件定义网络的应用有着至关重要的作用,其原因是这些接口是被应用程序直接调用的。应用程序的多样性和复杂性对北向接口的合理性、便捷性和规范性有着直接的要求,这也直接关系到软件定义网络能否获得广泛应用。

南向接口:

南向API或协议是工作在最底层(交换ASIC或虚拟机)和中间层(控制器)之间的一组API或协议,主要用于通信,允许控制器在硬件上安装控制平面决策,从而控制数据平面,其中包括链路发现、拓扑管理、策略制定、表项下发等。这里的链路发现和拓扑管理主要是控制器利用南向接口的上行通道对底层交换设备上报的信息进行统一监控和统计,策略制定和表项下发则是控制器利用南向接口的下行通道对网络设备进行统一控制。

OpenFlow是最为典型的南向协议。OpenFlow定义了非常全面和系统的标准来控制网络,因而是目前最具发展前景的南向协议,也是获得支持最多的网络协议,甚至有人将OpenFlow认为是软件定义网络。此处省略一万字,未来老夫将会在后面部分对OpenFlow进行更详细的介绍。

还有其他一些南向通信实现方式正在研究中,比如VXLAN。VXLAN记录了终端服务器或虚拟机的详细框架,并把终端站地图定义为网络。VXLAN的关键假设是交换网络(交换机、路由器)不需要指令程序,而是从软件定义网络控制器中提取。VXLAN对软件定义网络的定义是通过控制虚拟机,以及用软件定义网络控制器定义基于这些虚拟机通信的域和流量而实现的,并不是对以太网交换机进行编程。

东西向接口:

软件定义网络发展过程中面临的一个问题是控制平面的扩展性,也就是多个设备的控制平面之间如何协同工作。这涉及软件定义网络中控制平面的东西向接口的定义问题,如果没有定义东西向接口,那么软件定义网络充其量只是一个数据设备内部的优化技术,不同的软件定义网络设备之间还要还原为IP(路由协议)进行互联,其对网络架构创新的影响力就十分有限。

如果能够定义控制平面标准的东西向接口,就可以实现软件定义网络设备“组大网”​,使软件定义网络技术走出IDC内部和数据设备内部,成为一种能产生革命性影响的网络架构。目前对软件定义网络东西向接口的研究还刚刚起步,IETF和ITU均未涉及这个研究领域。通常软件定义网络控制器通过控制器集群技术(比如Hazelcast技术)解决这个问题,控制器集群能提供负载均衡和故障转移,提高控制器的可靠性。

软件定义网络的出现打破了传统网络设备制造商独立且封闭的控制面结构体系,将改变网络设备形态和网络运营商的工作模式,对网络的应用和发展将产生直接影响。从技术层面和应用层面来看,软件定义网络的特点主要体现在以下几个方面:

(1) 数据平面与控制平面分离,在控制平面对网络集中控制。

通过控制平面功能的集中以及数据平面和控制平面之间的接口规范实现对不同厂商的设备进行统一、灵活、高效的管理和维护。数据平面和控制平面分离且支持集中控制,就是把原来IP网络设备上的路由控制平面集中到一个控制器上,网络设备根据控制器下发的控制表项进行转发,自身不具备太多智能性。

(2)网络接口开放。

网络开放是软件定义网络技术的本质特征,是目前软件定义网络主要价值的体现。软件定义网络通过北向接口开放给应用程序,应用和业务可以通过调用API获取网络的能力,实现业务和网络的精密融合;通过南向接口的开放实现网络控制平面和数据平面的分离,使不同厂商的设备可以兼容;通过对东西向接口的开放实现控制平面的扩展,使多个控制器协同工作,提高控制器的可用性。

(3)实现网络的虚拟化。

软件定义网络利用以网络叠加技术为代表的网络封装和隧道协议,让逻辑网络摆脱物理网络隔离,实现物理网络对上层应用的透明化。

逻辑网络和物理网络分离后,逻辑网络可以根据业务需要进行配置、迁移,不再受设备具体地理位置的限制。同时,逻辑网络还支持多租户共享,支持租户网络的定制需求。

目前,网络虚拟化主要用于数据中心。近年来,数据中心的虚拟网络设备的代表vSwitch、vRouter、vFirewall等产品都是在通用服务器虚拟机平台上,通过软件的方式模拟实现传统设备功能,从而实现灵活的设备能力,带来了便捷的部署和管理。网络虚拟化将传输、计算、存储等能力融合,在集中式控制的网络环境下,有效调配网络资源,支持业务目标的实现和用户需求,提供更高的网络效率和良好的用户体验。

(4)支持业务的快速部署,简化业务配置流程。

传统网络由于网络和业务割裂,大部分网络的配置是通过命令行或者网络管理员手工配置的。由于本身是一个静态的网络,当遇到需要网络及时做出调整的动态业务时,传统网络就显得非常低效,甚至无法实施。

软件定义网络的集中控制和可编程能力使得整个网络可在逻辑上被视为一台设备进行运行和维护,无须对物理设备进行现场物理分散配置;开放的API使用户业务可以利用编排工作流实现业务部署和业务调整的自动化实施,这些可以让用户业务的部署和调整摆脱手工分散配置的约束,降低设备配置风险,提高网络部署的敏捷性。

用户个性化定制业务的实现为网络运营商提供了便捷的业务创新平台,软件定义网络的核心是软件定义,其本质是网络对业务的快速灵活响应和快速业务创新。网络虚拟化包括物理网络和虚拟机网络的虚拟化。

物理网络可能包含网络适配器、交换机、路由器、网桥、中继器和集线器,提供运行虚拟机管理程序的物理服务器之间的连接、物理服务器与客户端之间的连接,以及物理服务器与存储系统之间的连接。

虚拟机网络驻留在物理服务器中,包括被称为虚拟交换机的逻辑交换机,其功能与物理交换机类似。虚拟机网络可实现物理服务器中虚拟机之间的通信。例如,某个运行业务应用程序的虚拟机可能需要通过防火墙服务器对其流量进行筛选,而该服务器可能是同一台物理服务器中的另一个虚拟机。通过虚拟机网络对这些虚拟机进行内部连接是非常有益的,而通过物理网络连接它们将增加虚拟机流量的时延,因为流量需要经过外部物理网络。

网络虚拟化如图2所示。虚拟机管理程序内核连接到虚拟机网络,使用虚拟机网络与管理服务器和存储系统(存储阵列)通信,其中管理服务器可以是在物理服务器中托管的虚拟机。对于驻留在不同物理服务器中的两个虚拟机之间的通信,以及虚拟机与其客户端之间的通信,虚拟机流量必须经过虚拟机网络和物理网络。此外,在虚拟机与物理网络之间传输流量还需要虚拟机管理程序,因此,虚拟机网络必须连接到物理网络。

图2:网络虚拟化

 


与传统数据中心内的联网类似,虚拟数据中心内的联网也需要使用基本构造组件。虚拟数据中心网络基础架构同时包含虚拟组件和物理组件(见图/表3)​,这些组件相互连接以传输网络数据。

图3: 虚拟数据中心网络基础架构 (注:FCoE——Fiber Channel over Ethernet,以太网光纤通道。)

 

网络组件(如虚拟网络接口卡、虚拟主机总线适配器和虚拟交换机)是使用虚拟机管理程序在物理服务器中创建的。虚拟机可以通过虚拟网络接口卡连接到虚拟机网络,它们向/从虚拟机网络发送/接收虚拟机流量。使用虚拟主机总线适配器,虚拟机可以访问为其分配的光纤通道原始设备映射磁盘/LUN。

虚拟交换机用于构成虚拟机网络并支持以太网协议。它们提供与虚拟网络接口卡的连接并转发虚拟机流量。此外,它们还定向与虚拟机管理程序内核之间双向传输管理流量、存储流量和虚拟机迁移流量。

物理适配器(如网络接口卡、主机总线适配器和聚合网络适配器)使物理服务器可以连接到物理网络,它们与物理网络之间双向转发虚拟机流量和虚拟机管理程序流量。

物理网络包含物理交换机和路由器。物理交换机和路由器提供以下连接:物理服务器之间的连接、物理服务器与存储系统之间的连接,以及物理服务器与客户端之间的连接。根据支持的网络技术和协议,这些交换机可定向转发以太网、光纤通道、iSCSI或FCoE的流量。

目前软件定义网络的实现方案中主要有两种:

1)以网络为中心,主要利用标准协议OpenFlow来实现对网络设备的控制。这种方案可以被看成是对传统网络设备(交换机、路由器等)的改造和升级。
 

2)以主机为中心,以网络叠加技术来实现网络虚拟化。这种方案的应用场景主要是数据中心。

我们在这里对这两种软件定义网络实现方案分别进行简单描述:

(1) 以网络为中心的软件定义网络

以网络为中心的软件定义网络的技术核心是OpenFlow。OpenFlow最早由斯坦福大学提出,是一种通信协议,用来提供对网络设备(如交换机和路由器)的数据转发平面进行访问控制。OpenFlow旨在基于现有的TCP/IP技术条件,以创新的网络互联理念解决当前架构在面对新的网络业务和服务时所产生的各种瓶颈。

OpenFlow的核心思想很简单,就是将原本完全由交换机/路由器控制的数据包转发过程转化为由控制服务器和OpenFlow交换机分别完成的独立过程。也就是说,使用OpenFlow的网络设备能够分布式部署、集中式管控,使网络具有软件可定义的形态,能够进行定制、快速建立和实现新的功能与特征。

基于OpenFlow的软件定义网络架构主要包括基础设施层、控制层和应用层,如图4所示。基础设施层代表网络的底层转发设备,包含特定的转发面抽象。控制层集中维护网络状态,并通过南向接口(如OpenFlow)获取底层网络设备信息,同时为应用层中的各种业务应用提供可扩展的北向接口。

图4 : 基于OpenFlow的软件定义网络架构

 

网络智能在逻辑上被集中在基于软件方式的软件定义网络控制器中,它维护着网络的全局视图,因此,对于应用来说,网络类似于一个单一的、逻辑上的交换机。利用软件定义网络,企业和运营商能够从一个单一的逻辑节点获得独立于设备供应商的对整个网络的控制,从而大大简化网络设计和操作。由于不再需要理解和处理各种不同的协议标准,只是单纯地接收来自软件定义网络控制器的指令,网络设备自身也能够得到极大的简化。

网络管理员能够以编程方式自动化配置网络抽象,而不用手动配置数目众多的分散的网络设备。另外,通过利用软件定义网络控制器的集中式智能,IT部门可以实时改变网络行为,可以在数小时或者数天内部署新的应用和网络服务,而不是像现在一样需要数周或者几个月的时间。通过将网络状态集中到控制层,软件定义网络利用动态和自动的编程方式为网络管理者提供了灵活的配置、管理、保护和优化网络资源的方式,而且管理员可以自己编写这些程序,而不用等待新功能被嵌入供应商的设备和网络的封闭软件环境之中。

除提供对网络的抽象之外,软件定义网络架构还支持通过API实现那些通用网络服务,其中包括路由、多播、访问控制、带宽管理、流量规划、QoS、处理器和存储资源优化、能源使用,以及所有形式的策略管理和商业需求定制。例如,软件定义网络架构可以很容易在校园的有线网络和无线网络中定义和实施一致的管理策略。

同样,软件定义网络也使通过智能编排和配置系统来管理整个网络变成了可能。ONF正在研究如何通过开放API促进多供应商管理方式。在这种方式中,用户可以实现资源按需分配、自助服务管理、虚拟网络构建以及安全的云服务。

(2)以主机为中心的软件定义网络

以主机为中心的软件定义网络实现方案是为了满足云计算时代的数据中心对网络服务交付能力的要求而设计的。

实际上,在所有的网络环境中,数据中心是最早遭遇到网络束缚的地方。数据中心作为互联网内容和企业IT的仓储基地,是信息存储的源头。

为了满足日益增长的网络服务需求,特别是互联网业务的爆发式需求,数据中心逐渐向大型化、自动化、虚拟化、多租户等方向发展。传统的网络架构处于静态的运作模式,在网络性能和灵活性等诸多方面遭遇到挑战。数据中心为了适应这种变化只能疲于奔命,不断对物理网络设施升级改造,增加IT设施投资来提高服务水平,这使得网络环境更加复杂、更难控制。各种异构的、不同协议的网络设备之间的兼容性和互通性令人望而生畏;不同设置间分散的控制方法让网络的部署更困难,这也给数据中心增加了巨大的经济成本和时间成本。在这种背景下,数据中心对软件定义网络技术有最直接的需求,这也是软件定义网络技术发展的最直接动力。

以主机为中心的软件定义网络将控制平面和数据平面分离,将设备或服务的控制功能从其实际执行中抽离出来,为现有的网络添加编程能力和定制能力,使网络有弹性、易管理且有对外开放的能力。数据平面则不改变现有的物理网络设置,利用网络虚拟化技术实现逻辑网络。

在控制层面上,以主机为中心的软件定义网络实现方案提供了集中化的控制器,使传统交换设备中分散的控制能力集中化。除了完成软件定义网络控制器的南向、北向及东西向的功能,集中化的控制器通常还作为数据中心的一个模块或一个单独的组件,支持和其他多种管理软件的集成(如资源管理、流程管理、安全管理软件等)​,从而将网络资源更好地整合到整个IT运营中。

数据平面主要以网络叠加技术为基础,以网络虚拟化为核心。这种方式不改变现有的网络,但是在服务器Hypervisor层面增加一层虚拟的接入交换层来提供虚拟机间快速的二层互通隧道。通过在共享的底层物理网络基础、创建逻辑上彼此隔离的虚拟网络,底层的物理网络对租户透明,使租户感觉自己是在独享物理网络。网络叠加技术将数据中心的网络从二层网络的限制中解放了出来,只要IP能到达的地方,虚拟机就能够部署、迁移,网络服务就能够交付。

网络叠加技术指的是一种在网络架构上叠加的虚拟化技术模式,其大体框架是在基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其他网络业务进行分离。

其实这种模式是对传统技术的优化而形成的。早期的就有支持IP之上的二层Overlay技术,如RFC 3378。基于Ethernet over GRE的技术,新华三集团(H3C)与思科公司都在物理网络的基础上发展了各自的私有二层Overlay技术——以太网虚拟化互联(Ethernet Virtual Interconnection,EVI)与重叠传输虚拟化(Overlay Transport Virtualization,OTV)。EVI与OTV主要用于解决数据中心之间的二层互联与业务扩展问题,并且对承载网络的基本要求是IP可达,在部署上简单且扩展方便。

在技术上,网络叠加技术可以解决目前数据中心面临的3个主要问题:

(1) 虚拟机迁移范围受网络架构限制的问题。

网络叠加是一种封装在IP报文之上的新的数据格式,因此,这种数据可以通过路由的方式在网络中分发,而路由网络本身并无特殊网络结构限制,具备大规模扩展能力,并且对设备本身无特殊要求,以高性能路由转发为佳。同时,路由网络本身具备很强的故障自愈能力、负载均衡能力。采用网络叠加技术后,企业部署的现有网络便可用于支撑新的云计算业务,改造难度极低(除了性能可能是考量因素外,技术上对承载网络并无新的要求)​。

(2) 虚拟机规模受网络规格限制的问题。

虚拟机数据封装在IP数据包中后,对网络只表现为封装后的网络参数,即隧道端点的地址,因此,对于承载网络(特别是接入交换机)而言,MAC地址规格需求极大降低,最低规格也就是几十个(每个端口一台物理服务器的隧道端点MAC)​。当然,对核心网关处的设备表项(MAC/ARP)要求依然极高,当前的解决方案仍然是采用分散方式,通过多个核心网关设备来分散表项的处理压力。

(3)网络隔离/分离能力限制的问题。

针对VLAN数量在4096以内的限制,网络叠加技术中引入了类似于VLAN ID的用户标识,支持千万级以上的用户标识,并且在Overlay中沿袭了云计算“租户”的概念,称之为租户标识,其长度为24bit或64bit。

在网络叠加技术领域,IETF目前主要有以下三大类技术路线,它们的比较见图/表5:

图 /表 5 : IETF三大类技术路线比较

 

(1)虚拟扩展局域网VXLAN。

(2)使用通用路由封装网络虚拟化(Network Virtualization Using Generic Routing Encapsulation,NVGRE)。

(3)无状态传输隧道(Stateless Transport Tunneling,STT)。

以上3种二层网络叠加技术的大体思路均是将以太网报文承载到某种隧道层面,差异性在于选择和构造隧道的不同,而底层均是IP转发。

对于现网设备而言,VXLAN和STT对流量均衡要求较低,即负载链路负载分担适应性好,一般的网络设备都能对L2(第二层)~L4(第四层)的数据内容参数进行链路聚合或等价路由的流量均衡,NVGRE则需要网络设备对GRE扩展头感知并对flow ID进行Hash,并需要硬件升级;STT对TCP有较大修改,隧道模式接近UDP性质,隧道构造技术属于革新性的,且复杂度较高。VXLAN则利用了现有通用的UDP传输,成熟性极高。总体比较,VXLAN技术相对另外两种技术具有一定优势。

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员+网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机,一切归软件控制,从而实现自动化部署。这就是网络虚拟化在数据中心中最大的价值所在,也是大家明知商品现货服务器的性能远远比不上专用硬件交换机,但还是使用网络虚拟化技术的根本原因。甚至可以说软件定义网络概念的提出,在很大程度上是为了解决数据中心里面虚拟机部署复杂的问题。云计算是软件定义网络发展的第一推动力,而软件定义网络为网络虚拟化、软件定义和云计算提供了强有力的自动化手段。

网络叠加技术作为软件定义网络在数据平面的实现手段,解决了虚拟机迁移范围受网络架构限制、虚拟机规模受网络规格限制、网络隔离/分离能力限制等问题。同时,各种支持网络叠加的协议、技术正不断演进,VXLAN作为一种典型的叠加协议,最具有代表性,而且Linux内核3.7已经加入了对VXLAN协议的支持。另外,除了本小节介绍的VXLAN、NVGRE、STT,一个由IETF提交的网络虚拟化叠加(NVo3草案也在讨论之中;各大硬件厂商都在积极参与标准的制定,研发支持网络叠加协议的网络产品,这些都在推动着软件定义网络技术的进步。

(文/Ricky - HPC高性能计算与存储专家、大数据专家、数据库专家及学者)

· END ·

相关文章:

揭秘大数据 | 23、软件定义网络

软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机&#xf…...

前端api(请求后端)简易template

微信小程序 API 模块模板 基本 API 模块结构 /*** 示例API模块*/ const api require(../api); const config require(../../config/index);// 示例API对象 const exampleApi {// API方法定义... };// 导出模块 module.exports exampleApi;标准 RESTful 请求方法 获取列表…...

【力扣】重排链表

重排链表 代码 class Solution { public:void reorderList(ListNode* head) {//当链表只有一个节点或两个节点时直接返回空,不用重排if (head->next NULL || head->next->next NULL) return;//1. 进行分割链表ListNode* fast head, *slow head;ListNode* end1 N…...

选 Hibernate 还是 MyBatis?全方位差异解读

Hibernate 和 MyBatis 都是 Java 开发中用于处理数据库操作的持久化框架,不过它们在实现技术上存在诸多差异,下面从多个方面进行对比: 1. 映射机制 Hibernate:采用全自动的对象关系映射(ORM)机制&#xf…...

SvelteKit 最新中文文档教程(21)—— 最佳实践之图片

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…...

win10下github libiec61850库编译调试sntp_example

libiec61850 https://github.com/mz-automation/libiec61850 v1.6 简介 libiec61850 是一个开源&#xff08;GPLv3&#xff09;的 IEC 61850 客户端和服务器库实现&#xff0c;支持 MMS、GOOSE 和 SV 协议。它使用 C 语言&#xff08;根据 C99 标准&#xff09;实现&#xf…...

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…...

Qt QML实现Windows桌面歌词动态播放效果

前言 使用Qt5.15.2&#xff0c;QML实现简单的歌词动态播放效果。 效果图如下&#xff1a; 注&#xff1a;这里只是为了演示播放效果&#xff0c;并未真正加载音频进行播放。可以在此基础上进行扩展。 正文 关键代码 QML部分 import QtQuick 2.15 import QtQuick.Window 2.…...

Qt GUI 库总结

Qt GUI 库总结 Qt GUI 库&#xff08;QtGui&#xff09;是 Qt 框架中负责图形用户界面&#xff08;GUI&#xff09;开发的核心模块。本文将一步步详解 QtGui&#xff0c;从基础入门到高级应用&#xff0c;帮助你全面掌握其功能。以下内容包括环境配置、基本功能、核心特性及进…...

[dp16_两个数组] 通配符匹配 | 交错字符串 | 两个字符串的最小ASCII删除和

目录 1.通配符匹配 题解 2.交错字符串 题解 3.两个字符串的最小ASCII删除和 1.通配符匹配 链接&#xff1a;44. 通配符匹配 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字…...

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...

【计算机视觉】OpenCV实战项目-AdvancedLaneDetection 车道检测

AdvancedLaneDetection 项目解析 项目概述项目结构功能和步骤依赖项使用方法项目特点改进建议结论运行项目1. 克隆项目仓库2. 安装依赖项创建虚拟环境&#xff08;可选&#xff09;激活虚拟环境安装依赖项 3. 准备数据4. 运行项目5. 调整配置&#xff08;可选&#xff09;6. 查…...

趣味编程之分布式系统:负载均衡的“雨露均沾“艺术

#此篇文章由Deepseek大力支持&#x1f60b; 凌晨三点&#xff0c;西二旗某火锅店后厨—— “羊肉卷走3号桌&#xff01;” “肥牛卷去7号&#xff01;” “虾滑优先给VIP区&#xff01;” 我蹲在传菜口的监控屏幕前&#xff0c;看着机器人服务生们忙而不乱地穿梭。突然间&am…...

移植firefly core-1126-jd4官方sdk源码到其他rv1126板卡时 kernel启动中失去响应问题解决

问题背景 在项目中采用firefly core-1126-jd4的sdk适配其他rv1126板卡遇到kernel启动中无响应。串口能看到运行到usb、mmc等模块驱动流程&#xff0c;但之后就打印&#xff0c;通过追加打印确认usb、mmc模块的init已经执行完&#xff0c;怀疑是执行其他某个静态编译进kernel的…...

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…...

对于“人工智能+教育”的一些思考

如果说人工智能当下最合适的落地场景&#xff0c;那么进入课堂这件事一定是排在靠前的位置。从当下的趋势来看&#xff0c;人工智能进入课堂已经不是设想&#xff0c;而是我们必须要去做的一件事了。 方向有了&#xff0c;但是问题是&#xff1a;人工智能进入中小学课堂到底应该…...

Android audio系统四 audiopolicy与audioflinger播放和录音

播放/录音在上层是通过AudioTrack与AudioRecord实现的。通过一张简单的流程图查看audiopolicy与audioflinger进行了哪些操作...

【Pandas】pandas DataFrame xs

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

开源一体化白板工具Drawnix本地部署打造毫秒级响应的远程协作空间

文章目录 前言1、什么是Drawnix&#xff1f;2、部署Drawnix的环境和步骤3、Drawnix的简单使用方法4、安装cpolar内网穿透5、配置公网地址6、配置固定二级子域名公网地址总结 前言 想象一下&#xff0c;你是一个创意满满的设计师&#xff0c;脑海中涌现出无数灵感火花。你急忙打…...

UMAEA论文阅读

Preliminaries MMKG为一个五元组G{E, R, A, V, T}&#xff0c;其中E、R、A和V分别表示实体集、关系集、属性集和图像集。 T⊆ERE是关系三元组集。 给定两个MMKG G1 {E1, R1, A1, V1, T1} 和 G2 {E2, R2, A2, V2, T2}&#xff0c; MMEA旨在识别每个实体对&#xff08;e1…...

捕鱼船检测数据集VOC+YOLO格式2105张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2105 标注数量(xml文件个数)&#xff1a;2105 标注数量(txt文件个数)&#xff1a;2105 …...

R4打卡——pytorch实现LSTM预测火灾

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nndata pd.read_csv("da…...

【数字图像处理】图像增强

图像增强——频率域分析 卷积定理 函数卷积的傅里叶变换是函数傅里叶变换的乘积&#xff0c;即&#xff1a;一个域中的卷积相当于另一个域中的乘积 F(x)为傅里叶变换 傅里叶 傅里叶级数&#xff1a;任何周期函数都可以用不同频率的正弦函数和余弦函数构成的无穷级数来表示。 正…...

Windows平台用vistual studio 2017打包制作C++动态库

1. 创建库项目 打开 Visual Studio 2017&#xff0c;选择 文件 → 新建 → 项目。选择 Visual C → Windows 桌面 → 动态链接库 (DLL) 或 静态库 (LIB)。 动态库 (DLL)&#xff1a;生成 .dll 和 .lib&#xff08;导出符号表&#xff09;。静态库 (LIB)&#xff1a;生成 .lib&…...

QT日历控件重写美化

效果图 先放一个效果图以供大家参考&#xff0c;大家可以根据自己需要的效果来调整自己的控件&#xff0c;日历控件实现了自定义日历选择框&#xff0c;设置了表头颜色&#xff0c;设置日历当天重要事件提醒功能。 设置表头样式 setVerticalHeaderFormat(QCalendarWidget::NoV…...

单细胞分析读取处理大型数十万细胞的数据集的优化

单细胞分析读取处理大型数十万细胞的数据集的优化 背景简介 有朋友反映用自己的笔记本电脑在分析比较大的单细胞数据集的时候&#xff0c;比如细胞数量有十万个以上甚至几十万个的时候&#xff0c;可能自己的电脑的内存32G或64G都不够用&#xff0c;一般来说&#xff0c;做生…...

HTTP 3.0 协议的特点

HTTP/3 是互联网传输协议的一次重要升级&#xff0c;相较于 HTTP/2&#xff0c;它引入了多项显著改进和新特性。 基于 QUIC 协议&#xff1a; HTTP/3 采用了 QUIC&#xff08;Quick UDP Internet Connections&#xff09;作为底层传输协议&#xff0c;QUIC 基于 UDP&#xff0…...

电子电器架构 --- 下一代汽车电子/电气(E/E)架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…...

08软件测试需求分析案例-删除用户

删除用户是后台管理菜单的一个功能模块&#xff0c;只有admin才有删除用户的权限。不可删除admin。 1.1 通读文档 通读需求规格说明书是提取信息&#xff0c;提出问题&#xff0c;输出具有逻辑、规则、流程的业务步骤。 信息&#xff1a;此功能应为用户提供确认删除的功能。…...

await 在多线程,子线程中的使用

await 在多线程,子线程中的使用 await self.send_reply(user, user, user, auto_content, reply) 这行代码是在一个异步函数里调用类的实例方法 send_reply 代码含义 1. await 关键字 在 Python 的异步编程里,await 关键字的作用是暂停当前异步函数的执行,直到 await 后…...

NLP高频面试题(四十六)——Transformer 架构中的位置编码及其演化详解

引言 Transformer 模型(Vaswani 等人,2017)在序列建模中取得了革命性突破,利用自注意力机制实现了并行的序列处理。然而,Transformer 本身对序列的顺序信息不敏感:输入序列元素在自注意力中是无排列的(Permutation-invariant)。换言之,Transformer 缺乏像 RNN 那样的…...

C++笔记-list

list即是我们之前学的链表&#xff0c;这篇主要还是讲解list的底层实现&#xff0c;前面会讲一些list区别于前面string和vector的一些接口以及它们的注意事项。 一.list的基本使用 和之前的string&#xff0c;vector一样&#xff0c;有很多之前见过的一些接口&#xff0c;经过…...

机器学习 | 细说Deep Q-Network(DQN)

文章目录 &#x1f4da;传统Q学习的局限性&#x1f4da;DQN介绍&#x1f407;核心思想&#x1f407;关键技术&#x1f407;DQN的工作流程⭐️流程分步讲解&#x1f504; 整体流程循环小结 &#x1f407;DQN的局限性及改进方向 &#x1f440;参考视频&博客 什么是 DQN (Rein…...

【SpringBoot+Vue自学笔记】003 SpringBoot Controll

跟着这位老师学习的&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 这段话的意思其实是&#xff1a;Spring Boot 简化了传统 Web 项目的搭建流程&#xff0c;让你少折腾配置&#xff0c;直接开搞业务逻辑。 &#x1f52…...

Sentinel源码—4.FlowSlot实现流控的原理一

大纲 1.FlowSlot根据流控规则对请求进行限流 2.FlowSlot实现流控规则的快速失败效果的原理 3.FlowSlot实现流控规则中排队等待效果的原理 4.FlowSlot实现流控规则中Warm Up效果的原理 1.FlowSlot根据流控规则对请求进行限流 (1)流控规则FlowRule的配置Demo (2)注册流控监…...

跟康师傅学Java-基础语法

跟康师傅学Java-基础SE 一、Java语言概述 1. 基本概念 什么是Java?干什么的? 前端是服务员,java做后台的,服务器,好比餐馆的厨师! Java之父:詹姆斯.高斯林(James Gosling) 软件:一系列按照特定顺序组织的计算机数据和指令的集合。分为系统软件和应用软件。 程序…...

Java语言实现递归调用算法

1. 递归调用原理 递归是一种编程技巧&#xff0c;其中函数直接或间接地调用自身。递归的核心思想是将一个复杂问题分解为更小的子问题&#xff0c;直到问题变得足够简单可以直接解决。递归通常包含两个部分&#xff1a; 1. 基础情况&#xff08;Base Case&#xff09;&#xff…...

【数据结构_10】二叉树(1)

一、树 树是一种非线性的数据结构&#xff0c;是由n个有限节点组成一个具有层次关系的集合。树的每个节点能够延伸出多个子节点&#xff0c;但每个子节点只能由一个父节点。 树形结构中&#xff0c;子树之间不能有交集&#xff0c;否则就不是树形结构。 二、树的表示形式 1…...

c++:智能指针

1.智能指针使用场景与优势 void Func() { int* array1 new int[10]; int* array2 new int[10]; try { int len, time; cin >> len >> time; cout << Divide(len, time) << endl; } catch (...) { cout << "delete []" << arr…...

RISC-V简介

RISC-V简介 1. RISC-V RISC-V&#xff08;发音为“riskfive”&#xff09;是一个基于精简指令集&#xff08;RISC&#xff09;原则的全新开源指令集架构&#xff08;ISA&#xff09;。其中的字母“V”包含两层意思&#xff0c;一是这是Berkeley从RISCI开始设计的第五代指令集…...

Google Test 与 Google Mock:C++ 测试与模拟的完美结合

Google Test 与 Google Mock&#xff1a;C 测试与模拟的完美结合 摘要 本文深入解析 Google Test&#xff08;GTest&#xff09;和 Google Mock&#xff08;GMock&#xff09;的核心功能与使用方法&#xff0c;探讨两者在 C 项目中的联合应用及集成策略。通过详细的功能介绍、…...

c语言数据结构----------二叉排序树

#include <stdio.h> #include <malloc.h>//定义二叉排序树 typedef struct BSTnode {int key; //节点值int keyNull; //便于地址传递struct BSTnode *lchild;struct BSTnode *rchild; } BSTnode;//往二叉排序树插入结点 int BSTInsert(BSTnode *T, int k) {if (…...

Sysstat学习

Sysstat&#xff08;System Statistics&#xff09;是一个功能强大的开源工具集&#xff0c;用于监控 Linux 系统的性能和资源使用情况&#xff0c;特别适用于 Ubuntu 系统。它包含多个工具&#xff0c;如 sar、iostat、mpstat 和 pidstat&#xff0c;帮助系统管理员实时或历史…...

智能体开发范式革命:Cangjie Magic的颠覆性创新与行业重塑

开篇:一场静悄悄的技术革命 2025年春季,人工智能领域发生了一场意义深远却鲜为人知的变革。仓颉社区推出的Cangjie Magic智能体开发平台,正以润物细无声的方式重塑着AI应用的构建范式。这并非简单的工具迭代,而是一次从底层逻辑到顶层设计的全面革新。本文将带领读者深入探…...

k8s 下 java 服务出现 OOM 后获取 dump 文件

文章目录 背景解决第 1 步:通过 Dockerfile 挂载 NFS 盘第 2 步:修改 dump 路径为 NFS 盘路径第 3 步:OOM dump 验证参考背景 😂 背景:项目部署在RainBond(k8s)环境下,容器出现 OOM 异常后,k8s 会自动进行滚动更新。 恰恰因为滚动更新,会导致原来的容器被删除。这…...

16位海明码解码电路设计教程

## 1. 海明码基本原理 ### 1.1 什么是海明码 海明码(Hamming Code)是一种能够检测并纠正单比特错误的纠错码&#xff0c;由理查德海明(Richard Hamming)于1950年发明。它通过添加几个校验位(奇偶校验位)到原始数据中&#xff0c;使得数据在传输过程中发生单比特错误时能够被检测…...

九、数据库day01--认识

文章目录 一、认识数据库1.数据库分类关系型数据库核⼼要素示例 2. SQL 语⾔3. MySQL 数据库介绍4. 数据库连接⼯具 Navicat连接数据库操作步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、认识数据库 说明: 数据库是专⻔⽤来存储数据的软…...

2.深入剖析 Rust+Axum 类型安全路由系统

摘要 详细解读 RustAxum 路由系统的关键设计原理&#xff0c;涵盖基于 Rust 类型系统的路由匹配机制、动态路径参数与正则表达式验证以及嵌套路由与模块化组织等多种特性。 一、引言 在现代 Web 开发中&#xff0c;路由系统是构建 Web 应用的核心组件之一&#xff0c;它负责…...

深度学习 从入门到精通 day_02

1. 自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。 1.1 基础概念 1. 张量 &#xff1a…...