保姆级教程,一文了解LVS
目录
一.什么是LVS
tips:
二.优点(为什么要用LVS?)
三.作用
四.程序组成
五.LVS 负载均衡集群的类型
六.分布式内容
六.一.分布式存储
六.二.分布式计算
六.三.分布式常见应用
tips:
七.LVS 涉及相关的术语
八.LVS 负载均衡的工作原理
九.lvs集群的类型
十.构思图
1.NAT(网络地址转换)模式
2.DR(直接路由)模式
3.TUN(IP隧道)模式
4.fullnet模式
tips:
十二.多种调度算法
静态调度算法:
动态调度算法:
tips:
十三.ipvsadm命令
1.核心功能:
1.1集群服务管理:增、删、改
1.2集群服务的RS管理:增、删、改
1.3查看
2.保存规则
3.开机启动
十四.解决vip响应问题
十五.防火墙标签解决轮询错误
1.轮询规则中可能会遇到的错误
2.防火墙标记解决轮询调度问题
3.lvs持久链接
一.什么是LVS
LVS(Linux Virtual Server)是一种基于Linux内核的高性能、高可用的负载均衡软件,它可以将网络流量分发到多个服务器上,提高系统的可用性和性能。 LVS的负载均衡功能实现在Linux内核中,通过对网络数据包的转发和调度,将来自客户端的请求分发到多台服务器上,从而实现负载均衡。
LVS支持多种负载均衡算法:轮询、加权轮询、最小链接数等,同时还支持多种会话保持方法:IP散列、基于源 IP 端口的哈希、基于 Cookie 的会话保持等。
LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储层。
tips:
本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
LVS支持多种协议的负载均衡,包括TCP、UDP、HTTP等。
IP 散列(IP Hash):根据客户端的 IP 地址计算哈希值,通过哈希值将来自同一 IP 地址的请求始终分发到同一台后端服务器。
基于源 IP 端口的哈希(Source IP and Port Hash):结合客户端的 IP 地址和端口号计算哈希值,以此确定请求分发的后端服务器。
基于 Cookie 的会话保持:LVS 可以识别客户端请求中的特定 Cookie 信息,根据 Cookie 来将请求分配到相应的后端服务器。
二.优点(为什么要用LVS?)
1.LVS的负载均衡功能实现在Linux内核中,具有非常高的性能和稳定性。
2.LVS支持多台服务器共同提供服务,其中一台服务器出现故障时,LVS可以自动将流量转发到其他正常工作的服务器上,从而提高系统的可用性。
3.LVS支持多种负载均衡算法和会话保持方法,可以根据实际需求进行配置。
三.作用
1.主要用于多服务器的负载均衡。
2.工作在网络层,可实现高性能,高可用的服务器集群技术。
3.廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
4.易用,配置简单,有多种负载均衡的方法。
5.稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
6.可扩展性好。
四.程序组成
LVS 由两部分程序组成: 1.ipvs(ip virtual server):LVS 是基于内核态的 Netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。 2.ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 Netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 Netfilter,那 ipvsadm 就是类似 iptables 工具的地位。
五.LVS 负载均衡集群的类型
1.负载均衡群集:Load Balance Cluster,以提高应用系统的响应能力,尽可能处理更多的访问请求、减少延迟为目标,从而获得高并发、高负载的整体性能。
2.高可用群集:High Availability Cluster,以提高应用系统的可靠性,尽可能的减少终端时间为目标、确保服务的连续性,达到高可用的容错效果。
3.高性能运算群集:High Performance Computer Cluster,以提高应用系统的 CPU 运算速度、扩展硬件资源和分析能力为目标、从而获得相当于大型、超级计算机的高性能计算能力。
六.分布式内容
1.分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。
2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。
3.不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题,提供可扩展性以及高可用性,业务中使用分布式的场景主要有分布式存储以及分布式计算。分布式存储中可以将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份。
六.一.分布式存储
Ceph(是一个统一的、分布式的存储系统,具有出色的扩展性和可靠性。它支持对象存储、块存储和文件存储,被广泛应用于云计算和大规模数据存储场景。), GlusterFs(一款开源的分布式文件系统,能够通过将多个服务器的存储资源整合起来,提供大容量、高并发的文件存储服务,常见于企业级的文件共享和存储解决方案中), FastDFS(是一个轻量级的分布式文件系统,特别适合存储中小文件,如图片、文档等。在互联网应用中,FastDFS 常用于图片服务器的搭建), MogileFs(用于分布式存储和管理大量的静态文件,具有良好的容错性和可扩展性。)
六.二.分布式计算
hadoop(是一个大数据处理框架,包含了分布式文件系统(HDFS)和分布式计算模型(MapReduce)。它能够处理 PB 级别的数据,常用于数据挖掘、数据分析等领域), Spark(是一个快速、通用的大数据计算引擎,相比 Hadoop 的 MapReduce,Spark 具有更高的计算效率和更丰富的计算模型)
六.三.分布式常见应用
分布式应用-服务按照功能拆分,使用微服务 分布式静态资源--静态资源放在不同的存储集群上 分布式数据和存储--使用key-value缓存系统 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
tips:
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。
分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率, 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
七.LVS 涉及相关的术语
VS: Virtual Server,负责调度
DS:Director Server,前端负载均衡节点服务器,调度器。
RS:Real Server,后端真实服务器。
CIP:Client IP,客户端 IP 地址。
VIP:Virtual IP,负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
RIP:RealServer IP,负载均衡后端的真实服务器 IP 地址。
DIP:Director IP,负载均衡与后端服务器通信的 IP 地址。
CMAC:客户端 MAC 地址,LVS 连接的路由器的 MAC 地址。
VMAC:负载均衡 LVS 的 VIP 对应的 MAC 地址。
DMAC:负载均衡 LVS 的 DIP 对应的 MAC 地址。
RMAC:后端真实服务器的 RIP 地址对应的 MAC 地址。
访问流程:CIP <--> VIP == DIP <--> RIP
八.LVS 负载均衡的工作原理
简单点:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
1.客户端发送请求 客户端向 LVS 服务器发送请求,请求的目标通常是一个虚拟 IP 地址(VIP)。
2.LVS 接收请求 LVS 服务器接收到客户端的请求。
3.选择后端服务器 LVS 根据预先配置的负载均衡算法从后端的真实服务器(Real Server)中选择一台合适的服务器。常见的负载均衡算法包括:
-轮询(Round Robin):依次将请求分配给各台服务器。
-加权轮询(Weighted Round Robin):根据服务器的权重依次分配请求。
-最少连接(Least Connections):将请求分配给当前连接数最少的服务器。
-加权最少连接(Weighted Least Connections):结合服务器权重和连接数进行分配。
4.转发请求 根据选择的结果,LVS 以不同的工作模式将请求转发给后端服务器: -
NAT 模式:修改请求数据包的目标 IP 地址为所选后端服务器的 IP 地址,并将响应数据包的源 IP 地址修改为 VIP 地址,再转发给客户端。
-DR 模式:将请求数据包的目标 MAC 地址修改为所选后端服务器的 MAC 地址,直接将数据包转发到后端服务器。
-TUN 模式:给请求数据包加上新的 IP 头,将数据包封装后通过隧道转发给后端服务器。
-fullnet模式:通过同时修改请求报文的源IP地址和目标IP地址进行转发。
5.后端服务器处理请求 后端服务器接收到请求后进行处理,并将响应直接返回给客户端。 例如: 假设一个网站使用 LVS 进行负载均衡,有三台后端服务器 A、B、C。采用轮询算法,当第一个请求到来时,LVS 选择服务器 A 处理;第二个请求选择服务器 B;第三个请求选择服务器 C,以此类推。如果采用加权轮询,假设服务器 A 的权重为 2,B 和 C 的权重为 1,那么大约每两个请求中有一个会分配给 A,而 B 和 C 各分配一个。 通过 LVS 的负载均衡,可以有效地提高系统的处理能力和可用性,确保客户端能够快速、稳定地获得服务。
九.lvs集群的类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
十.构思图
十一.四种工作模式
1.NAT(网络地址转换)模式
原理:在NAT模式下,LVS作为客户端和后端服务器之间的中间人,接收来自客户端的请求,将请求的目标IP地址和端口转换为后端服务器的IP地址和端口,然后将请求转发给后端服务器。后端服务器处理请求后,将响应数据包发送给LVS,LVS再将响应数据包的源IP地址和端口修改为自己的IP地址和端口,然后将响应返回给客户端。
特点: 请求和响应的数据包都必须经过LVS,这可能导致LVS成为瓶颈。同时,NAT模式支持跨网段通信。 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP。 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈。 支持端口映射,可修改请求报文的目标PORT。VS必须是Linux系统,RS可以是任意OS系统。 客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
2.DR(直接路由)模式
原理:在DR模式下,LVS不会修改数据包中的IP地址和端口,而是直接修改数据帧的目标MAC地址为所选后端服务器的MAC地址,并通过交换机或路由器将数据包转发给后端服务器。后端服务器处理请求后,直接将响应数据包发送给客户端,无需经过LVS。
特点:由于响应数据包不经过LVS,因此LVS不会成为瓶颈。但DR模式要求LVS和后端服务器必须在同一个局域网内,因为它们是通过MAC地址进行通信的。 DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。 在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip
3.TUN(IP隧道)模式
原理:在TUN模式下,LVS将客户端的请求数据包封装在一个新的IP隧道中,并将封装后的数据包发送给后端服务器。后端服务器处理请求后,将响应数据包通过隧道返回给LVS,LVS再将响应数据包解封装后发送给客户端。
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
TUN模式特点 1.DIP, VIP, RIP都应该是公网地址 2.RS的网关一般不能指向DIP 3.请求报文要经由Director,但响应不能经由Director 4.不支持端口映射 5.RS的OS须支持隧道功能 6.TUN模式支持跨网段通信,因为数据包是通过IP隧道在LVS和后端服务器之间传输的。但TUN模式需要额外的处理来封装和解封装数据包,可能会增加一些处理开销。
4.fullnet模式
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发 CIP --> DIP VIP --> RIP
1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
3.请求和响应报文都经由Director 4.支持端口映射 (所用内核不支持)
tips:
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
十二.多种调度算法
1.ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法 静态方法:仅根据算法本身进行调度,不考虑RS的负载情况 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
2.LVS支持多种调度算法,用于确定如何将请求分发到后端服务器上。
静态调度算法:
1.轮询(RR):按顺序轮流分配请求到不同的服务器上,确保每台服务器接收到的请求数大致相同。
2.加权轮询(WRR):根据后端服务器的处理能力给每台服务器分配不同的权值,权值越高的服务器接收到的请求数越多。
3.源地址散列(SH):根据请求的源IP地址进行散列运算,将请求分配到同一台服务器上,以保证来自同一客户端的请求始终被同一台服务器处理。
4.目标地址散列(DH):目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态调度算法:
1.LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
2.WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3.SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4.NQ:Never Queue,第一轮均匀分配,后续SED
5.LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6.LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
tips:
最短延迟调度:SED,最短的预期延迟调度算法将网络连接分配给具有最短的预期延迟的服务器。如果将请求发送到第 i 个服务器,则预期的延迟时间为(Ci +1)/Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重) 。
永不排队调度:NQ,从不队列调度算法采用两速模型。当有空闲服务器可用时,请求会发送到空闲服务器,而不是等待快速响应的服务器。如果没有可用的空闲服务器,则请求将被发送到服务器,以使其预期延迟最小化(最短预期延迟调度算法)
十三.ipvsadm命令
1.核心功能:
1.1集群服务管理:增、删、改
-A 用于添加一个新的虚拟服务。
-E 用于编辑现有的虚拟服务。
-t 表示 TCP 协议,-u 表示 UDP 协议,-f 表示防火墙标记。
service-address 是集群服务的地址。
-s scheduler 用于指定调度算法,如轮询、加权轮询等。
-p [timeout] 用于设置持久连接的超时时间。
-M netmask 指定网络掩码。
--pepersistence_engine 涉及持久化引擎的相关设置。
-b sched-flags 用于设置调度标志。
ipvsadm -D -t|u|f service-address:用于删除指定的虚拟服务。
ipvsadm –C:清空当前的 IPVS 规则和连接信息。
ipvsadm –R:重载之前保存的规则。
ipvsadm -S [-n]:保存当前的规则配置。-n 选项通常用于以数字形式显示地址和端口,而不是进行 DNS 解析。
1.2集群服务的RS管理:增、删、改
-a 用于添加一个真实服务器(Real Server)到虚拟服务中。
-e 用于编辑现有的真实服务器配置。 -e #更改realserver
-t 表示 TCP 协议,-u 表示 UDP 协议,-f 表示防火墙标记。
service-address 是之前定义的虚拟服务的地址。
-r server-address 是要添加或编辑的真实服务器的地址。
-g 表示使用直接路由(DR)模式,-i 表示使用隧道(TUN)模式,-m 表示使用 NAT 模式。
-w weight 用于设置真实服务器的权重,决定其在负载均衡中的处理能力比例。
ipvsadm -d -t|u|f service-address -r server-address:用于从虚拟服务中删除指定的真实服务器。
ipvsadm -L|l [options]:用于查看真实服务器(RS)的相关信息。常见的选项可以包括 -n 以数字形式显示地址和端口等。
-C #清空lvs策略
-n #不做解析
--rate :输出速率信息
ipvsadm -Z [-t|u|f service-address] 清楚计数器
1.3查看
2.保存规则
ipvsadm-save > /etc/sysconfig/ipvsadm-config
3.开机启动
systemctl enable --now ipvsadm.service
十四.解决vip响应问题
1.DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
a.在前端网关做静态绑定
b.在各RS使用arptables
c.在各RS修改内核参数,来限制arp响应和通告的级别
2.限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
3.限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
4.配置要点
a.Director服务器采用双IP桥接网络,一个是VPP,一个DIP
b.Web服务器采用和DIP相同的网段和Director连接
c.每个Web服务器配置VIP
d.每个web服务器可以出外网
十五.防火墙标签解决轮询错误
1.轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题,当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。
测试问题
[root@client ~]# curl http://192.168.0.200;curl -k https://192.168.0.200
RS1 server - 192.168.0.10
RS1 server - 192.168.0.10 #当访问vip时两次调度都到了
2.防火墙标记解决轮询调度问题
FWM:FireWall Mark MARK target 可用于给特定的报文打标记,
--set-mark value 其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度
实现方法:
在Director主机打标记:
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $portl,$port2,..-i MARK --set-mark NUMBER
在Director主机基于标记定义集群服务: ipvsadm -A -f NUMBER [options]
示例如下
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666 #在vs调度器中设定端口标签,人为80和443是一个整体设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
curl -k https://192.168.0.200;curl 192.168.0.200 #测试结果
3.lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。
解决方案 在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上。 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。 如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。
ipvsadm -A|E -tlulf service-address [-s scheduler] [-p [timeout]]
#默认360秒 在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
[root@lvs ~]# ipvsadm -LnC
tips: 相关的配置可以看lvs-nat模式和dr模式集群原理及部署方法
相关文章:

保姆级教程,一文了解LVS
目录 一.什么是LVS tips: 二.优点(为什么要用LVS?) 三.作用 四.程序组成 五.LVS 负载均衡集群的类型 六.分布式内容 六.一.分布式存储 六.二.分布式计算 六.三.分布式常见应用 tips: 七.LVS 涉及相关的术语 八.LVS 负…...

【STM32】DMA数据转运(存储器到存储器)
本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 开启DMA通道 DMA初始化框架 更改转运次数 DMA应用实例-…...
【Android】通过代码打开输入法
获取焦点 binding.editText.requestFocus()打开键盘 val imm getSystemService(InputMethodManager::class.java) imm.showSoftInput(binding.editText, InputMethodManager.SHOW_IMPLICIT)...
爬虫集群部署:Scrapyd 框架深度解析
🕵️♂️ 爬虫集群部署:Scrapyd 框架深度解析 🛠️ Scrapyd 环境部署 Scrapyd 是一个开源的 Python 爬虫框架,专为分布式爬虫设计。它允许用户在集群中调度和管理爬虫任务,并提供了简洁的 API 进行控制。以下是 Scr…...
pytorch GPU操作事例
>>> import torch >>> if_cuda torch.cuda.is_available() >>> print("if_cuda",if_cuda) if_cuda True >>> gpu_count torch.cuda.device_count() >>> print("gpu_count",gpu_count) gpu_count 8...

linux常见性能监控工具
常用命令top、free 、vmsata、iostat 、sar命令 具体更详细命令可以查看手册,这里只是简述方便找工具 整体性能top,内存看free,磁盘cpu内存历史数据可以vmsata、iostat 、sar、iotop top命令 交互:按P按照CPU排序,按M按照内存…...

C++ | Leetcode C++题解之第331题验证二叉树的前序序列化
题目: 题解: class Solution { public:bool isValidSerialization(string preorder) {int n preorder.length();int i 0;int slots 1;while (i < n) {if (slots 0) {return false;}if (preorder[i] ,) {i;} else if (preorder[i] #){slots--;i…...
【多模态处理】利用GPT逐一读取本地图片并生成描述并保存,支持崩溃后从最新进度恢复
【多模态处理】利用GPT逐一读取本地图片并生成描述,支持崩溃后从最新进度恢复题 代码功能:核心功能最后碎碎念 代码(使用中转平台url):代码(直接使用openai的key) 注意 代码功能: 读…...
【rk3588】获取相机画面
需求:获取相机画面,并在连接HDMI线,在显示器上显示 查找设备 v4l2-ctl --list-devices H65 USB CAMERA: H65 USB CAMERA (usb-0000:00:14.0-1):/dev/video2/dev/video3播放视频 gst-launch-1.0 v4l2src device/dev/video22 ! video/x-ra…...

数据结构的基本概念
数据结构的基本概念 数据是什么? 数据 : 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别(二进制0|1)和处理的符号的集合。数据是计算机程序加工的原料。 早期计算机处理的…...

AI人工智能机器学习
AI人工智能 机器学习的类型(ML) 学习意味着通过学习或经验获得知识或技能。 基于此,我们可以定义机器学习(ML) 它被定义为计算机科学领域,更具体地说是人工智能的应用,它提供计算机系统学习数据和改进经验而不被明确编程的能力。 基本上&…...

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts
Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…...
W3C XML 活动
关于W3C的XML活动,XML(可扩展标记语言)是一种用于描述、存储、传送及交换数据的标准。W3C(万维网联盟)对XML的发展起到了关键作用,推出了一系列的版本和相关的技术规范。 XML版本历史: XML 1.0&…...

vue请求springboot接口下载zip文件
说明 其实只需要按照普通文件流下载即可,以下是一个例子,仅供参考。 springboot接口 RestController RequestMapping("/api/files") public class FileController {GetMapping("/download")public ResponseEntity<Resource>…...

PySide6||QPushButton的QSS样式
1、狗狗拜按钮 QQ202484-03338 (online-video-cutter.com) /* QPushButton的基本样式 */ QPushButton { background-image:url(:/xxx/第1帧.png); /* 设置背景图片 */ background-repeat: no-repeat; /* 不重复背景图片 */ background-position: center; /* 将背景图片居中…...
HarmonyOS鸿蒙应用开发之ArkTS基本语法
ArkTS(Ark TypeScript)是一种基于TypeScript的扩展语言,专为鸿蒙应用开发设计。它在保持TypeScript基本语法风格的基础上,对TypeScript的动态类型特性施加了更严格的约束,并引入了静态类型,以减少运行时开销…...

Web开发-CSS篇-上
CSS的发展历史 CSS(层叠样式表)最初由万维网联盟(W3C)于1996年发布。CSS1是最早的版本,它为网页设计提供了基本的样式功能,如字体、颜色和间距。随着互联网的发展,CSS也不断演进: C…...
在mac上通过 MySQL 安装包安装 MySQL 之后,终端执行 mysql 命令报错 command not found: mysql
在 mac 上通过 MySQL 安装包安装 MySQL 之后,如果在终端中运行 mysql 命令时遇到 command not found: mysql 错误,通常是因为 MySQL 的二进制文件没有被添加到系统的 PATH 环境变量中。 解决方法:手动添加 MySQL 到 PATH 环境变量 1.找到 M…...

Unity入门4——常用接口
C#中常用类和接口 DateTime:表示某个时刻 DateTime.Now:拿到系统当前时间DtaTime.TimeOfDay:获取此实例当天的时间 Quaternion:用来旋转,采用四元数,由w(实部)和x,y,z(虚…...

职业教育云计算实验实训室建设应用案例
云计算作为信息技术领域的一次革命,正在深刻改变着我们的工作和生活方式。随着企业对云计算技术的依赖日益加深,对具备云计算技能的专业人才的需求也日益迫切。职业院校面临着培养符合行业标准的云计算人才的挑战。唯众凭借其在教育技术领域的专业经验&a…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...