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

Nginx 负载均衡+高可用 集群部署(Keepalived+LVS DR模式)

一、LVS负载均衡简介

1.1 LVS基本介绍

        LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导开发的开源负载均衡项目,目前LVS已经被集成在Linux内核中。该项目在Linux内核中实现了基于IP地址的请求数据负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS,LVS根据自己预设的算法将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器。终端用户访问LVS虽然会被转发到后端的真实服务器,但如果真实服务器连接的是相同的存储,提供的也都是相同的服务,则最终用户不管访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言是透明的。根据LVS工作模式的不同,真实服务器会选择用不同的方式将数据发送给终端用户,LVS工作模式分为NAT工作模式、TUN工作模式和DR工作模式。

1.2 基于NAT的LVS负载均衡

        NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使位于企业内部的私有IP地址主机可以访问外网,以及外部用户可以访问位于公司内部的私有IP地址主机。NAT工作模式拓扑结构如图所示,LVS使用两块网卡配置不同的IP地址,eno167被设置为私钥IP地址与内部网络通过交换设备相互连接,eno335被设置为外网IP地址与外部网络连通。 第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网IP地址,相对于真实服务器,LVS的外网IP地址又称为VIP(Virtual IP)地址,用户通过访问VIP地址,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是无感知的,用户以为自己访问的就是真实的服务器,但他并不知道自己访问的VIP地址仅仅是一个LVS,也不清楚后端的真实服务器到底在哪里、有多少台真实服务器。 第二步,用户将请求数据包发送至124.126.147.168,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将请求数据包转发给真实服务器,并且在转发之前LVS会修改请求数据包中的目标地址与目标端口,目标地址与目标端口将被修改为选出的真实服务器的IP地址及相应的端口。 第三步,真实服务器将响应数据包返回给LVS,LVS在得到响应数据包后会将源地址与源端口修改为VIP地址及LVS相应的端口,在修改完成后,由LVS将响应数据包发送给终端用户。另外,由于LVS有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个请求数据包发送给LVS时,从该Hash表中可以直接找到之前的连接记录,并根据该记录选出相同的真实服务器及端口信息。

 1.3 基于TUN的LVS负载均衡

        在NAT工作模式的集群环境中,由于所有请求数据包及响应数据包都需要经过LVS转发,如果后端服务器的数量大于10台,则LVS就会成为整个集群环境的瓶颈。我们知道,请求数据包往往远远小于响应数据包的大小。因为响应数据包中包含客户需要的具体数据,所以TUN工作模式的思路就是将请求数据包与响应数据包分离,让LVS仅处理请求数据包,而让真实服务器将响应数据包直接返回给客户端。TUN工作模式的拓扑结构如图所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为LVS VIP地址的数据包封装,通过隧道转发给后端的真实服务器,通过将客户端发往LVS的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为LVS选择出来的真实服务器的IP地址及对应端口),TUN工作模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据包。

 1.4 基于DR的LVS负载均衡

        在TUN工作模式下,由于需要在LVS与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与TUN工作模式类似,DR工作模式也叫直接路由模式,其体系结构如图所示。在该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包返回给客户端。与TUN工作模式不同的是,DR工作模式要求LVS与后端服务器必须在一个局域网内,VIP地址需要在LVS与后端所有服务器间共享,因为最终的真实服务器给客户端返回数据包时需要设置源IP地址为VIP地址,目标IP地址为客户端IP地址,这样客户端访问的是LVS的VIP地址,返回的源地址也依然是该VIP地址(真实服务器上的VIP地址),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同一个VIP地址,所以在DR工作模式中要求LVS的VIP地址是对外界可见的,客户端需要将请求数据包发送到LVS主机,而所有真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC地址及对应的IP地址,真实服务器的VIP地址对外界是不可见的,但真实服务器却可以接收目标地址为VIP地址的网络请求,并在响应数据包时将源地址设置为该VIP地址。LVS根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的服务器的MAC地址,通过交换机将该数据帧转发给真实服务器。在整个过程中,真实服务器的VIP地址不需要对外界可见。

1.5 LVS负载均衡调度算法

LVS进行调度的策略与算法都是LVS的核心技术,LVS在内核中主要实现了以下八种调度算法。

◎ 轮询算法。

◎ 加权轮询算法。

◎ 最少连接算法。

◎ 加权最少连接算法。

◎ 基于局部性的最少连接算法。

◎ 带复制的基于局部性的最少连接算法。

◎ 目标地址散列算法。

◎ 源地址散列算法。

轮询(Round-Robin,RR)算法就是依次将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有服务器处理请求的能力都是一样的,LVS会将所有请求平均分配给每个真实服务器。

加权轮询(Weighted Round Robin,WRR)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则LVS调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。

最少连接(Least Connections,LC)算法将把请求调度到连接数量最少的服务器上

加权最少连接(Weighted Least-Connection,WLC)算法则是给每个服务器一个权值,LVS会尽可能保持服务器连接数量与权值之间的平衡。

基于局部性的最少连接(Locality-Based Least Connections,LBLC)算法是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近该目标IP地址所使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,则LVS会尽量选择相同的服务器,否则会继续选择其他可行的服务器。

带复制的基于局部性的最少连接LBLCR)算法记录的不是一个目标IP地址与一台服务器之间连接记录,它会维护一个目标IP地址到一组服务器之间的映射关系,防止单点服务器负载过高。

目标地址散列(Destination Hashing,DH)算法根据目标IP地址通过Hash函数将目标IP地址与服务器建立映射关系,在服务器不可用或负载过高的情况下,发往该目标IP地址的请求会固定发给该服务器。

源地址散列(Source Hashing,SH)算法与目标地址散列算法类似,但它根据源地址散列算法静态分配固定的服务器资源。

1.6 LVS配置管理工具ipvsadm介绍

ipvsadm命令的描述和用法如下:

用法:ipvsadm 选项 服务器地址 -s 算法

ipvsadm 选项 服务器地址 -r 真实服务器地址 [工作模式] [权值] …

选项:

-A 添加一个虚拟服务,使用IP地址、端口号、协议来唯一定义一个虚拟服务。

-E 编辑一个虚拟服务。

-D 删除一个虚拟服务。

-C 清空虚拟服务表。

-R 从标准输入中还原虚拟服务规则。

-S 保存虚拟服务规则至标准输出,输出的规则可以使用-R导入并还原。

-a 在虚拟服务中添加一台真实服务器。

-e 在虚拟服务中编辑一台真实服务器。

-d 在虚拟服务中减少一台真实服务器。

-L 显示虚拟服务列表。

-t 使用TCP服务,该参数后需要带主机与端口信息。

-u 使用UDP服务,该参数后需要带主机与端口信息。

-s 指定LVS所采用的调度算法。

-r 设置真实服务器IP地址与端口信息。

-g 设置LVS工作模式为DR工作模式。

-i 设置LVS工作模式为TUN工作模式。

-m 设置LVS工作模式为NAT工作模式。

-w 设置指定服务器的权值。

-c 连接状态,需要配合-L使用。

-n 数字格式输出。

命令示例如下:

添加一个虚拟服务,设置调度算法为轮询算法,所有使用TCP访问124.126.147.168的80端口的请求,最终都被LVS通过NAT工作模式转发给了192.168.0.1、192.168.0.2、192.168.0.3这三台主机的80端口。

 查看Linux中的虚拟服务规则表。

 查看当前IPVS调度状态。

 删除为虚拟服务提供Web功能的真实服务器192.168.0.3。

 虚拟服务规则表的备份与还原。

 修改虚拟服务的调度算法为加权轮询算法。

 创建一个使用WRR算法的虚拟服务,工作模式为DR工作模式,在该虚拟服务上添加两台真实服务器,并为每台真实服务器设置权值。

二、LVS 负载均衡+高可用 部署搭建(DR模式)

2.1 拓扑结果图

2.2 节点环境介绍

类型主机名RIPDIPVIP应用
real_servernginx01172.16.40.151172.16.40.160nginx
real_servernginx02172.16.40.152172.16.40.160nginx
lvs_masterlvs01172.16.40.153172.16.40.160lvs+keepalived
lvs_backuplvs02172.16.40.154172.16.40.160lvs+keepalived
clientittools172.16.40.250

所有节点关闭防火墙及安全中心。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2.3 配置LVS虚拟节点(2台一样) 

对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能。

编辑 /etc/sysctl.conf 文件,添加以下内容。

net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens192.send_redirects = 0		# ens192为本机物理网卡名称,可根据实际情况修改

下面是每个参数的具体含义:

  1. net.ipv4.ip_forward = 0

    这个参数用于控制 Linux 系统是否能够转发 IP 数据包。当设置为 1 时,系统会被配置为路由器,可以转发从一路由接口接收的数据包到另一个路由接口。当设置为 0 时,系统不会转发数据包,只处理发往本机地址的数据包。在您提供的配置中,这个参数被设置为 0,意味着关闭了 IP 转发功能。
  2. net.ipv4.conf.all.send_redirects = 0

    这个参数控制是否允许系统向其他主机发送 ICMP 重定向消息。ICMP 重定向消息用于通知主机有更优的路由到达目标。当设置为 1 时,系统会发送 ICMP 重定向消息。设置为 0 时,系统不会发送这些重定向消息。在这里,它被设置为 0,意味着系统不会向其他主机发送 ICMP 重定向。
  3. net.ipv4.conf.default.send_redirects = 0

    类似于 net.ipv4.conf.all.send_redirects,这个参数也是用来控制 ICMP 重定向消息的发送。不过,它是一个默认设置,可以被特定网络接口的设置覆盖。在这里,它也被设置为 0,意味着对于默认的网络接口,系统不会发送 ICMP 重定向。
  4. net.ipv4.conf.ens192.send_redirects = 0

    这个参数是特定于网络接口 ens192 的设置,用于控制是否允许向连接到 ens192 网络接口的主机发送 ICMP 重定向消息。在这里,它被设置为 0,意味着对于 ens192 接口,系统不会发送 ICMP 重定向。

这些设置通常用于关闭不必要的 ICMP 重定向消息和 IP 转发功能,这在某些网络环境中是出于安全考虑的。例如,在不需要服务器进行路由转发的情况下,关闭 IP 转发可以减少潜在的路由错误和安全风险。同样,关闭 ICMP 重定向可以防止不必要的网络流量和潜在的路由错误。

sysctl -p		# 激活配置

2.4 安装ipvsadm(2台一样)

yum install ipvsadm -y

2.5 安装并配置Keepalived

yum install keepalived -y

编辑 LVS01 节点的 /etc/keepalived/keepalived.conf 文件,添加以下内容。

global_defs {router_id LVS_01             # 指定路由名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
}vrrp_instance VI_1 {            # 指定虚拟网卡名称,主备一样state MASTER                # 指定热备状态,主为MASTER,备为BACKUPinterface ens192            # 指定实际的物理网卡名称virtual_router_id 10        # 指定虚拟路由的ID号,主备组保持一致priority 100                # 指定优先级,数值越大优先级越高,这里设置主为100,备为90advert_int 1                # 心跳频率,单位秒authentication {            # #定义认证信息,每个热备组保持一致auth_type PASSauth_pass 1111}virtual_ipaddress {         # 指定群集vip地址172.16.40.160}
}# 配置集群对外访问的IP+端口,端口和后端nginx保持一致
virtual_server 172.16.40.160 80 {delay_loop 6                        # 健康检测时间,单位秒lb_algo rr                          # 配置负载均衡的算法,默认为轮询lb_kind DR                          # 设置LVS的工作模式,NAT | TUN | DRpersistence_timeout 5               # 会话持久化的时间,单位秒protocol TCP                        # 协议# 负载均衡的真实服务器,也就是后台nginx服务器的ip+端口real_server 172.16.40.151 80 {weight 1                        # 轮询权重比,默认为1# 设置健康检查TCP_CHECK {                 # 设置健康检查connect_port 80         # 检查的端口connect_timeout 3       # 超时时间,单位秒nb_get_retry 3          # 检测的次数delay_before_retry 3    # 间隔时间,单位秒}}# 负载均衡的真实服务器,也就是后台nginx服务器的ip+端口real_server 172.16.40.152 80 {weight 1                        # 轮询权重比,默认为1# 设置健康检查TCP_CHECK {                 # 设置健康检查connect_port 80         # 检查的端口connect_timeout 3       # 超时时间,单位秒nb_get_retry 3          # 检测的次数delay_before_retry 3    # 间隔时间,单位秒}}
}

编辑 LVS02 节点的 /etc/keepalived/keepalived.conf 文件,添加以下内容。

global_defs {router_id LVS_02             # 指定路由名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
}vrrp_instance VI_1 {            # 指定虚拟网卡名称,主备一样state BACKUP                # 指定热备状态,主为MASTER,备为BACKUPinterface ens192            # 指定实际的物理网卡名称virtual_router_id 10        # 指定虚拟路由的ID号,主备组保持一致priority 90                 # 指定优先级,数值越大优先级越高,这里设置主为100,备为90advert_int 1                # 心跳频率,单位秒authentication {            # #定义认证信息,每个热备组保持一致auth_type PASSauth_pass 1111}virtual_ipaddress {         # 指定群集vip地址172.16.40.160}
}# 配置集群对外访问的IP+端口,端口和后端nginx保持一致
virtual_server 172.16.40.160 80 {delay_loop 6                        # 健康检测时间,单位秒lb_algo rr                          # 配置负载均衡的算法,默认为轮询lb_kind DR                          # 设置LVS的工作模式,NAT | TUN | DRpersistence_timeout 5               # 会话持久化的时间,单位秒protocol TCP                        # 协议# 负载均衡的真实服务器,也就是后台nginx服务器的ip+端口real_server 172.16.40.151 80 {weight 1                        # 轮询权重比,默认为1# 设置健康检查TCP_CHECK {                 # 设置健康检查connect_port 80         # 检查的端口connect_timeout 3       # 超时时间,单位秒nb_get_retry 3          # 检测的次数delay_before_retry 3    # 间隔时间,单位秒}}# 负载均衡的真实服务器,也就是后台nginx服务器的ip+端口real_server 172.16.40.152 80 {weight 1                        # 轮询权重比,默认为1# 设置健康检查TCP_CHECK {                 # 设置健康检查connect_port 80         # 检查的端口connect_timeout 3       # 超时时间,单位秒nb_get_retry 3          # 检测的次数delay_before_retry 3    # 间隔时间,单位秒}}
}

systemctl start keepalived		# 启动keepalived服务

通过 ip addr 命令可以查看到 LVS01已获取到VIP地址。

2.6 配置nginx节点虚拟IP (2台一样)

复制本地回环网卡配置文件。

cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:1

编辑新的 /etc/sysconfig/network-scripts/ifcfg-lo:1 网卡配置,内容如下

DEVICE=lo:1
IPADDR=172.16.40.160
NETMASK=255.255.255.255
NETWORK=127.0.0.0

 重启网络服务,使配置生效。

systemctl restart network

 通过 ip addr 命令可以查看到2台节点的 lo:1 网卡配置已生效,成功添加上DIP。

2.7 配置nginx节点arp响应规则(2台一样)

因为LVS与真实服务器都设置了VIP地址,所以这里要求所有真实服务器要禁止对VIP地址的ARP响应,具体是通过arp_ignore与arp_announce来实现的,编辑 /etc/sysctl.conf 文件,添加以下内容。

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

下面是每个参数的具体含义:

  1. net.ipv4.conf.all.arp_ignore = 1

    这个参数定义了对于目标地址为本机IP的ARP请求的应答模式。当设置为1时,系统只会回应那些目标IP为本机上配置的、并且发送请求的网络接口(网卡)上的ARP请求。这意味着如果一个请求是针对非本地接口的IP地址,系统将不会回应。这有助于防止不必要的ARP响应,可能在某些网络配置中有用,比如使用多个网络接口的服务器。
  2. net.ipv4.conf.all.arp_announce = 2

    这个参数限制了从网络接口发出的ARP请求中的源IP地址。当设置为2时,系统只会使用与目标IP地址在同一子网的本地IP地址作为ARP请求的源IP地址。这有助于确保ARP请求的源IP地址与目标IP地址在同一网络段,可以提高网络的效率和安全性。
  3. net.ipv4.conf.default.arp_ignore = 1

    这个参数为所有网络接口设置了默认的arp_ignore值。如果某个网络接口没有单独设置arp_ignore,就会使用这个默认值。
  4. net.ipv4.conf.default.arp_announce = 2

    这个参数为所有网络接口设置了默认的arp_announce值。如果某个网络接口没有单独设置arp_announce,就会使用这个默认值。
  5. net.ipv4.conf.lo.arp_ignore = 1

    这个参数特别为本地回环接口(lo)设置了arp_ignore的值。回环接口通常用于本地通信,不需要参与ARP过程,因此这个设置通常不会影响系统的正常操作。
  6. net.ipv4.conf.lo.arp_announce = 2

    这个参数特别为本地回环接口(lo)设置了arp_announce的值。同样,由于回环接口的特殊性,这个设置通常不会影响系统的正常操作。

sysctl -p		# 激活配置

2.8 为虚拟DIP添加路由规则 (临时生效)(2台一样)

route add -host 172.16.40.160 dev lo:1

使用 route -n 查看本机路由表,已完成添加。

  或者可在 /etc/rc.local 文件中写入开机自动添加路由配置

echo "route add -host 172.16.40.160 dev lo:1" >> /etc/rc.local

2.9 安装nginx,修改页面内容

yum install nginx -y

编辑默认的 /usr/share/nginx/html/index.html 页面内容,用于区分请求结果。

 重启 nginx 服务。

systemctl restart nginx

2.10 客户端请求VIP,校验负载均衡

通过LVS01 执行 ipvsadm -Ln 查看负载均衡规则,已自动匹配生效。

 保存当前配置。

ipvsadm-save >/etc/sysconfig/ipvsadm

从客户端请求 VIP ,查看页面返回结果。

curl -s 172.16.40.160 |grep '<h1>'

从 LVS01 上执行 ipvsadm -Lnc 同步查看负载均衡调度结果。

可以看到,客户端请求结果与LVS调度结果一致,成功对请求进行轮询转发到2台nginx节点上。

到此,部署全部完成。  

三、扩展疑问

3.1 在 LVS/DR 模式下 VIP 、DIP 和 RIP 必须在同一网段吗?

在 LVS/DR 模式下 VIP 、DIP 和 RIP 不需要在同一网段!

其中 VIP 必须是公网 IP;而 DIP 和 RIP 必须在同一网段(可以是任意网段的 IP,也可以是私网 IP),且需要节点主机的 RIP 可以把 IP 数据包发送到一个能把 IP 数据包路由到公网的路由器上。

其实 LVS 在 VS/DR 模式下的要求是 DIP 和 RIP 必须处于同一网段中。在实际的部署过程中发现如果在 Director 上 VIP 和 DIP 在同一网段、或在 RealServer 上 VIP 与 RIP 在同一网段,LVS 集群工作会很不稳定。因为当一个 IP 数据包需要发到默认网关时(在 RealServer 或 Director 上),Linux 主机不知道应该使用哪个接口(在同一子网中的 VIP 和 DIP/RIP),可能会随机选一个,可以通过在 Linux 中配置路由表来解决。

不同网段部署案例参考:

  • LVS-DR VIP和RIP不同网段的配置方法-阿里云开发者社区 (aliyun.com)
  • lvs dr模式(rip 、dip 不在同一个网段上)_lvs隧道模式不同子网实验-CSDN博客

相关文章:

Nginx 负载均衡+高可用 集群部署(Keepalived+LVS DR模式)

一、LVS负载均衡简介 1.1 LVS基本介绍 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导开发的开源负载均衡项目&#xff0c;目前LVS已经被集成在Linux内核中。该项目在Linux内核中实现了基于IP地址的请求数据负载均衡调度方…...

算法 | 基础 | 出现奇数次的数字

这里写自定义目录标题 异或运算题目1题目2 本篇是关于异或&#xff08;^&#xff09;运算的运用。后期看算法过程中如果再碰到异或的都会收录到本篇中 异或运算 在逻辑学中&#xff0c;逻辑算符异或&#xff08;exclusive or&#xff09;是对两个运算元的一种逻辑析取类型&am…...

log4j 控制台和文件输出乱码问题解决

一个小问题&#xff0c;却让我感觉到&#xff0c;现在真正动脑的人很少。。我来说说吧。 今天遇到一个小问题&#xff0c; log4j输出到文件乱码&#xff0c;控制台正常。显然是编码问题导致。Google一搜&#xff0c;几乎一水的说&#xff1a; 项目中log4j在英文版linux下输出中…...

在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 前言…...

TCP/IP协议栈详解及其在现代网络中的应用

在当今数字化时代&#xff0c;网络已成为我们生活中不可或缺的一部分。无论是社交、工作还是娱乐&#xff0c;网络都在背后发挥着至关重要的作用。而这一切的实现&#xff0c;都离不开TCP/IP协议栈。本文将详细介绍TCP/IP协议栈的结构、各层功能以及它在现代网络中的应用。 什…...

亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖

近日&#xff0c;由中央网信办网络安全协调局指导、中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖&#xff0c;亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…...

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧

如何从硬盘恢复已删除/丢失的文件&#xff1f;本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据&#xff0c;或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗&#xff1f;当我将外部硬盘插入计算机时&#xff0c;我错误地删除了一些文…...

[Linux]:权限

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. Linux权限的基本概念 1.1 root与普通用户 在Linux系统中&#xff0c;存在…...

启动Spring Boot报错

一、遇到的问题 启动Spring Boot报错 Unable to close ApplicationContext org.springframework.boot.SpringApplication: Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.cache.CacheAutoCo…...

部署project_exam_system项目——及容器的编排

&#xff08;一&#xff09;安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker 1.环境准备 [rootdocker--1 ~]# rz -Erz waiting to receive.[rootdocker--1 ~]# lsanaconda-ks.cfg docker.sh[rootdocker--1 ~]# source docker.sh [rootdocker--1 ~…...

网络工程师学习笔记——无线通信网

移动通信 从1G到3G都是针对语音通话设计的&#xff0c;只有4&#xff27;才可以与Internet衔接 1978年美国贝尔实验室开发了高级移动电话系统&#xff08;AMPS&#xff09;&#xff0c;可以随时随地的进行通信&#xff0c;采用蜂窝技术解决了公用通信系统所面临的大容量要求和…...

Vue(十三) 路由、路由嵌套、query、param传参、propos、replace属性。编程式路由导航,特有的生命周期函数,路由守卫

文章目录 路由1. 基本使用2. 多级(嵌套)路由3. 路由query传参4. 命名路由5. 路由param传参6. propos属性7. replace属性8. 编程式路由导航9. 缓存路由组件10. actived&#xff0c;deactived生命周期函数11. 路由守卫1、全局路由2、独享路由3、组件内路由守卫 12. 路由器工作的两…...

ArgoUML与StarUML的安装

ArgoUML与StarUML的安装 说明&#xff1a; 首次发表日期&#xff1a;2024-09-07ArgoUML 官网&#xff1a; https://argouml-tigris-org.github.io/tigris/argouml/StarUML 官网&#xff1a; https://staruml.io/ ArgoUML 以下内容基于&#xff1a; https://blog.csdn.net/h…...

828华为云征文|华为云服务器Flexus X搭建悟空crm管理系统——助力企业云上管理(解决APP Referer校验失败问题)

1、为什么我们企业会选择Flexus云服务器X实例来部署自己的CRM管理系统&#xff1f; 因为基于华为云Flexus X实例搭建CRM管理平台&#xff0c;可以从容面对企业内部瞬息万变的业务压力变化 2、华为云服务器Flexus X方案及优势&#xff1a; 灵活伸缩 搭配弹性伸缩服务AS及负载均…...

计算机毕业设计选题推荐-健康健身追踪系统-运动健身系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

FPGA开发:初识FPGA × 开发环境

FPGA是什么&#xff1f; FPGA的全称是现场可编程门阵列&#xff08;Field Programmable Gate Array&#xff09;&#xff0c;一种以数字电路为主的集成芯片&#xff0c;属于可编程逻辑器件PLD的一种。简单来说&#xff0c;就是能用代码编程&#xff0c;直接修改FPGA芯片中数字…...

电脑驱动分类

电脑驱动程序&#xff08;驱动程序&#xff09;是操作系统与硬件设备之间的桥梁&#xff0c;用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类&#xff1a; 1. 设备驱动程序 显示驱动程序&#xff1a;控制显卡和显示器的显示功能&#xff0c;负责图形渲染和…...

理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump

文章目录 0. 概述1. 问题背景2. 问题分析3. 解决方案&#xff1a;手动释放资源4. 深入剖析&#xff1a;为什么手动调用 reset() 有效&#xff1f;5. 延伸思考&#xff1a;如何避免全局对象带来的问题&#xff1f;6. 总结 0. 概述 在编写 C 程序时&#xff0c;使用全局或静态对…...

云计算之大数据(下)

目录 一、Hologres 1.1 产品定义 1.2 产品架构 1.3 Hologres基本概念 1.4 最佳实践 - Hologres分区表 1.5 最佳实践 - 分区字段设置 1.6 最佳实践 - 设置字段类型 1.7 最佳实践 - 存储属性设置 1.8 最佳实践 - 分布键设置 1.9 最佳实践 - 聚簇键设置 1.10 最佳实践 -…...

硬件工程师笔试面试知识器件篇——二极管

目录 4、二极管 4.1、基础 二极管原理图 二极管实物图 4.1.1、基本特性 4.1.2、常见类型 4.1.3、工作原理 4.1.4、应用领域 4.2、相关问题 4.2.1、二极管的PN结是如何形成的? 4.2.2、发光二极管(LED)的工作原理是什么? 4.2.3、在电子电路中,二极管通常如何应用?…...

操作系统安全保护

操作系统安全概述 概念&#xff1a;满足安全策略要求&#xff0c;具有响应安全机制及安全功符合特定安全标准&#xff0c;在一定约束条件下 能抵御常见网络安全威胁&#xff0c;保障自身安全运行及资源安全 安全等级&#xff1a;根据安全功能和安全保障要求分为 用户自主保护…...

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单&#xff08;使用SPI通信协议&#xff09;的非易失性&#xff08;掉电不丢失&#xff09;存储器&#xff0c;常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…...

uni-app 获取当前位置的经纬度以及地址信息

文章目录 uni.getLocation(objc)获取经纬度和地址调试结果问题 uni-app 获取当前位置的经纬度以及地址信息 uni.getLocation(objc) uni-app官方文档定位API: uni.getLocation(OBJECT) uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&…...

【CSS】尺寸单位

在 CSS 中&#xff0c;常见的尺寸单位有以下几种&#xff1a; 像素&#xff08;px&#xff09;&#xff1a; 这是最常用的绝对单位。例如 width: 200px; 表示宽度为 200 像素。像素是固定的尺寸&#xff0c;不会随着屏幕分辨率或设备的不同而变化。 备注&#xff1a; 在不同的…...

Agent(智能体)和 MetaGPT,一句话实现整个需求应用代码

前面 2 篇文章&#xff0c;我们使用文生文、文生图和文生音频三个大模型共同实现了图文并茂的儿童绘本故事和绘本故事音频需求&#xff1a; 第一篇 根据主题生成儿童绘本故事&#xff1a;GLM-4-Flash 大模型 API 免费了&#xff0c;手把手构建“儿童绘本”应用实战&#xff08…...

[数据结构] 哈希结构的哈希冲突解决哈希冲突

标题&#xff1a;[C] 哈希结构的哈希冲突 && 解决哈希冲突 水墨不写bug 目录 一、引言 1.哈希 2.哈希冲突 3.哈希函数 二、解决哈希冲突 1.闭散列 I&#xff0c;线性探测 II&#xff0c;二次探测 2.开散列 正文开始&#xff1a; 一、引言 哈希表是一种非常实用而…...

Wimdows使用Appium IOS自动化

启动appium服务器&#xff1a; appium -a 127.0.0.1 -p 4724 配置 { "platformName": "iOS", "appium:platformVersion": "16.5.1", "appium:deviceName": "(★StatTrak™) |午夜黑&#xff08;崭新出厂&#…...

C语言深度剖析--不定期更新的第四弹

哈哈哈哈哈哈&#xff0c;今天一天两更&#xff01; void关键字 void关键字不能用来定义变量&#xff0c;原因是void本身就被编译器解释为空类型&#xff0c;编译器强制地不允许定义变量 定义变量的本质是&#xff1a;开辟空间 而void 作为空类型&#xff0c;理论上不应该开…...

【手撕数据结构】八大排序神功(上)

目录 冒泡排序【有点拉胯】动图演示:思路解析单趟算法图解代码详解性能优化复杂度分析 直接插入排序【还阔以】动图演示思路解析代码分析与讲解复杂度分析 希尔排序【有点强】动图演示思路讲解排序过程总览代码分析讲解复杂度分析 堆排序【太有石粒啦】动图演示堆的概念与结构向…...

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…...