高可用集群--KeepAlived

news2025/1/11 2:31:44

文章目录

  • 集群类型
  • VRRP
    • 为什么需要VRRP
  • KeepAlived
    • KeepAlived介绍
    • KeepAlived架构
    • 编译安装
      • 1.下载源码包并解压
      • 2.查看install文件的安装说明
      • 3.执行“./configure”
      • 4.make && make install
      • 5.指定keepalived.conf配置文件
      • 6.修改keepalived的server文件
      • 报错 WARNING - interface eth0 for vrrp_instance VI_1 doesn't exist
      • 7.重启成功
    • 再创建一个KeepAlived节点
  • ka1和ka2的ip地址漂移
    • 是否能ping通ka发布的IP地址
  • 初体验KA的ip漂移的高可有
  • KeepAlived配置说明
    • 配置文件组成
    • 全局配置
    • 虚拟路由器配置
    • 启用keepalived日志功能
    • 独立记录ka的日志
    • 实现ka独立子配置文件
  • 抢占模式和非抢占模式
    • 抢占延迟模式 preempt_delay
    • VIP单播配置
  • KA通知脚本配置
    • 通知脚本类型
      • 脚本调用方法
  • 实现KA的双主架构
    • ka1主机配置
    • ka2主机配置
  • 实现多主架构
    • 三个节点的三主三从
    • 三个节点的三主六从架构
  • 实现IPVS的高可用
    • IPVS相关配置
    • 环境准备
    • 修改RS的内核参数
    • 虚拟服务器配置
    • 重启ka服务,查看ipvsadm规则
    • 模拟客户端访问VIP
  • 后端服务的健康性检查
    • HTTP_GET
    • TCP监测
  • 基于VRRP Script实现其他应用的高可用性
    • VRRP Script 配置
      • 1.定义VRRP script
      • 2.调用VRRP script
  • 实现HAproxy高可用
    • 1.在两个ka1和ka2上实现haproxy的配置
    • 2.在两个ka1和ka2两个节点启用内核参数
    • 3.创建check_haproxy.sh
    • 4.配置keepalived调用脚本

在这里插入图片描述
KeepAlived:通用的高可用集群解决方案。

集群类型

1.LB: Load Balance负载均衡
  LVS/HAProxy/nginx (http/upstream, stream/upstream).

2.HA: High Availability高可用集群
  数据库、Zookeeper、Redis
  KeepAlived通用的高可用集群
  SPoF: Single Point of Failure,解决单点故障

3.HPC: High Performance Computing 高性能集群
  https://www.top500.org

VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性,解决局域网中配置静态网关出现单点失效现象的路由容错协议。

VRRP 允许两台或多台交换机使用同一个虚拟的MAC地址和IP地址,看起来多台交换机就像一个台大交换机,其实这台大交换机并不存在,只是多台互为备份的交换机。

虚拟路由冗余协议,解决静态网关单点风险
  物理层:路由器、三层交换机
  软件层:keepalived

为什么需要VRRP

基础网络的可靠性日益成为用户关注的焦点,能够保证网络传输不中断对于终端用户非常重要。

如图1-2,现网中的主机使用缺省网关与外部网络联系时,如果Gateway出现故障,与其相连的主机将与外界失去联系,导致业务中断。
在这里插入图片描述
如图1-3,VRRP的出现很好地解决了这个问题。VRRP将多台设备组成一个虚拟设备,通过配置虚拟设备的IP地址为缺省网关,实现缺省网关的备份。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。如下图所示,当Master设备故障时,发往缺省网关的流量将由Backup设备进行转发。
在这里插入图片描述

参考链接:https://support.huawei.com/enterprise/zh/doc/EDOC1100209553/,

在这里插入图片描述

KeepAlived

KeepAlived介绍

vrrp协议的软件实现,原生设计目的为了高可用ipvs服务。

官方网站:https://keepalived.org/

Keepalived 是一个用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于著名且广泛使用的Linux 虚拟服务器(IPVS) 内核模块,提供第 4 层负载均衡。Keepalived 实现了一组检查器,根据服务器池的健康状况动态、自适应地维护和管理负载平衡服务器池。另一方面,高可用性是通过 VRRP协议实现的。VRRP 是路由器故障转移的基本要素。此外,Keepalived 实现了一组挂钩到 VRRP 有限状态机,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供有弹性的基础设施。Keepalived

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

KeepAlived架构

官方文档:
https://keepalived.org/doc/
https://keepalived.org/documentation.html

在这里插入图片描述
Keepalived 完全由纯 ANSI/ISO C 编写。该软件围绕提供实时网络设计的中央 I/O 多路复用器进行连接。主要设计重点是在所有元素之间提供同质模块化,这就是为什么创建核心库来消除代码重复的原因。另一方面,目标是生成安全可靠的代码以确保生产稳健性和稳定性。

为了确保稳健性和稳定性,守护进程被分成 3 个不同的进程。全局设计基于一个极简的父进程,负责分叉的子进程监控。然后是 2 个子进程,一个负责 VRRP 框架,另一个负责健康检查。

每个子进程都有自己的调度 I/O 多路复用器,这样 VRRP 调度抖动就得到了优化,因为 VRRP 调度比健康检查器更合理/更关键。另一方面,这种拆分设计最小化了健康检查对外部库的使用,并将其自身操作最小化到空闲主循环,以避免自身导致故障。

父进程监控框架称为看门狗(WatchDog),设计如下:每个子进程打开一个接受 unix 域套接字,然后在守护进程引导时,父进程连接到这些 un​​ix 域套接字并向子进程发送定期(5 秒)的 hello 数据包。如果父进程无法将 hello 数据包发送到远程连接的 unix 域套接字,它只需重新启动子进程。

这种看门狗设计有两个好处,首先,从父进程发送到远程连接的子进程的 hello 数据包是通过 I/O 多路复用器调度程序完成的,这样它就可以检测子进程调度框架中的死循环。第二个好处是使用 sysV 信号来检测死子进程。运行时,您将在进程列表中看到:

1.用户空间核心组件:
  vrrp stack: VIP消息通告
  checkers: 监测Real Server
  system call: 实现vrrp协议状态转换时调用脚本的功能
  SMTP:邮件组件
  IPVS wrapper:生成IPVS规则
  Netlink Reflector:网络接口
  WatchDog:监控进程
  
2.控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

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

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

编译安装

编译安装以ubuntu2004为例,事前需要安装一些依赖。

apt update
apt -y install make gcc ipvsadm build-essential pkg-config automake autoconf libipset-dev libnl-3-dev libnl-genl-3-dev libssl-dev libxtables-dev libip4tc-dev libip6tc-dev libipset-dev libmagic-dev libsnmp-dev libpcre2-dev libnftnl-dev libmnl-dev libsystemd-dev

1.下载源码包并解压

wget https://keepalived.org/software/keepalived-2.2.7.tar.gz

在这里插入图片描述

2.查看install文件的安装说明

在这里插入图片描述
在这里插入图片描述

3.执行“./configure”

./configure --prefix=/usr/local/keepalived

在这里插入图片描述

4.make && make install

make -j 2 && make install   # -j 2是加上自己的cpu核数可以加速编译

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看版本信息

 /usr/local/keepalived/sbin/keepalived -v

在这里插入图片描述

5.指定keepalived.conf配置文件

完成第4步后还启动不了keepalived服务,启动会报错,journalctl日志提示“Config files missing ‘/usr/local/etc/keepalived/keepalived.conf’”缺失这个配置文件,然而我们自定义的编译安装的目录在/usr/local/keepalived目录下,所以我们需要再server文件中指定我们自定义的配置文件的目录。
在这里插入图片描述
我们先将keepalived.conf.sample的模板文件拷贝致我们的安装目录“/usr/local/keepalived/etc”下作为keepalived.conf配置文件,
在这里插入图片描述

6.修改keepalived的server文件

在keepalived.service文件中指定keepalived.conf的位置。

 vim /lib/systemd/system/keepalived.service
ExecStart=/usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived.conf --dont-fork $KEEPALIVED_OPTIONS

在这里插入图片描述

报错 WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist

报错提示“WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist”
在这里插入图片描述
看下,我的网卡名好像不是eth0是ens33,需要修改keepalived.conf中的
在这里插入图片描述
vim /usr/local/keepalived/etc/keepalived.conf
在这里插入图片描述

7.重启成功

修改上面的配置之后启动就成功了
在这里插入图片描述
keepalived服务成功起来后,使用ip命令可以看到生成了许多ip地址。
在这里插入图片描述

再创建一个KeepAlived节点

复制以上编译安装的文件,再重新创建一个ka2的服务节点。

拷贝keepalived文件

scp -r /usr/local/keepalived/ 192.168.10.150:/usr/local

在这里插入图片描述
拷贝service文件

scp -r /lib/systemd/system/keepalived.service 192.168.10.150:/lib/systemd/system/keepalived.service

在这里插入图片描述
这次我们尝试将keepalived.conf文件放在/etc/keepalived下,然后在/usr/lib/systemd/system/keepalived.service文件中不指定keepalived.conf的位置,看系统能否自己找到。
在这里插入图片描述
vim /usr/lib/systemd/system/keepalived.service
在这里插入图片描述

启动service服务

root@ka2:~# systemctl daemon-reload
root@ka2:~# systemctl enable --now keepalived.service 

启动成功了,说明系统会默认去/etc/keepalived下找keepalived.conf
在这里插入图片描述
此时ka2的ip地址好像没有增多
在这里插入图片描述

ka1和ka2的ip地址漂移

在这里插入图片描述
我停掉ka1的service服务
在这里插入图片描述

是否能ping通ka发布的IP地址

我修改了ka新增的ip子网掩码为24
vim /etc/keepalived/keepalived.conf
在这里插入图片描述

在这里插入图片描述
现在我找一台192.168.10.149的机器,看能否ping通192.168.200.16等ip地址
在这里插入图片描述
刚开始ping不通,可能会有很多原因,
原因一:keepalived.conf中的配置需要注释掉vrrp_strict
在这里插入图片描述
原因二:192.168.10.X和192.168.200.X不在同一网段(这个解释可能有错误,后面知道正确的原因后再回来改正)
在192.168.10.149的机器上新增一个192.168.200.X的ip地址

新增一个ip地址

ip a a 192.168.200.123/24 dev ens33   

删除一个ip地址

ip a del 192.168.200.123/24 dev ens33 

在这里插入图片描述
可以ping通了
在这里插入图片描述

初体验KA的ip漂移的高可有

分别在ka1和ka2上安装nginx,两个nginx对外提供同一个web服务,默认页面都是 “This is + ip地址”
在这里插入图片描述
在192.168.10.149中配置hosts文件
vim /etc/hosts

192.168.200.16 www.leiweb.com

此时192.168.200.16的地址是在150的机器上的,则由150的机器提供nginx的web服务
在这里插入图片描述当我宕掉150的keepalived服务后,192.168.200.16的地址漂移到了137的机器上去了,此时则由137来提供nginx的web服务。在这里插入图片描述

KeepAlived配置说明

vim /etc/keepalived/keepalived.conf

配置文件组成

1.GLOBAL CONFIGURATION

Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等

2.VRRP CONFIGURATION

VRRP instance(s):定义每个vrrp虚拟路由器

3.LVS CONFIGURATION

Virtual server group(s)
Virtual server(s):LVS集群的VS和RS

vim /etc/keepalived/keepalived.conf

! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 230.1.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100    # 是master还是backup最终由优先级决定
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
}

全局配置

/etc/keepalived/keepalived.conf

global_defs {
  notification_email {
  root@localhost  #keepalived发生故障切换时邮件发送的目标邮箱,可以按行区分写多个,据说配了没用
  root@wangxiaochun.com
  xxxxxx@qq.com
  }
  notification_email_from keepalived@localhost  #发邮件的地址
  smtp_server 127.0.0.1  #邮件服务器地址
  smtp_connect_timeout 30  #邮件服务器连接timeout
  router_id ka1.example.com #每个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报文发送延迟,0表示不延迟
  vrrp_gna_interval 0  #unsolicited NA messages(不请自来)消息发送延迟
  vrrp_mcast_group4 224.0.0.18  #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18
  vrrp_iptables  #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}

抓包

tcpdump -i ens33 -nn host 224.0.0.18

137在不断地向组播地址224.0.0.18发送消息,当宕掉137的ka服务之后,150或继续向224.0.0.18发送
在这里插入图片描述
宕掉137的ka服务
在这里插入图片描述

虚拟路由器配置

vrrp_instance <STRING> { #<String>为vrrp的实例名,一般为业务名称
   配置参数
   ....
}

#配置参数:
state MASTER|BACKUP  #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME  #绑定为当前虚拟路由器使用的物理接口,如:eth0, ens33, bond0 ,br0,可以和VIP不在一个网卡

virtual_router_id vRID  #每个虚拟路由器唯一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepa1ived节点必须相同,务必要确认在同一网络中此值必须唯一

priority 100  #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepa7ived主机节点此值不同
advert_int 1  #vrrp通告的时间间隔,默认1s
authentication { #认证机制
    auth_type AH|PASS  #AH为IPSEC认证(不推荐), PASS为简单密码(建议使用)
    auth_pass <PASSWORD>  #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepa7ived节点必须一样
}

virtual_ipaddress {  #虚拟IP,生产环境可能指定上百个IP地址
    <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>labe1 <LABEL>
    192.168.200.100  #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix ,默认为/32
    192.168.200.101/24 dev eth1  #指定VIP的网卡,建议和interface指令指定的网卡不在一个网卡
    192.168.200.102/24 dev eth2 1abe1 eth2:1  #指定VIP的网卡1abel
}

track_interface {   #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
   eth0
   eth1
   ...
}

启用keepalived日志功能

在service文件中查看下面这个文件
vim /usr/local/keepalived/etc/sysconfig/keepalived
在这里插入图片描述
默认ka的系统日志记录在log_daemon中,log_daemon的配置在/etc/rsyslog.d/50-default.conf
在这里插入图片描述
vim /etc/rsyslog.d/50-default.conf
在这里插入图片描述
但daemon日志开启后,/var/log/daemon.log会记录很多daemon日志,会ka的daemon日志杂糅在一起不利于观察,于是我们就自定义一个文件在记录ka的daemon信息。

独立记录ka的日志

1.设置log-facility
vim /usr/local/keepalived/etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6"

/usr/local/keepalived/etc/sysconfig/keepalived文件的查看方法,先找到ka的service路径,打开keepalived.service文件后,EnvironmentFile等号后面的值便是。
在这里插入图片描述
在这里插入图片描述
2.定义规则文件
vim /etc/rsyslog.d/6-keepalived.conf

local6.*   /var/log/keepalived.log

3.重启ka服务
重启keepalived.service和rsyslog.service
在这里插入图片描述
由日志了
在这里插入图片描述

实现ka独立子配置文件

当生产环境复杂时,/etc/keepalived/keepalived.conf文件中内容过多,不易管理,可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中。

利用include指令可以实现包含子配置文件,格式如下:

include /etc/keepalived/conf.d/*.conf

vim /etc/keepalived/keepalived.conf
在这里插入图片描述

mkdir /etc/keepalived/conf.d/

vim leimall.org.conf

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.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
}

抢占模式和非抢占模式

默认为抢占模式 preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt,即高优先级主机恢复后,并不会抢占低优先级主机的master角色。

注意:非抢占模式下,如果原主机down机, VIP迁移至的新主机,后续新主机也发生down时,仍会将VIP迁移回原主机。

注意:要关闭VIP抢占,必须将各Keepalived服务器state配置为BACKUP

#ha1主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface ens33  
  virtual_router_id 66
  priority 100    #优先级高
  advert_int 1
  nopreempt       #添加此行,设为nopreempt
}

#ha2主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface ens33
  virtual_router_id 66
  priority 80     #优先级低
  advert_int 1
  #nopreempt       #生产中ka2主机是抢占式,不添加此行,否则会导致ka1即使优先级降低,也不会切换至ka2
}

抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP

preempt_delay    #指定抢占延迟时间为#s,默认延迟300s

注意:需要各keepalived服务器state为BACKUP,并且不要启用vrrp_strict

#ka1主机配置
vrrp_instance VI_1 {
  state BACKUP         #都为BACKUP
  interface eth0
  virtual_router_id 66
  priority 100         #优先级高
  advert_int 1
  preempt_de1ay 60     #抢占延迟模式,默认延迟300s
}

#ka2主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface eth0
  virtual_router_id 66
  priority 80     #优先级低
  advert_int 1
}

VIP单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。机器不多就用单播。

注意:启用vrrp_strict时,不能启用单播

在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络

unicast_src_ip <IPADDR>      指定发送单播的源IP
unicast_peer {
   <IPADDR>       指定接收单播的对方目标主机IP
   ......
}

192.168.10.137的MASTER配置

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.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150     指向对方主机IP
       192.168.10.151     如果有多个keepalived,再加其他节点的ip
    }
}

192.168.10.150的BACKUP配置

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
}

抓包观察

tcpdump -i ens33 -nn src host 192.168.10.137 and dst host 192.168.10.150

在这里插入图片描述
可以看出已经是192.168.10.137向192.168.10.150单播发送消息了,不再是使用多播地址224.0.0.18广播消息了。

KA通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户

默认以用户keepalived_script身份执行脚本,如果此用户不存在,以root执行脚本

可以用下面指令指定脚本执行用户的身份

global_defs {
  ....
  script_user <USER>
  ....
}

通知脚本类型

1.当前节点成为主节点时触发的脚本

notify_master <STRING>|<QUOTED-STRING>

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

notify_backup <STRING>|<QUOTED-STRING>

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

notify_fault <STRING>|<QUOTED-STRING>

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

notify <STRING>|<QUOTED-STRING>

5.停止VRRP时触发的脚本

notify_stop <STRING>|<QUOTED-STRING>

notify.sh

#!/bin/bash
wall The host is to being $1 state

在这里插入图片描述

脚本调用方法

脚本的使用可以参看编译安装后的路径下的示范案例
在这里插入图片描述

在vrrp_instance Vl_1语句块的末尾加下面行

notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我关掉150的ka服务之后
在这里插入图片描述

实现KA的双主架构

ka1主机配置

root@ka1:~# cat /etc/keepalived/keepalived.conf 
! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

include /etc/keepalived/conf.d/*.conf

ka1的cluster1.conf

root@ka1:~# cat /etc/keepalived/conf.d/cluster1.conf 
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.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_fault "/etc/keepalived/conf.d/notify.sh fault" 
}

ka1的cluster2.conf

root@ka1:~# cat /etc/keepalived/conf.d/cluster2.conf 
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 61
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.17/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_fault "/etc/keepalived/conf.d/notify.sh fault" 
}

在这里插入图片描述

ka2主机配置

ka2的keepalived.conf

root@ka2:~# cat /etc/keepalived/keepalived.conf 
! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

include /etc/keepalived/conf.d/*.conf

ka2的cluster1.conf

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

ka2的cluster2.conf

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { 
        192.168.200.17/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

在这里插入图片描述
查看IP
在这里插入图片描述

实现多主架构

三个节点的三主三从

在这里插入图片描述

第一个节点ka1配置:
virtual_router_id 1, vrrp instance 1, MASTER, 优先级100
virtual_router_id 3, vrrp instance 2, BACKUP, 优先级80

第二个节点ka2配置:
virtual_router_id 2, vrrp instance 1, MASTER, 优先级100
virtual_router_id 1, vrrp instance 2, BACKUP, 优先级80

第三个节点ka3配置:
virtual_router_id 3, vrrp instance 1, MASTER,优先级100
virtua1_router_id 2, vrrp instance 2, BACKUP,优先级80

三个节点的三主六从架构

在这里插入图片描述

第一个节点ka1配置:
virtual_router_id 1,  vrrp instance 1, MASTER,优先级100
virtual_router_id 2,  vrrp instance 2, BACKUP,优先级80
virtual_router_id 3,  vrrp instance 3, BACKUP,优先级60

第二个节点ka2配置:
virtua1_router_id 1,  vrrp instance 1, BACKUP,优先级60
virtua1_router_id 2,  vrrp instance 2, MASTER,优先级100
virtual_router_id 3,  vrrp instance 3, BACKUP,优先级80

第三个节点ka3配置:
virtua1_router_id 1,  vrrp instance 1, BACKUP,优先级80
virtual_router_id 2,  vrrp instance 2, BACKUP,优先级60
virtual_router_id 3,  vrrp instance 3, MASTER,优先级100

实现IPVS的高可用

IPVS相关配置

每一个虚拟服务器即一个IPVS集群,可以通过下面语法实现

virtual_server IP port {
    ......
    
    real_server IP port {
        ......
    }

    real_server IP port {
        ......
    }
}

环境准备

1.两台ka服务137和150,VIP为192.168.200.16/24
2.两台web服务151和153,因为是基于DR模式的ipvs,所以VIP都配192.168.200.16/24
在这里插入图片描述

修改RS的内核参数

两台web服务需要修改自己的VIP为不应答和广播,这里我们使用脚本配置
lvs_dr_rs.sh

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.200.16
mask='255.255.255.0'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "`hostname -I`" > /var/www/html/index.html

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

两台web服务同时执行脚本
在这里插入图片描述

虚拟服务器配置

virtual_server IP port{               VIP和PORT
    delay_loop <INT>                  检查后端服务器的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh  定义调度方法
    lb_kind NAT|DR│TUN                集群的类型,注意要大写
    persistence_timeout <INT>         持久连接时长
    protocol TCP|UDP|SCTP             指定服务协议,一般为TCP
    sorry_server <IPADDR><PORT>       所有RS故障时,备用服务器地址
    real_server <IPADDR><PORT> {      RS的IP和PORT
        weight <INT>                  RS权重
        notify_up <STRING> |<QUOTED-STRING>     RS上线通知脚本
        notify_down <STRING> |<QUOTED-STRING>   RS下线通知脚本
        HTTP_GET| SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }  定义当前主机健康状态检测方法
     }
}

注意:括号必须分行写,两个括号写在同一行,如:}}会出错

137的cluster1.conf

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.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_master "/etc/keepalived/conf.d/notify.sh master"
}

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.10.153 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

150的配置

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

   real_server 192.168.10.153 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

重启ka服务,查看ipvsadm规则

systemctl restart keepalived.service

在这里插入图片描述
这是keepalived自动生成的ipvsadm规则

模拟客户端访问VIP

这里还有问题,先跳过,后续补上

后端服务的健康性检查

KA是怎么探测后端服务的健康性的呢?

默认通过KeepAliveClient浏览器来发送HTTP/1.0协议

HTTP_GET

应用层检测:HTTP_GET |SSL_GET

HTTP_GET|SSL_GET {
    url {
       path <URL_PATH>          定义要监控的URL
       status_code <INT>        判断上述检测机制为健康状态的响应码,一般为 200
   }
   connect_timeout <INTEGER>    客户端请求的超时时长,相当于haproxy的timeout server
   nb_get_retry <INT>           重试次数
   delay_before_retry <INT>     重试之前的延迟时长
   connect_ip <IP ADDRESS>      向当前RS哪个IP地址发起健康状态检测请求
   connect_port <PORT>          向当前RS的哪个PORT发起健康状态检测请求
   bindto <IP ADDRESS>          向当前RS发出健康状态检测请求时使用的源地址
   bind_port <PORT>             向当前RS发出健康状态检测请求时使用的源端口
}

示例

virtual_server 192.168.200.16 80 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
        sorry_server 127.0.0.1 80
        
        real_server 192.168.10.151 80 {
            weight 1
            HTTP_GET {
                url {
                   path /monitor.html
                   status_code 200
                }
                connect_timeout 1
                nb_get_retry 3
                delay_before_retry 1
           }
        }
        
        real_server 192.168.10.153 80 {
            weight 1
            HTTP_GET {
                url {
                    path /
                    status_code 200
                }
                connect_timeout 1
                nb_get_retry 3
                delay_before_retry 1
            }
        }
}

TCP监测

传输层检测:TCP_CHECK

TCP_CHECK {
     connect_ip <IP ADDRESS>     向当前RS的哪个IP地址发起健康状态检测请求
     connect_port <PORT>         向当前RS的哪个PORT发起健康状态检测请求
     bindto <IP ADDRESS>         发出健康状态检测请求时使用的源地址
     bind_port <PORT>            发出健康状态检测请求时使用的源端口
     connect_timeout <INTEGER>   客户端请求的超时时长,等于haproxy的timeout server
}

示例

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 120      会话保持时间
    protocol TCP
    sorry_server 127.0.0.1 80
    
    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
         }
     }
     
    real_server 192.168.10.153 80 {
         weight 1
         TCP_CHECK {
             connect_timeout 5
             nb_get_retry 3
             delay_before_retry 3
             connect_port 80
        }
    }
}

基于VRRP Script实现其他应用的高可用性

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

VRRP Script 配置

VRRP Script的配置分两步实现定义脚本和调用脚本。

1.定义VRRP script

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值监控指定应用的状态,一旦发现应用的状态异常,则触发对MASTER节点的权重的减小,减至低于SLAVE节点,从而实现VIP切换到SLAVE节点。

公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后;是和global_defs平级的语句块。

当keepalived_script用户存在时,会以此用户身份运行脚本,否则默认以root运行脚本

注意:此定义脚本的语句块一定要放在下面调用此语句vrrp_instance语句块的前面

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

2.调用VRRP script

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

track_script {
  SCRIPT_NAME_1
  SCRIPT_NAME_2
}
vrrp_instance VI_1 {
    ....
    track_script {
        <SCRIPT_NAME>
   }
}

示范案例

vrrp_script check_down {
    script "[ ! -f /etc/keepalived/down ]"     /etc/keepalived/down 存在时返回非0,触发权重-30
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}

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.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
    track_script{
        check_down
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_master "/etc/keepalived/conf.d/notify.sh master"
}

在这里插入图片描述
“-f /etc/keepalived/down” 表示文件知否存储,

"[! -f /etc/keepalived/down ]"      /etc/keepalived/down 存在时返回非0,触发权重-30

在这里插入图片描述

实现HAproxy高可用

1.在两个ka1和ka2上实现haproxy的配置

vim /etc/haproxy/haproxy.cfg

[root@ka1 ~]#cat /etc/haproxy/haproxy.cfg
listen leiedu_http
    bind 192.168.200.16:80
    server 192.168.10.151 192.168.10.151:80 check
    server 192.168.10.153 192.168.10.153:80 check
    
listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri    /haproxy-status
    stats auth   haadmin: 123456

2.在两个ka1和ka2两个节点启用内核参数

vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

sysctl -p
在这里插入图片描述

3.创建check_haproxy.sh

vim /etc/keepalived/ check_haproxy.sh

#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy

赋予脚本执行权限

chmod a+x /etc/keepalived/check_haproxy.sh

4.配置keepalived调用脚本

vim /etc/keepalived/keepalived.conf

! configuration File for keepalived
    g1obal_defs {
        notification_email {
        root@localhost
    }
     notification_emai1_from kaadmin@localhost
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id ka1.lei.org            在另一个节点为ka2.lei.org
     vrrp_mcast_group4 224.0.100. 100
}

vrrp_script check_haproxy {           定义脚本
    script "/etc/keepalived/check_haproxy.sh"
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}
vrrp_instance VI_1 {
    state MASTER            在另一个节点为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100            在另一个节点为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtua1_ipaddress {
       192.168.200.16/24 dev ens33 labe1 ens33:1
    }
    track_interface {
       ens33
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup " /etc / keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fau1t"
    track_script {
       check_haproxy      调用上面定义的脚本
    }
}

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

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

相关文章

面试面到自闭,字节软件测试岗五轮面试,四个小时灵魂拷问...

准备过程 我自己是本科毕业后在老东家干了两年多&#xff0c;老东家算是一家”小公司”(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身)&#xff0c;毕业这两年多我也没有在大厂待过&#xff0c;因此找坑的时候是非常非常虚的。迫于心慌&#xff0c;我好好思考了一阵来…

go JSON

JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 json历史 JSON建构于两种结构 “键/值”对的集合…

智能井盖管理系统:城市窨井的井下“保镖”

随着城市化进程的加速&#xff0c;城市的生命线基础设施面临着越来越多的挑战。其中&#xff0c;旭华智能智能井盖传感器技术的发展为提升城市基础设施的安全性和管理效率提供了新的解决方案。它专门用于监控市政窨井、燃气井、供水井内的积水状况以及井盖状态&#xff0c;以增…

Go+Redis零基础到用户管理系统API实战_20240730 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227 基础不好的同学每节课的代码最好配合视频进…

在Adaptive AUTOSAR中,默认有一个机器状态的功能组管理平台进程的生命周期,那怎么切换到其他功能组的状态呢?

在Adaptive AUTOSAR中,状态管理(State Management, SM)模块和执行管理(Execution Management, EM)模块共同负责功能组状态的切换。 以下是切换到其他功能组状态的步骤: 状态切换流程 状态请求: 状态管理模块接收到来自应用程序、功能集群、平台健康管理、诊断等的状态切…

代码随想录算法训练营第33天|62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树

打卡Day33 1.62.不同路径2.63. 不同路径 II3.343. 整数拆分4.96.不同的二叉搜索树 1.62.不同路径 题目链接&#xff1a;62.不同路径 文档讲解&#xff1a; 代码随想录 动规五部曲&#xff1a; &#xff08;1&#xff09;确定dp数组和下标的含义 dp[ i ][ j ] 表示到达 i x j …

JNDI注入-高版本绕过

参考博客&#xff1a; JNDI注入与动态类加载 探索高版本 JDK 下 JNDI 漏洞的利用方法 - 跳跳糖 (tttang.com) 分析版本 jdk8u201 分析流程 修复 在ldap绕过中&#xff0c;我们讲了LDAP的修复&#xff0c;下面用jdk8u201具体来看下修复。 修复之前&#xff0c;利用是在L…

档案馆可视化管理系统

通过图扑可视化技术&#xff0c;实现档案馆内文件、资料的高效管理与实时监控&#xff0c;提升档案数据的查询、存档和维护效率。

【建议收藏】大数据Hadoop实战入门手册,配套B站视频教程1小时速通

大数据Hadoop入门实战专栏 大数据技术概述大数据简介Hadoop简介 大数据集群环境搭建环境搭建概述虚拟机准备集群搭建Java开发环境准备 分布式文件系统HDFS学习前期概述HDFS Shell命令HDFS可视化界面HDFS Java API编程环境初始化API基本使用创建目录更改目录权限上传文件查看目录…

docker pgsql实现pg_jieba全文检索

安装pg_jieba分词器 安装依赖工具 查看docker运行的所有容器 docker ps进入pg数据库容器 docker exec -it postgres4postgis bash安装必要的工具和依赖 apt-get install -y git build-essential cmake libpq-dev postgresql-server-dev-all安装pg_jieba分词 git clone ht…

Apache DolphinScheduler用户线上Meetup火热来袭!

Apache DolphinScheduler 社区 8 月用户交流会精彩继续&#xff01;本次活动邀请到老牌农牧产品实业集团铁骑力士架构工程师&#xff0c;来分享Apache DolphinScheduler在现代农牧食品加工场景中的应用实践。此外&#xff0c;还将有社区活跃贡献者以Apache DolphinScheduler为例…

为什么AI会一本正经地胡说八道

泛泛地说&#xff0c;AI一本正经地胡说八道的原因可以归结为&#xff1a;AI的理解能力受到其训练数据和算法的限制&#xff0c;如果问题表达不清晰或者背景信息不足&#xff0c;AI可能会产生错误的推理或输出&#xff1b;AI语言模型本质上是基于统计学习和模式匹配的&#xff0…

基于新型电力系统的有序充电解决方案

安科瑞 耿敏花 摘要&#xff1a;近年来,新能源汽车的销量快速增长,相应的充电桩数量也急剧增加,这一现象可能会给电网和变压器造成负担,与此同时&#xff0c;新型电力系统下以光伏为主的分布式发电系统占比也在逐渐提高&#xff0c;新能源的不稳定性叠加充电需求的不确定性会给…

MySQL基础练习题13-指定日期的产品价格

题目&#xff1a;找出在 2019-08-16 时全部产品的价格&#xff0c;假设所有产品在修改前的价格都是 10 。 准备数据 分析数据 题目&#xff1a;找出在 2019-08-16 时全部产品的价格&#xff0c;假设所有产品在修改前的价格都是 10 。 准备数据 ## 创建库 create tadabase d…

矩阵管理系统真的好用吗

在这个短视频盛行的时代&#xff0c;每个人都可能是下一个网红。但是&#xff0c;当你的账号遍布各大平台&#xff0c;每个平台都要求你不断更新内容时&#xff0c;你可能会问&#xff1a;有没有一种工具&#xff0c;可以让这一切变得更简单&#xff1f;这就是矩阵管理系统出现…

项目中AOP相关问题

答&#xff1a;AOP是面向切面编程&#xff0c;可以通过定义方法拦截器和切入点&#xff0c;实现将一些逻辑相同的代码块抽取到同一个模块中&#xff0c;这个模块就是切面。代码可以只关注业务实现&#xff0c;不用关注那些通用逻辑。 答&#xff1a;切面&#xff0c;通用模块&…

模型部署优化综述

一、引言 模型部署优化是一个涵盖众多环节的宽泛领域,从模型训练完成到实际硬件部署,涉及多个层面的工作,且每个环节对技术的要求各异。其本质是通过减小模型大小、提高推理速度等手段,使模型能在各种硬件中成功部署并实时有效运行。 二、模型剪枝技术 (一)模型剪枝的…

Oracle基础-集合

集合&#xff1a;两个结果集的字段个数和字段类型必须相同&#xff0c;才能使用集合操作。 --UNION 并集 重复行会去重 (SELECT A,B FROM DUAL UNION SELECT C,D FROM DUAL) UNION (SELECT A,B FROM DUAL UNION SELECT E,F FROM DUAL ); --UNION ALL 全集 包含所有记录 不去重…

学校会拒绝孤独症孩子吗?揭秘专业教育机构的关怀之心

在当今社会&#xff0c;孤独症孩子的教育问题备受关注。许多家长心中都存在着一个担忧&#xff1a;学校会拒绝孤独症孩子吗&#xff1f; 事实上&#xff0c;大多数专业的教育机构都怀揣着一颗关怀之心&#xff0c;不会轻易拒绝这些特殊的孩子。 专业的教育机构深知&#xff0c;…

畅捷通如何远程访问?

随时随地能够远程访问和操作畅捷通已经成为许多职场人士的迫切需求。作为一名有着亲身经历的使用者&#xff0c;今天我就来和大家分享一下实现畅捷通远程访问的绝佳方法。 曾几何时&#xff0c;为了能在外出时也能使用畅捷通办公&#xff0c;我可谓是绞尽脑汁。尝试过多种传统方…