Keepalive技术

文章目录

  • 一、Keepalive基础
    • vrrp技术
    • Keepalived介绍
    • Keepalived架构
  • 二、 Keepalived 相关文件
    • 配置文件组成
    • 全局配置
    • 虚拟路由器配置
  • 三、配置lvs和keepalive联动
    • 服务器架构
    • 抢占模式配置
    • 配置单播、组播
    • 配置通知模块
    • 日志功能
    • 脑裂现象
  • 四、keepalived和nginx联动
    • keepalive和其他应用的高可用 VRRP Script
    • 实验效果


一、Keepalive基础

vrrp技术

技术原理
通过在冗余网关间共享虚拟MAC和IP地址,保证数据转发时并不是转给某一个具体网关的IP,而是把数据转发给虚拟网关的IP,因此,不论哪一个路由器成为主路由,都不会影响数据通信。通过组播协议对数据端口进行监控,一旦检测数据转发的端口坏掉,主路由器会停发HELLO包,备路由器提升为主路由,实现数据的稳定高效转发。

在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物理实体;虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定的IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器VRRP协议从路由器组中选出一台作为主控路由器,负责ARP解析和转发IP数据包,组中的其他路由器作为备份的角色并处于待命状态,当由于某种原因主控路由器发生故障时,其中的一台备份路由器能在瞬间的时延后升级为主控路由器,由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。

VRRP相关术语

  • 虚拟路由器:Virtual Router 不是真实存在,虚构出来的。
  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器 。
  • VIP:Virtual IP 对外提供服务的地址
  • VMAC:Virutal MAC 虚拟MAC地址
  • 物理路由器:
  • master:主设备
  • backup:备用设备
  • priority:优先级

Keepalived介绍

功能

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务。

Keepalived架构

在这里插入图片描述

  • 用户空间核心组件:

    • vrrp stack:虚拟IP消息通告
    • checkers:监测后端真实服务器的服务是否存活
    • system call:实现 vrrp 协议状态转换时调用脚本的功能
    • SMTP:邮件组件(报警邮件)
    • IPVS wrapper:生成IPVS规则(直接生成ipvsadm)
    • Netlink Reflector:网络接口(让虚拟地址ip地址飘动)
  • WatchDog:监控进程(整个架构是否有问题)

  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置。

  • IO复用器:针对网络目的而优化的自己的线程抽象。

  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限。

二、 Keepalived 相关文件

配置文件组成

主配置文件:/etc/keepalived/keepalived.conf

  • GLOBAL CONFIGURATION
    Global definitions(全局配置):定义邮件配置,route_id ,vrrp配置,组播地址 等

  • VRRP CONFIGURATION
    VRRP instance(s):定义vrrp协议中的每个vrrp虚拟路由器的规则,基本信息

  • LVS CONFIGURATION(lvs调度服务器的规则设置)

Virtual server group(s)
Virtual server(s):LVS集群的VS和RS
在这里插入图片描述

全局配置

global_defs {
 notification_email {
 root@localhost
 #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
 root@localhost
2769741114@qq.com 
 }
 notification_email_from keepalived@localhost  
 #发邮件的地址
 smtp_server 127.0.0.1     
 #邮件服务器地址
 smtp_connect_timeout 30   
 #邮件服务器连接timeout
 router_id   LVS01
 #每个keepalived主机唯一标识,建议使用当前主机名,但多节点重名不影响
 vrrp_skip_check_adv_addr  
 #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_strict 
#严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置。
 vrrp_garp_interval 0 
 #gratuitous ARP messages 免费ARP报文发送延迟,0表示不延迟
 vrrp_gna_interval 0 
 #unsolicited NA messages (不请自来)消息发送延迟
 vrrp_mcast_group4 225.0.0.18
 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18 
 vrrp_iptables        
 #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}

注意:
默认keepalived主机之间利用多播相互通告消息,可能会造成网络拥塞,可以替换成单播,来减少网络流量。
启用vrrp_strict 时,不能启用单播。

虚拟路由器配置

vrrp_instance <STRING> {
#<String>为vrrp的实例名,一般为业务名称
 配置参数
 ......
 }
#配置参数:
state MASTER|BACKUP
#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME 
#绑定为当前虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和VIP不在一个网卡
virtual_router_id VRID 
#每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100 
#当前物理节点在此虚拟路由器的优先级,范围:1-254,值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1
#vrrp通告的时间间隔,默认1s
authentication { 
#认证机制
 auth_type AH|PASS   
 #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
 auth_pass <PASSWORD> 
 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
include    /etc/keealived/conf.d/*.conf
virtual_ipaddress { 
#虚拟IP,生产环境可能指定上百个IP地址
 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
 192.168.200.100 
 #指定VIP,不指定网卡,默认为,注意:不指定/prefix,默认为/32
 192.168.200.101/24 dev eth1   
 #指定VIP的网卡,建议和interface指令指定的网卡不在一个网卡
 192.168.200.102/24 dev eth2 label eth2:1 
 #指定VIP的网卡label   ifconfig eth2:1   192.168.200.102/24
}
track_interface { 
#配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
 eth0
 eth1
 …
}

三、配置lvs和keepalive联动

服务器架构

整体架构
在这里插入图片描述
主keepalived:192.168.232.10
备keepalived:192.168.232.20
web1:192.168.232.30
web2:192.168.232.40
vip:192.168.232.188
客户机:192.168.232.50

1.准备环境

systemctl stop firewalld.service 
setenforce 0
yum install epel-release.noarch  -y
yum install ipvsadm keepalived -y
#lvs需要安装额外源

2.配置web,选用httpd
在这里插入图片描述
配置成功。

3.配置主keepalived

启动lvs

ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service

在这里插入图片描述
修改keepalived配置文件:

cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
备份

主服务器配置

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   修改邮箱指向自己
   smtp_connect_timeout 30
   router_id LVS_01
   本路由器的服务器的名称
   指定服务器名称主备需要不一样
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
定义VRRP热备实例
    state MASTER
    指定服务器类型MASTER为主 BACKUP为备
    interface ens33
    修改网卡名称,表示承载VIP地址的物理接口
    virtual_router_id 51
    指定虚拟路由器的ID号主备需要一致
    priority 100
    设定优先级数字越大优先级越高。
    advert_int 1
    通告间隔即心跳线
    authentication {
        auth_type PASS
        认证类型
        auth_pass 1111
        修改认证密码,主备需要一样
    }
    virtual_ipaddress {
        192.168.232.188
        指定群集vip地址,可以是多个
    }
}

virtual_server 192.168.232.188 80 {
    delay_loop 6
    健康间隔时间6秒
    lb_algo rr
    调度算法轮询
    lb_kind DR
    LVS模式为DR
    persistence_timeout 0
    连接保持时间,通常不会为0,这里是因为体现实验效果,改为0。
    protocol TCP
    采用TCP协议

    real_server 192.168.232.30 80 {
     修改为真实的主机地址以及端口号 
        weight 1
        权重为1
        TCP_CHECK {
        connect_prot 80
        检查目标端口
        connect_timeout 3
        连接超时
        nb_get_retry 3
        重试次数
        delay_before_retry 3
        重试间隔时间
     }
  }

    real_server 192.168.232.40 80 {
        weight 1
        TCP_CHECK {
        connect_prot 80
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
     }
                         

从服务器配置
将主服务器配置远程拷贝至从服务器上。

scp keepalived.conf 192.168.232.20:/etc/keepalived/
12    router_id LVS_02
20     state BACKUP
23     priority 80

至此主从服务器配置完成,还需要将ipv4路由转发设置一下。

vim /etc/sysctl.conf 
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0 
sysctl -p
主从都需要。

http服务器配置
设置虚拟ip

ifconfig lo:0 192.168.232.188 netmask 255.255.255.255

内核设置

vim /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
sysctl -p

设置路由

route add -host 192.168.232.188 dev lo:0

主服务器上效果
在这里插入图片描述
备服务器上效果,并没有192.168.232.188这个IP地址
在这里插入图片描述
实验效果:
测试负载均衡:
在这里插入图片描述
测试keeplived:
在主服务器上停止keepalive。
地址实现漂移。
在这里插入图片描述

抢占模式配置

keepalive有三种抢占模式,分别是抢占模式,非抢占模式,延迟抢占模式。
默认是抢占模式,当主节点恢复之后会立即抢占回来,会造成两次网络动荡。这种模式有一定弊端。
非抢占模式配置
必须将keepalived服务器state配置为BACKUP

vrrp_instance VI_1 {
 state BACKUP     #都为BACKUP
 interface ens33
 virtual_router_id 66
 priority 100   #优先级高
 advert_int 1
 nopreempt         #添加此行,都为nopreempt

在这里插入图片描述

开启抓包后,关闭主机1,再开启主机1,发现并没有切换至主服务器上,非抢占模式配置成功。

tcpdump -i ens33 -nn host 224.0.0.18

在这里插入图片描述
延迟抢占,可以避免主节点频繁切换。
preempt_delay 指定抢占延迟时间为#s,默认延迟300s
注意: 需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict

state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    preempt_delay 3

在这里插入图片描述

配置单播、组播

单播模式下,Keepalived 节点之间通过单独的 IP 地址进行通信。
优点:

  • 更安全,因为只有指定的节点才能收到通信内容。
  • 适用于防火墙内部署,因为可以直接使用私有 IP。
  • 可以通过配置绑定 IP 地址来指定使用特定网卡进行通信。

缺点:

  • 需要手动配置每个节点的对端 IP 地址。
  • 当节点数量增加时,配置维护难度会增大。

组播模式下,Keepalived 节点使用一个预定义的组播地址进行通信。
优点:

  • 无需手动配置每个节点的对端 IP 地址。
  • 当节点数量增加时,配置管理更加简单。
  • 可以更方便地跨网段部署 Keepalived。

缺点:

  • 需要确保网络环境支持组播功能。
  • 组播地址的配置需要小心,避免与其他应用程序冲突。
  • 相比单播,组播可能会对网络带宽产生更大的负载。

单播配置

vrrp_instance VI_1 {
    interface eth0
    state MASTER
    priority 100
    virtual_ipaddress {
        192.168.1.100/24
    }
    unicast_peer {
        192.168.1.101
        192.168.1.102
    }
}

在这个配置中:

  • interface eth0 指定了 VRRP 实例使用的网络接口。
  • state MASTER 表示当前节点是主节点。
  • priority 100 设置了 VRRP 优先级为 100。
  • virtual_ipaddress 定义了虚拟 IP 地址。
  • unicast_peer 指定了单播对端 IP 地址列表。

主从两边都需要修改。

组播配置

vrrp_instance VI_1 {
    interface eth0
    state MASTER
    priority 100
    virtual_ipaddress {
        192.168.1.100/24
    }
    multicast_group 224.0.0.19
}

必须确保在所有节点上使用相同的组播地址,也要确保是组播地址。

配置通知模块

模拟环境:当主从节点发生变化之后,肯定需要人员去维护,但是如何知道呢?这边展示了利用邮件通知运维人员。
通知脚本
当前节点成为主节点时触发的脚本

notify_master <STRING>|<QUOTED-STRING>

当前节点转为备节点时触发的脚本

notify_backup <STRING>|<QUOTED-STRING>

当前节点转为“失败”状态时触发的脚本

notify_fault <STRING>|<QUOTED-STRING>

通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

notify <STRING>|<QUOTED-STRING>

当停止VRRP时触发的脚本

notify_stop <STRING>|<QUOTED-STRING>

邮箱配置

vim /etc/mail.rc 
set from=QQ号@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=QQ号@qq.com
set smtp-auth-password=

在这里插入图片描述
配置脚本

#!/bin/bash
#
contact='2769741114@qq.com'
notify() {
 mailsubject="$(hostname) to be $1, vip floating"
 mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact}
case $1 in

master)
 notify master
 ;;
backup)
 notify backup
 ;;
fault)
 notify fault
 ;;
*)
 echo "Usage: $(basename $0) {master|backup|fault}"
 exit 1
 ;;
esac

keepalived配置文件

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    preempt_delay 30
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.91.16
    }
   notify_master "/opt/keepalive.sh master"
   notify_backup "/opt/keepalive.sh backup"
   notify_fault "/opt/keepalive.sh fault"
   需要调用脚本
}

日志功能

这是keepalive的启动文件

vim /lib/systemd/system/keepalived.service 
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target

[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

打开环境变量的文件

vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"

在这里插入图片描述

vim /etc/rsyslog.conf 
ocal6.*                /var/log/keepalived.log

在这里插入图片描述
然后重启两个服务即可

systemctl restart rsyslog.service
systemctl restart keepalived.service

在这里插入图片描述

脑裂现象

什么是脑裂?
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。
由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了;或者两边“服务”都起来了,但同时读写“共享存储”,导致数据损坏。

哪些原因导致脑裂?

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
  • 因心跳线坏了(包括断了,老化)。
  • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
  • 因心跳线间连接的设备故障(网卡及交换机)
  • 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
  • 多组keepalive服务器造成 组播冲突 1.换组播地址 2.改成单播

总之,心跳线的问题。

如何解决keepalived脑裂问题?
在实际生产环境中,我们从以下方面防止脑裂:
1.同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息。
2.当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。

四、keepalived和nginx联动

keepalive和其他应用的高可用 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能。可以和任何软件组合形成,高可用的架构。

分两步实现:
定义脚本
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点。

vrrp_script <SCRIPT_NAME> { 				#定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING> 		#shell命令或脚本路径(注意执行权限)   0 不会执行以下操作,   1 就会执行以下操作
     interval <INTEGER> 					#间隔时间,单位为秒,默认1秒
     timeout <INTEGER> 						#超时时间
     weight  <INTEGER:-254..254> 			#默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
     fall <INTEGER>          					#执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>   					#执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME] 				#执行监测脚本的用户或组      
     init_fail         						#设置默认标记为失败状态,监测成功之后再转换为成功状态
}
 

vrrp_script check_down {
        script  "/etc/keepalived/ng.sh"   #指明脚本的位置   
        interval 1            #每隔1s 执行一次检测
        weight -30             #如果 脚本执行失败自动减少优先级30
        fall  3                # 3次不成功才标注为失败 
        rise 2                 #nginx  重新起来后检测两次成功 才真的成功  
        timeout 2               #超时时间  2s 
}

注意:这边的优先级-30要根据实际情况加减。

调用脚本
track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script

SCRIPT_NAME_1

在这里插入图片描述

主keepalived和nginx:192.168.232.10
备keepalived和nginx:192.168.232.20
web1:192.168.232.30
web2:192.168.232.40
vip:192.168.232.188
客户机:192.168.232.50

配置后端真实服务器

systemctl stop firewalld
setenforce 0
yum  install httpd  -y
vim /etc/httpd/conf/httpd.conf
keepalive	off
echo  7-3 > /var/www/html/index.html
systemctl start httpd

配置代理服务器

vim   /etc/nginx/nginx.conf

 upstream web  {
    server 192.168.232.30;
    server 192.168.232.40;
    }


 location /  {
         proxy_pass  http://web;
        }

在这里插入图片描述
两台机子的配置是一样的,远程拷贝即可。在主配置中也需要将nginx的长连接关闭。

主服务器的keepalive配置

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1  
   修改邮箱地址
   smtp_connect_timeout 30
   router_id LVS_01 
   修改名称
   vrrp_skip_check_adv_addr
   #vrrp_strict
   关闭严格模式
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_down {
        script  "/etc/keepalived/ng.sh"
        指明脚本位置
        interval 1
        每隔1s执行一次检测
        weight -30
        如果脚本执行失败自动减少优先级30
        fall  3
        3次不成功标注为失败
        rise 2
        nginx重新起来后检测两次成功后才真的成功。
        timeout 2
        超时时间2s
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.188
    }
    track_script {
     check_down
     }
}

vim    /etc/keepalived/ng.sh
killall   -0    nginx

chmod +x    /etc/keepalived/ng.sh
scp  /etc/keepalived/keepalived.conf   192.168.232.20://etc/keepalived/

实验效果

测试负载均衡是否成功
在这里插入图片描述
关闭7-1的keepalive,切换至7-2的服务。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启开始7-1,关闭7-1的nginx
在这里插入图片描述
在这里插入图片描述
效果配置成功。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索MySQL核心技术:理解索引和主键的关系

在数据密集型应用中&#xff0c;数据库的性能往往是决定一个应用成败的重要因素之一。其中&#xff0c;MySQL作为一种开源关系型数据库管理系统&#xff0c;以其卓越的性能和丰富的功能被广泛应用。而在MySQL数据库优化的众多技巧中&#xff0c;索引和主键扮演着极其重要的角色…

专题一: Spring生态初探

咱们先从整体脉络上看下Spring有哪些模块&#xff0c;重要的概念有个直观印象。 从Spring框架的整体架构和组成对整体框架有个认知。 Spring框架基础概念 Spring基础 - Spring和Spring框架组成 上图是从官网4.2.x获取的原图&#xff0c;目前我们使用最广法的版本应该都是5.x&am…

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…

二级建造师(建筑工程专业)考试题库,高效备考!!!

16.在施工合同履行期间发生的变更事项中&#xff0c;属于工程变更的是&#xff08;&#xff09;。 A.质量要求变更 B.分包单位变更 C.合同价款变更 D.相关法规变更 答案&#xff1a;A 解析&#xff1a;工程变更一般是指在工程施工过程中&#xff0c;根据合同约定对施工的…

SSM学习2:依赖注入、依赖自动装配、集合注入、加载properties文件

依赖注入 依赖注入方式 setter注入——引用类型 setter注入——简单类型 public class BookDaoImpl implements BookDao {public void setDatabaseName(String databaseName) {this.databaseName databaseName;}public void setNum(int num) {this.num num;}private Stri…

Spark学习3.0

目录 10.3.4 Spark运行原理 1.设计背景 2.RDD概念 3.RDD特性 4.RDD之间的依赖关系 窄依赖和宽依赖 5.Stage的划分 Stage的类型包括两种&#xff1a;ShuffleMapStage和ResultStage 6.RDD运行过程 10.3.4 Spark运行原理 1.设计背景 许多 迭代式算法&#xff08;比如机器学习、图…

【C++】————string基础用法及部分函数底层实现

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月30日 前言&#xff1a; 本文主要介绍STL容器之一 ---- string&#xff0c;在学习C的过程中&#xff0c;我们要将C视为一个语言联邦&#xff08;摘录于Effective C 条款一&#x…

读书笔记-《Spring技术内幕》(三)MVC与Web环境

前面我们学习了 Spring 最核心的 IoC 与 AOP 模块&#xff08;读书笔记-《Spring技术内幕》&#xff08;一&#xff09;IoC容器的实现、读书笔记-《Spring技术内幕》&#xff08;二&#xff09;AOP的实现&#xff09;&#xff0c;接下来继续学习 MVC&#xff0c;其同样也是经典…

朋友问我Java中“::”是什么意思?我汗流浃背了......

目录 一&#xff1a;什么是&#xff1a;&#xff1a;&#xff1f; 二&#xff1a;方法引用的几种类型 1.引用静态方法 2.引用特定对象的实例方法 3.引用特定类型的任意对象的实例方法 4.引用构造方法 三&#xff1a;方法引用的适用场景 四&#xff1a;总结 一&#xff1…

数学建模比赛介绍与写作建议

0 小序 本文的写作起因是导师要求我给打算参加相关竞赛的师弟们做一次讲座和汇报。我梳理了一个ppt提纲&#xff0c;并经过整理&#xff0c;因此有了这篇文章。 我打算从数学建模论文写作格式和写作技巧入手&#xff0c;接着介绍数学建模常用的数学模型&#xff0c;最后提出一…

sheng的学习笔记-AI-聚类(Clustering)

ai目录 sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是聚类 在“无监督学习”(unsupervised learning)中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础。此类学…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

清华大学世界排名:2025QS世界大学排名第20名

近日&#xff0c;国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名&#xff0c;其中麻省理工学院连续第13年蝉联榜首&#xff0c;北京大学排名由去年的全球第17上升至全球第14名&#xff0c;清华大学位列2025QS世界大学排名第20名&#xff0c;以下是查…

Linux——/etc/passwd文件含义,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息&#xff1a;共分为7段&#xff0c;使用冒号分割 含义 - 文件内容意义&#xff1a;账户名&#xff1a;密码代号x&#xff1a;UID&#xff1a;GID&#xff1a;注释&#xff1a;家目录&#xff1a;SHELL - 第7列/sbin/nologin&#x…

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…

软件框架(Framework)是什么?

可实例化的、部分完成的软件系统或子系统&#xff0c;它为一组系统或子系统定义了统一的体系结构(architecture)&#xff0c;并提供了构造系统的基本构造块(building blocks)&#xff0c;还为实现具体功能定义了扩展点(extending points)。 框架实现了体系结构级别的复用。 其…

深度学习评价指标:Precision, Recall, F1-score, mIOU, 和 mDice

在深度学习和机器学习中&#xff0c;评价模型性能是至关重要的一环。本文将详细讲解一些常见的评价指标&#xff0c;包括精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1-score、平均交并比&#xff08;mIOU&#xff09;和平均Dice系数&am…

[leetcode]beautiful-arrangement. 优美的排列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> match;vector<int> vis;int num;void backtrack(int index, int n) {if (index n 1) {num;return;}for (auto &x : match[index]) {if (!vis[x]) {vis[x] tru…

【C++】宏定义

严格来说&#xff0c;这个题目起名为C是不合适的&#xff0c;因为宏定义是C语言的遗留特性。CleanCode并不推荐C中使用宏定义。我当时还在公司做过宏定义为什么应该被取代的报告。但是适当使用宏定义对代码是有好处的。坏处也有一些。 无参宏定义 最常见的一种宏定义&#xf…