深入LVS内核世界:揭秘其高效背后的技术细节与实现机制

news2024/9/27 9:27:40

LVS简介

Linux virtual server,即Linux虚拟服务器,是一种基于Linux平台的高性能、高可用的服务器负载均衡技术。它主要工作在网络层、传输层(OSI参考模型的第三层、第四层),主要通过IP地址和端口号来转发网络流量。LVS可以在一台或多台服务器(称之为负载均衡器或调度器)上运行,将来自客户端的请求按照一定的策略分配给后端的服务器(称之为真实服务器或后端服务器),以达到分散负载、提高系统整体性能和可用性目的。

LVS的专业术语

  • VS:Virtual Server,虚拟服务器,负责调度

  • RS:Real Server,真实服务器,负责真正提供服务

  • CIP:Client IP,客户端IP

  • VIP:Vitrual server IP,负载均衡器虚拟IP

  • DIP:Director IP,负载均衡器IP

  • RIP:Real server IP,后端请求处理服务器IP

lvs集群体系架构

集群类型

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT

  • lvs-dr:操纵封装新的MAC地址

  • lvs-tun:在原请求IP报文之外新加一个IP首部

  • lvs-fullnat: 修改请求报文的源和目标IP

NAT模式

将客户端发送的数据包的的目标VIP在LVS上转换为一台后台服务器RS的RIP,目标端口修改为RS的端口,并发送给RS处理,RS处理完成以后将数据包中的源IP和目标IP对换,转回给LVS,LVS再将数据包中的源IP地址修改为自己的VIP,将目标IP修改为客户端的CIP,转发回给客户端。

DR模式

直连路由模式,只有客户端发来的数据流量经过LVS,此模式为数据链路层(OSI参考模型第二层)负载均衡,修改的是目的MAC地址。

在DR模式中,所有的RS都需要配置RIP和VIP两个IP地址。LVS会通过arp获取到所有RS的IP地址以及对应的MAC地址,因此LVS和RS需处于同一二层网络中。

当客户端发送请求到LVS后,LVS保持源目IP地址、端口号不变,同时将源MAC地址转换为自己的MAC地址,目的地MAC地址转换为调度到的RS的MAC地址,进行转发。

RS在回复相应报文时,源地址为VIP地址,源端口为提供服务的端口,源MAC地址为自己的MAC地址,目的地址IP为客户端的地址CIP,目的端口为客户端发起连接请求时的随机端口,目的MAC地址为网关的MAC地址。

在DR模式中,由于要求DIP和RIP在同一网段,因此无法进行大规模或远距离部署 。

TUN模式

tun模式与nat模式的不同之处在于,在LVS和RS之间的传输不需要修改数据包,而是添加一个新的IP头部(把客户端的数据包封装在一个IP tunnel中),然后发送给RS,RS接收到数据包,解开IP tunnel后,再进行相应处理,并且将数据包通过外网直接发回给客户端。

FULLNAT模式

fullnat模式解决了LVS和RS之间跨vlan通信的问题。在传统的nat模式下,LVS和RS必须位于同一个vlan内,这限制了系统的灵活性和可扩展性。而fullnat模式通过在网络层进行额外的地址转换,使得LVS和RS可以跨VLAN通信。

在FULLNAT模式下,当客户端的请求到达LVS时,LVS会将请求报文的源地址从客户端IP替换为LVS的内网IP,并将目标地址改写为RS的IP。当RS处理完请求后,响应报文会返回给LVS的内网IP。LVS在收到响应报文后,会再次进行地址转换,将源地址从RS的IP改为LVS的内网IP,目标地址改回客户端的IP,然后将报文发送给客户端。

LVS的调度算法

静态算法

  • RR:轮询算法

    • 调度器将收到的请求按照顺序轮流分配到集群中的RS。均匀地分配请求,该算法最大的特点就是实现简单,不考虑服务器连接数和负载情况

  • WRR:加权轮询算法

    • 根据RS的处理能力给予不同的权重,为性能好的服务器分配更多的请求,性能一般的分配较少的请求。

  • SH:源地址哈希算法

    • 根据请求的源IP地址作为哈希键从静态分配的哈希表中找出对应的服务器。同一个IP地址的请求始终发往第一次调度的RS,可实现会话绑定。

  • DH:目的地址哈希算法

    • 根据请求的目标IP地址作为哈希键从静态分配的哈希表中找出对应的服务器。发往同一个目标地址的请求始终转发到第一次调度的RS,可用于实现正向代理缓存场景中的负载均衡。

动态算法

  • LC:最少连接算法

    • 动态地将网络请求调度到连接数最少的RS上,当集群中的服务器性能相近时,这种算法可以进行较好的负载均衡。适用于长链接应用。其负载计算公式为:overhead=活动链接数*256+非活动连接数

  • WLC:加权最少连接算法

    • 相对于LC,当集群中服务器性能有差异时,建议使用本算法,可以使性能较好的服务器承接较大比例的活动连接。此算法是LVS的默认调度算法,负载公式为:overhead=(活动连接数*256+非活动连接数)/权重值

  • SED:最短期望延迟算法

    • 当使用WLC时,如果RS的连接数和权重比例正好一样时,下个请求将可能分配给任意一个RS,而不是性能最好的RS,SED可避免这种情况,保证了高权重优先。

  • NQ:最少队列算法

    • 使用该算法时,第一轮请求会均匀的分配给所有的RS,后续再使用SED算法,这样可以避免某些服务器可能用于得不到请求的机会

  • LBLC:基于局部的最少连接算法

    • 根据请求的目标IP找出该目标IP最近使用的服务器,若该服务器可用且没有超载,就将请求发给它;若服务器不存在或者超载,且有服务器处于一半的工作负载,则用最少连接原则将请求发给一个可用服务器。是针对目标IP地址的负载均衡算法,可以看做动态的DH算法。可根据负载情况实现正向代理、web缓存等。

  • LBLCR:带复制功能的LBLC

    • 该算法维护从一个目标IP地址到一组服务器的映射(LBLC维护的是一个目标IP地址到一 台服务器的映射)。根据请求的目标IP找出该目标IP对应的服务器组,按最少连接原则从组内选出一台没有超载的服务器, 将请求发给它;若该服务器超载,则最少连接原则从该集群中选出一台服务器加入到服务器组中,将请求发给该服务器。如果服务器组在一段时间没有修改,将最忙的服务器从组内剔除,以降低复制程度。这个算法也是针对目标IP地址的负载均衡算法,解决LBLC负载不均衡的问题,从负载重的RS复制到负载轻的RS。可根据负载情况实现正向代理、web缓存等。

在4.15版本内核以后新增加的调度算法

  • FO(Weighted Fai Over)调度算法:常用作灰度发布

    • 在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。

  • OVF(Overflow-connection)调度算法

    • 基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:

      • 未过载(未设置IP_VS_DEST_F OVERLOAD标志)

      • 真实服务器当前的活动连接数量小于其权重值

      • 其权重值不为零

LVS命令ipvsadm的使用

在集群管理中的使用

参数说明
-A增加新的集群
-E修改存在的集群
-t使用tcp协议
-u使用udp协议
-s指定调度算法,默认为wlc算法
-p设置持久连接超时,持久连接可以理解为在同一时间段同一来源的请求调度到同一台RS上
-ffirewalld mask,防火墙标记
#增加新的集群
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr

#修改已存在的集群
[root@lvs ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr

#删除集群
[root@lvs ~]# ipvsadm -D -t 172.25.254.100:80

管理集群中RS的增删改

参数说明
-a增加新的RS
-e更改已经存在的RS
-t使用tcp协议
-u使用udp协议
-f防火墙标记

-r

指向RS的IP地址
-g直连路由模式
-itunnel隧道模式
-mnat模式
-w设定权重
-Z清空计数器
-C清空LVS策略
-L查看LVS策略
-n不做解析
--rate

输出速率信息

-S保存策略到配置文件
-R从配置文件加载到策略表
#清空LVS策略
[root@lvs ~]# ipvsadm -C

#查看LVS策略表
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

#添加新的RS,nat模式
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0

#添加新的RS,dr模式
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Route   1      0          0

#设定权重
#注意:设定权重在加权算法中生效
[root@lvs ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10 -w 2
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Route   2      0          0
  -> 192.168.0.20:80              Route   1      0          0

#查看速率信息
[root@lvs ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.25.254.100:80                   0        0        0        0        0
  -> 192.168.0.10:80                     0        0        0        0        0
  -> 192.168.0.20:80                     0        0        0        0        0

#将策略保存到配置文件中
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -g -w 2
-a -t lvs:http -r 192.168.0.20:http -g -w 1

#我们再将策略表清空
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

#然后再从配置文件中导出策略
[root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Route   2      0          0
  -> 192.168.0.20:80              Route   1      0          0

LVS-NAT实验

实验环境

lvs 两个网卡,一个net,一个仅主机

        net 172.25.254.100

        仅主机 192.168.0.100

webserver1 仅主机

        192.168.0.10

        gateway 192.168.0.100

webserver2 仅主机

        192.168.0.20

        gateway 192.168.0.100

实验步骤

1、网络配置

#lvs
[root@lvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;

[root@lvs ~]# cat /etc/NetworkManager/system-connections/ens224.nmconnection
[connection]
id=ens224
type=ethernet
interface-name=ens224

[ipv4]
address1=192.168.0.100/24
method=manual
dns=114.114.114.114;

#webserver1
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=192.168.0.10/24,192.18.0.100
method=manual
dns=114.114.114.114;

#webserver2
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;

配置完成后,在lvs主机上ping两台webserver,能ping通即可

2、http服务配置

#webserver1
#下载httpd软件包
[root@webserver1 ~]# yum install httpd -y
#输入测试内容
[root@webserver1 ~]# echo webserver1 192.168.0.10 > /var/www/html/index.html
#启动httpd服务并设置开机自启
[root@webserver1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

#webserver2
#下载httpd软件包
[root@webserver2 ~]# yum install httpd -y
#输入测试内容
[root@webserver2 ~]# echo webserver2 192.168.0.20 > /var/www/html/index.html
#启动httpd服务并设置开机自启
[root@webserver2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

3、启动内核路由功能

[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

[root@lvs ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1

4、LVS配置

#下载ipvsadm软件包
[root@lvs ~]# yum install ipvsadm -y

#添加调度策略
#-A表示增加一个集群,-t表示使用TCP协议,-s rr表示使用的调度算法为rr
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr

#-a表示添加RS,-r指向RS的地址,-m表示使用nat模式
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

#查看lvs策略表
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0

5、测试访问

LVS-DR实验

实验环境

测试主机client

        NAT        172.25.254.10

路由器router

        NAT        172.25.254.100

        仅主机    192.168.0.100

调度器LVS

        仅主机        192.168.0.200

webserver1

        仅主机        192.168.0.10

webserver2

        仅主机        192.168.0.20

实验步骤

1.网络配置

#client,nat模式网卡
[root@client ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=172.25.254.10/24,172.25.254.100
method=manual

#router,双网卡,ens160为nat网卡,ens224为仅主机网卡
[root@router ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=172.25.254.100/24
method=manual

[root@router ~]# cat /etc/NetworkManager/system-connections/ens224.nmconnection
[connection]
id=ens224
type=ethernet
interface-name=ens224

[ipv4]
address1=192.168.0.50/24
method=manual

#lvs调度器,仅主机模式网卡
[root@lvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=192.168.0.200/24,192.168.0.50
method=manual

#webserver1,仅主机模式网卡
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=192.168.0.10/24,192.168.0.50
method=manual

#webserver2 仅主机模式网卡
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160

[ipv4]
address1=192.168.0.20/24,192.168.0.50
method=manual

2、http服务配置

与LVS-NAT实验相同,参考LVS-NAT实验httpd服务配置即可。

3、VIP响应问题

由于在LVS和RS主机上都要配置相同的VIP,所以会产生地址冲突,解决地址冲突的方法主要有以下三种:

①在前端网关做静态绑定

②在各RS上使用arptables

③在各RS上修改内核参数,来限制arp响应和通告级别

我们采用的是第三种方法。

内核参数参数值说明
限制响应级别:arp_ignore0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予相应

限制通告级别:

arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直连连接网络进行通告
2:必须避免将接口信息向非直连连接网络进行通告
#在LVS和RS中配置相同的VIP,为192.168.0.100
[root@lvs ~]# ip a a dev lo 192.168.0.100/32
[root@webserver1 ~]# ip a a dev lo 192.168.0.100/32
[root@webserver2 ~]# ip a a dev lo 192.168.0.100/32

#在RS中解决响应问题
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

4、LVS配置

#在LVS中配置策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10                               -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20                               -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn I                              nActConn
TCP  192.168.0.100:80 rr
  -> 192.168.0.10:80              Route   1      0          0                              
  -> 192.168.0.20:80              Route   1      0          0                              

5、启动内核路由功能

[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@router ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1

6、测试访问

防火墙标签解决轮询错误

轮询规则中可能会遇到的一些错误

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就会出现轮询错乱的问题。

当我们第一次访问80被轮询到webserver1后,下次访问443仍可能会被再次轮询到webserver1上。

#在两台webserver上安装mod_ssl,并重启httpd
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# systemctl restart httpd

#在LVS中,设置80端口和443端口两组策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.20 -g

[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:80 rr
  -> 192.168.0.10:80              Route   1      0          0
  -> 192.168.0.20:80              Route   1      0          0
TCP  192.168.0.100:443 rr
  -> 192.168.0.10:443             Route   1      0          0
  -> 192.168.0.20:443             Route   1      0          0

[root@client ~]# curl http://192.168.0.100 && curl -k https://192.168.0.100
webserver2 192.168.0.20
webserver1 192.168.0.20

防火墙标记解决轮询调度问题

FWM:firewall mark

mark target可用于给特定的报文打标记

--set-mark value

其中:value可为0xffff格式,表示16进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度。

#在LVS中, 设定端口标签,将80和443端口视为一个整体
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@client ~]# curl http://192.168.0.100 && curl -k https://192.168.0.100
webserver2 192.168.0.20
webserver1 192.168.0.10

LVS持久连接

在我们客户上网过程中,有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题,我们可以使用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。

解决方案

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了另一个RS上。

如果在短期(默认360s)内同源再来访问我们仍然按照内存中所记录的调度信息,把这个源的访问还调度到同一台RS上。

如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度的其他的RS上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Dash】Web 应用程序中的可复用组件

一、Reuable Comopnents By writing our makup in Python, we can create complex reusable components like tables without switching contexts or languages. from dash import Dash, html import pandas as pddf pd.read_csv(https://raw.githubusercontent.com/GarciaS…

程序包javax.annotation不存在

1、问题 程序包javax.annotation不存在2、原因 JDK1.8升级到17后&#xff0c;由于Java EE已经变更为Jakarta EE&#xff0c;包名以 javax 开头的需要改为 jakarta 3、解决 import javax.annotation.Resource; 替换成 import jakarta.annotation.Resource; 问题解决。 …

基于STM32开发的智能灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农业灌溉园艺灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过监测土壤湿度和环境条件&#xff0c;自动控制水泵和阀门&#xff0c;实现…

Linux系统驱动(十)设备树

文章目录 一、简介二、设备树语法&#xff08;一&#xff09;设备树的组成1. 节点的组成&#xff08;1&#xff09;节点的别名&#xff08;2&#xff09;节点可以被引用&#xff08;3&#xff09;同名节点的合并 2. 属性的组成&#xff08;1&#xff09;值的字符串表示形式&…

基于STM32开发的停车场管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 商业停车场管理住宅区停车场管理常见问题及解决方案 常见问题解决方案结论 1. 引言 停车场管理系统通过监测车辆进出情况、空余车位数量以及收费情况&#xff0…

7.2 算法设计与分析-分治法和回溯法

分治法 相对简单&#xff0c;考的概率比较低 分治法&#xff1a;对于一个规模为的问题&#xff0c;若该问题可以容易地解决则直接解决&#xff1b;否则将其分解为k个规模较小的子问题&#xff0c;这些子问题互相独立且与原问题形式相同&#xff0c;递归地解决这些子问题&…

Proxmox Install 8

Proxmox 前言 Proxmox Virtual Environment(简称PVE)是一个开源的服务器虚拟化解决方案,它基于QEMU/KVM和LXC技术。Proxmox VE提供了一个易于使用的Web界面和命令行工具,允许用户轻松地创建和管理虚拟机(VMs)和容器。 Proxmox download Proxmox 官网下载Proxmox 百度网…

Midjourney入门-提示词基础撰写与公式

​ 前言 在前几篇教程里我们已经可以初步使用Midjourney进行出图了。 包括也了解了Midjourney的指令与参数。 但如果你想用Midjourney去生成各种各样高质量的图片&#xff0c; 并且生成的图片是你想要的画面内容&#xff0c;也就是更好控制生成图片的画面内容与风格&#xf…

电脑小白需要知道这些

电脑小白需要知道这些 解决问题 对于刚买到电脑&#xff0c;不懂电脑的新手需要学什么和知道什么&#xff0c;有什么是误区 需要知道 1.Wiodws 10\Windows11不在需要安装杀毒软件 甚至于电脑自带防火墙都可以关闭&#xff08;有时候打开了防火墙反而导致一些奇奇怪怪的问题…

【书生大模型实战营】基础岛-浦语提示词工程实践

【书生大模型实战营】基础岛-浦语提示词工程实践 活动地址&#xff1a;地址 任务 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为…

生成式AI,在中国工业找到新“活法”

生成式AI&#xff0c;正在经历一场关于落地前景的论战。 在德国中北部城市希尔德斯海姆&#xff0c;世界工业巨头博世已经把生成式AI技术用在了生产线上。他们以AI仿真绘制的方式合成出超过15000张关于产品缺陷的图片&#xff0c;然后将其应用于电机定子生产线的质检。借助生成…

指针基础知识(笔记)

文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…

初学Vue

1.v-text 2.v-html 可以解析标签 3.v-pre 4.class绑定 1.字符串绑定 效果 2.对象绑定 效果 3.数组 还可以用data数据带class加上去 4.三元表达式 5.style绑定 1.字符串 2.对象绑定 3.数组绑定 6.计算属性 调用函数 函数如下 面试&#xff1a;计算属性特点 只要值 没有改变…

【Week-G7】Semi-Supervised GAN 实践,使用MNIST数据集

文章目录 一、基础知识二、代码实现2.1 导入所需模块 & 设置网络初始参数2.2 初始化权重2.3 定义算法模型2.4 配置模型2.5 训练模型2.6 训练结果 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导…

使用 Claude3.5 只需 2 分钟快速构建仪表盘

这是用 claude 生成的图表&#xff0c;只花了 2 分钟 目录 Claude何时使用Artifacts&#xff1f;我如何使用Artifacts&#xff1f;我的例子让claude导出本地部署结尾 关键还可以分享 这是分享之后的链接&#xff1a; https://claude.site/artifacts/1cf37377-1d00-4ab2-b8dd-a…

PMP考试一定要考到3A吗?怎么备考?

PMP&#xff08;Project Management Professional&#xff09;认证是全球公认的项目管理专业人士资格认证&#xff0c;它代表着项目管理领域的高水平标准。 在备考PMP考试时&#xff0c;有些赛宝关心是否需要考到3A&#xff08;即三个领域均为Above Target&#xff0c;超出目标…

【中项】系统集成项目管理工程师-第10章 项目整合管理-10.7结束项目或阶段

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

[Python学习日记-3] 编程前选择一个好用的编程工具

[Python学习日记-3] 编程前选择一个好用的编程工具 简介 PyCharm IDE的安装 PyCharm IDE安装后的一些常规使用 简介 在踏上 Python 编程的精彩旅程之前&#xff0c;选择一款得心应手的编程工具无疑是至关重要的一步。这就如同战士在出征前精心挑选趁手的武器&#xff0c;它将…

Unity补完计划 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

SQLiteStudio 连接sqlite3数据库(真机数据库可视化调试)

SQLiteStudio安装 官网链接&#xff1a;https://sqlitestudio.pl/ 下载后&#xff0c;直接按部就班&#xff0c;打开即可使用 用户手册&#xff08;工具如何使用直接看这份就可以了&#xff09;&#xff1a;https://github.com/pawelsalawa/sqlitestudio/wiki/User_Manual 其…