什么是keepalived?

Keepalived 是一款基于 Linux 系统的开源高可用解决方案,主要用于实现服务器集群的故障检测和自动切换,确保服务持续可用。它结合了 VRRP(虚拟路由冗余协议) 和 LVS(Linux 虚拟服务器) 的功能,既能实现节点(服务器)的冗余备份,也能配合负载均衡提升服务稳定性。

功能:

  • 基于vrrp协议完成地址流动

  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

  • 为ipvs集群的各RS做健康状态检测

  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

官网:http://keepalived.org/

VRRP

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议),解决静态网关单点风险。

  • 物理层:路由器、三层交换机

  • 软件层:keepalived

  1. 虚拟路由器(Virtual Router)

    • 由一个 虚拟 IP 地址(VIP) 和一组物理路由器组成。

    • VIP 是对外服务的 “统一网关地址”,终端设备只需配置该地址作为默认网关。

  2. 角色分工

    • Master 路由器:当前承担流量转发的设备,持有 VIP 并响应 ARP 请求。

    • Backup 路由器:监听 Master 的状态,在 Master 故障时接管 VIP。

  3. 优先级机制

    • 每个路由器分配 0~255 的优先级(默认 100),优先级最高者成为 Master。

    • 当 Master 故障(如停止发送 VRRP 通告),Backup 中优先级最高者晋升为新 Master。

  4. VRRP 通告(Advertisement)

    • Master 定期(默认 1 秒)发送 VRRP 通告,宣告自身存活。

    • Backup 接收通告并更新 Master 状态,若超时未收到通告,则触发选举。

Keepalived 的工作原理

  1. VRRP 组配置:多台服务器组成一个 “VRRP 组”,其中一台设为主节点(Master),其余为从节点(Backup)。

  2. 心跳检测:主节点定期向从节点发送 “心跳包”(VRRP 通告),证明自身正常。

  3. 故障切换

    • 若从节点长时间未收到主节点的心跳,判定主节点故障。

    • 从节点通过 VRRP 选举(通常按优先级)产生新的主节点,接管 VIP 和服务。

  4. 服务恢复:原主节点修复后,可按配置重新成为主节点(抢占模式)或作为从节点待命(非抢占模式)。

Keepalived架构

image-20260129142422132

  • 用户空间核心组件:

    • vrrp stack:VIP消息通告

    • checkers:监测real server

    • system call:实现 vrrp 协议状态转换时调用脚本的功能

    • SMTP:邮件组件

    • IPVS wrapper:生成IPVS规则

    • Netlink Reflector:网络接口

    • WatchDog:监控进程

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

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

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

keepalived相关文件

  • 0软件包名:keepalived

  • 主程序文件:/usr/sbin/keepalived

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

  • 配置文件示例:/usr/share/doc/keepalived/

  • Unit File:/lib/systemd/system/keepalived.service

  • Unit File的环境配置文件:/etc/sysconfig/keepalived

配置文件参数

配置文件组成部分

  • GLOBAL CONFIGURATION 全局配置

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

  • VRRP CONFIGURATION 虚拟路由器配置

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

  • LVS CONFIGURATION LVS配置

    Virtual server group(s)

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

1.全局配置

[root@KA1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     fjwyyy@fjwyyy.org  #发生故障时发送邮件给运维人员
   } 
   notification_email_from fjwyyy@fjwyyy.org     #发邮件的地址,收件人
   smtp_server 127.0.0.1                         #邮箱服务器发送的IP地址
   smtp_connect_timeout 30                       #邮箱服务器超时连接时间,超过则认为挂了
   router_id KA1                                 #主机标识
   vrrp_skip_check_adv_addr                      #检查发送到组播的通告报文,会比较上一个通告报文是否为同                                                           一路由器,为同一路由器则不检查,避免资源消耗
   
  # vrrp_strict                                  #vrrp安全限制,不遵循以下无法启动服务
                                                #1.无VIP地址
                                                #2.不能配置单播邻居     
                                                #3.在VRRP版本2中有IPV6地址
                                                #建议不加此项配置
                                               
   vrrp_garp_interval 1                         #免费ARP通告报文间隔时间,免费ARP用于通告网络中其他设备                                                            IP发送偏移对应的MAC地址发生了变化,帮助网络设备更新ARP                                                         缓存,确保数据能正确转发到主节点上
   
   vrrp_gna_interval 1                          #这是用来管理IPV6的VIP偏移的ARP通告报文间隔时间
   vrrp_mcast_group4 224.0.0.44                  #指定组播地址
}

2.VRRP配置

vrrp_instance haha {
    state MASTER                                        #虚拟路由状态
    interface eth0                                      #虚拟路由使用接口,用于发送组播报文的接口
    virtual_router_id 91                                #虚拟路由标识,0~255,用一个虚拟路由器值必须相同
    priority 100                                        #优先级,1~254,谁优先级高,谁有VIP而不是看state
    advert_int 1                                        #vrrp通告时间间隔,发送组播  信息间隔                  
    authentication {                                    #认证机制,用于来专门封装发送组播的通告报文
        auth_type AH | PASS                             #认证方式,AH为ipsec认证,PASS为简单密码
        auth_pass 1111                                  #共享密钥
    }
    virtual_ipaddress {                                 #虚拟IP,VIP
        172.25.254.100/24 dev eth0 label eth0:0           #指定VIP,网卡,开启网卡的子接口ech0:0供给给VIP使用或者使用另一个网卡给VIP工作
    }
    accept                                             #开启vip 对外响应ping包,注意此处功能需要关闭                                                      vrrp_strict,默认是开启的,开启vrrp_strict后就不能pingvip了会被策略丢弃
                                                      #默认使用nftab策略禁用ping包响应,nft list ruleset 显示策略
}

3.LVS配置

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 { ... }    #定义当前主机健康状
态检测方法
    }
}
​
#应用层检测,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发出健康状态检测请求时使用的源端口
}
​
#传输层监测,TCP监测
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
}
​
#检测配置文件语法
[root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf

实验

实验环境设定

主机名IPOS
KA1eth0:172.25.254.50(NAT)RHEL9.6
KA2eth0:172.25.254.60(NAT)RHEL9.6
RS1eth0:172.25.254.10(NAT)RHEL9.6
RS2eth0:172.25.254.20(NAT)RHEL9.6

image-20260130144926598

  • 各节点时间必须同步:ntp, chrony

  • 关闭防火墙及SELinux

  • 各节点之间可通过主机名互相通信:非必须

  • 建议使用/etc/hosts文件实现:非必须

  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

网络设定

[root@KA1 ~]# vmset.sh eth0 172.25.254.50 KA1
[root@KA2 ~]# vmset.sh eth0 172.25.254.60 KA2
[root@RS1 ~]# vmset.sh eth0 172.25.254.10 RS1
[root@RS2 ~]# vmset.sh eth0 172.25.254.20 RS2

RS部署web服务

[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# echo RS1 - 172.25.254.10 > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd
​
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# echo RS2 - 172.25.254.20 > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd

KA配置时间同步

#KA1开启时间同步
[root@KA1 ~]# vim /etc/chrony.conf
 26 allow 0.0.0.0/0
 29 local stratum 10
 
[root@KA1 ~]# systemctl restart chronyd
[root@KA1 ~]# systemctl enable --now chronyd
​
#KA2使用KA1作为时间源
[root@KA2 ~]# vim /etc/chrony.conf
pool 172.25.254.50 iburst
​
[root@KA2 ~]# systemctl restart chronyd
[root@KA2 ~]# systemctl enable --now chronyd
​
[root@KA2 ~]# chronyc sources -v
[root@KA2 ~]# vim /etc/chrony.conf
pool 172.25.254.50 iburst
​
[root@KA2 ~]# systemctl restart chronyd
[root@KA2 ~]# systemctl enable --now chronyd
​
[root@KA2 ~]# chronyc sources -v

image-20260130145021841

配置本地解析

[root@KA1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.50     KA1
172.25.254.60     KA2
172.25.254.10     rs1
172.25.254.20     rs2
​
[root@KA1 ~]# for i in 60 10 20
> do
> scp /etc/hosts 172.25.254.$i:/etc/hosts
> done

keepalived安装

[root@KA1 ~]# dnf install keepalived -y
[root@KA1 ~]# systemctl enable --now keepalived

keepalived简单示例单主架构

#编辑配置文件
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf   #主设备
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf   #从设备
[root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf  #检测语法
[root@KA1 ~]# systemctl restart keepalived  #编辑配置文件后重启服务

image-20250728130333478

image-20250728130407334

测试

image-20250728130528434

#这个 tcpdump 命令用于抓取网络接口eth0上与主机224.0.0.44相关的所有流量
[root@KA1 ~]# tcpdump -i eth0 -nn host 224.0.0.44   #查看组播地址报文的接收情况

image-20250728130712516

测试主设备“挂掉后”,从设备持有VIP

#模拟故障
[root@KA1 ~]# systemctl stop keepalived.service
[root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.44

image-20250728131034039

image-20250728131420605

keepalived日志功能

[root@KA2 ~]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6" #日志级别为0-7
[root@KA2 ~]#vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
[root@KA2 ~]#systemctl restart keepalived.service rsyslog.service
[root@KA2 ~]#cat /var/log/keepalived.log

image-20250728132337170

image-20250728132544225

image-20250728133258463

实现独立子配置文件

[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf   #不用加引号
[root@KA1 ~]# mkdir /etc/keepalived/conf.d/
[root@KA1 ~]# vim /etc/keepalived/conf.d/vvrp.conf
[root@KA1 ~]# systemctl restart keepalived.service

image-20250728133500955

image-20250728133941495

企业应用实例

1.抢占模式和非抢占模式

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色;如果网络波动这样会使vip在KA主机中来回漂移,造成网络抖动。

非抢占模式

高优先级主机恢复后,并不会抢占低优先级主机的master角色

image-20250728144910029

测试结果是当原设备down后,VIP会转移到新设备上,当原设备恢复后,VIP不会转移回去只有当新设备down后才会把VIP转移回原设备

抢占延迟模式

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

image-20250728151029301

测试:停止KA1的keepalived,先让KA2为主,再把KA1的keepalived打开,等待10s可观察到KA1抢占回主设备

image-20250728161715489

image-20250728161751279

2.VIP单播配置

默认keepalived主机之间利用多播相互通告消息,不能跨网段通信,如果需要跨网段实现主备需要启用单播模式

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

[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
......
vrrp_instance haha {
    state MASTER
    interface eth0
    virtual_router_id 91
    priority 100
   # preempt_delay 10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
    unicast_src_ip 172.25.254.50
    unicast_peer {          #如果是三主架构以上就可以指定多个单播IP
        172.25.254.60
    }
......
[root@KA2 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
[root@KA2 ~]# systemctl restart keepalived.service

image-20250728162739782

#通过抓包来测试
#这个命令用于抓取从源 IP 172.25.254.50 发送到目标 IP 172.25.254.60 的所有流量
[root@KA1 ~]# tcpdump -i eth0 -nn src 172.25.254.50 and dst 172.25.254.60
[root@KA2 ~]# tcpdump -i eth0 -nn src 172.25.254.60 and dst 172.25.254.50

image-20250728163507445

3.通知脚本配置-邮箱通知

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

原理:keepalived+邮箱发送脚本

  • postfix属于邮件传输代理,其主要作用是负责邮件的转发、接收以及路由工作。

  • s-nail 是一款邮件用户代理,使用户能够阅读和发送邮件。

#安装邮件发送与代理工具
[root@KA1 ~]# dnf install s-nail postfix -y
#编辑SMTP服务器设置(用于发送邮件)
[root@KA1 ~]# vim /etc/mail.rc
set smtp=smtp.163.com
set smtp-auth=login
set smtp-auth-user=fjwyyyorg@163.com
set smtp-auth-password=YYhdJqnpVpecnjGb     #打开邮箱设置查找
set from=fjwyyyorg@163.com
set ssl-verify=ignore
​
[root@KA1 ~]# systemctl enable --now postfix
#发送测试文件
[root@KA1 ~]# echo hello | mailx -s test fjwyyyorg@163.com
#查看邮件队列,来确认邮件是否发送成功
[root@KA1 ~]# mailq
#创建存放脚本目录并编辑实验脚本
[root@KA1 ~]# mkdir /etc/keepalived/script/
#编辑通知脚本内容
[root@KA1 ~]# vim /etc/keepalived/script/mail.sh
#!/bin/bash
mail_dest='fjwyyyorg@163.com'
​
mail_send()
{
    mail_subj="$HOSTNAME to be $1 vip 转移"
    mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
    echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
    master)
    mail_send master
    ;;
    backup)
    mail_send backup
    ;;
    fault)
    mail_send fault
    ;;
    *)
    exit 1
    ;;
esac
[root@KA1 ~]# chmod +x /etc/keepalived/script/mail.sh
#开启keepalived的脚本调用功能
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
......
    enable_script_security
    script_user root
}
......
vrrp_instance haha {
......
    notify_master "/etc/keepalived/scripts/waring.sh master"
    notify_backup "/etc/keepalived/scripts/waring.sh backup"
    notify_fault "/etc/keepalived/scripts/waring.sh fault"
}
......
    
[root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
[root@KA1 ~]# systemctl restart keepalived.service
#同理配置KA2

image-20250728174139659

image-20250728173859626

测试

[root@KA1 ~]# systemctl stop keepalived.service     #模拟故障暂停主设备的keepalived,从设备就会变为master
[root@KA1 ~]# systemctl start keepalived.service    #主设备重新上线,抢占回VIP

4.双主架构

master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

image-20250728181558725

image-20250728181637441

重启测试

image-20250728181732086

当有一方的主设备挂了后,业务会转移到另一方的主设备上,实现高可用,以防访问业务丢失

image-20250728182050245

5.实现LVS的高可用性

单主架构整合LVSDR模式

#RS1,RS2下载nginx,生成测试文件
[root@RS1 ~]# dnf install nginx -y
[root@RS2 ~]# dnf install nginx -y
[root@RS1 ~]# echo RS1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@RS2 ~]# echo RS2 - 172.25.254.20 > /usr/share/nginx/html/index.html
#配置VIP在换回接口上
[root@RS1 ~]# ip a a 172.25.254.100/32 dev lo
[root@RS2 ~]# ip a a 172.25.254.100/32 dev lo
#不响应客户端访问VIP请求
[root@RS1 ~]# cat /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@RS2 ~]# cat /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
​
#配置keepalived
[root@KA1 ~]# dnf install ipvsadm -y
[root@KA2 ~]# dnf install ipvsadm -y
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf

KA1与KA2都要配置

image-20250728212856645

从设备上同理,以上在keepalived的lvs配置谁有VIP谁生效

测试时可以通过客户端访问VIP的同时,停止主设备的keepalived查看访问情况不会中断,因为VIP会偏移到从设备上

双主架构实现httpd和mysql服务调度

#再添加多一个VIP给mysql服务使用
[root@RS1 ~]# ip a a 172.25.254.200/32 dev lo
[root@RS2 ~]# ip a a 172.25.254.200/32 dev lo
#下载mysql
[root@RS1 ~]# dnf install mariadb-server -y
[root@RS2 ~]# dnf install mariadb-server -y
​
[root@RS1 ~]# systemctl enable --now mariadb
[root@RS2 ~]# systemctl enable --now mariadb
#创建用户并授权
[root@RS1 ~]# mysql -e "create user fjw@'%' identified by 'fjw';"
[root@RS1 ~]# mysql -e "grant select on *.* to fjw@'%';"
[root@RS2 ~]# mysql -e "create user fjw@'%' identified by 'fjw';"
[root@RS2 ~]# mysql -e "grant select on *.* to fjw@'%';"
#添加测试参数
[root@RS1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[root@RS2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
#编辑配置文件
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf

添加测试参数

image-20250727233809499

image-20250727233927339

KA1与KA2都要添加

image-20250728214338155

image-20250728215433496

测试

mysql -ulee -plee -h172.25.254.200 -e 'select @@server_id'

image-20250728222100130

6.VRRP Script实现全能高可用性

VRRP Script 配置

分两步实现

  • 定义脚本

    • vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。

    • 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

  • 调用脚本

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

定义 VRRP script

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

1.实验环境

安装haproxy

[root@KA1 ~]# dnf install haproxy-2.4.22-4.el9.x86_64  -y
[root@KA2 ~]# dnf install haproxy-2.4.22-4.el9.x86_64  -y

开启内核参数

由于haproxy监听的是存在VIP的端口,要监听不存在VIP的端口需要开启内核参数

[root@KA1 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf
[root@KA2 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf
​
[root@KA1 ~]# sysctl -p
[root@KA2 ~]# sysctl -p

配置haproxy

[root@KA1+2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
    bind 172.25.254.100:80
    mode http
    server web1 172.25.254.10:80 check
    server web2 172.25.254.20:80 check
    
[root@KA1+2 ~]# systemctl enable --now haproxy.service

可以测试一下是否负载成功

image-20260129154315813

2.利用案例理解vrrp_script

编写测试脚本

[root@KA1 ~]# vim /etc/keepalived/scripts/test.sh
#!/bin/bash
[ ! -f "/mnt/fjw" ]     #文件存在时返回值为1,不存在为0
[root@KA1 ~]# chmod +x /etc/keepalived/scripts/test.sh

KA1配置vrrp_script

vrrp_script check_fjw {
    script "/etc/keepalived/scripts/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
    user root
}
​
​
vrrp_instance WEB_VIP {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
    track_script {
        check_fjw           #调用脚本
    }
}
​
[root@KA1 ~]# systemctl restart keepalived.service

image-20250728222715290

测试

建立文件之前VIP还在KA1

image-20260129155038556

建立文件

[root@KA1 ~]# touch /mnt/fjw

等待数秒检测,VIP漂移到KA2上

image-20260129155130778

3.keepalived + haproxy

编辑haproxy检测脚本

[root@KA1 ~]# vim /etc/keepalived/scripts/haproxy_check.sh
#!/bin/bash
killall -0 haproxy &> /dev/null     #判断haproxy进程是否存在
[root@KA1 ~]# chmod +x /etc/keepalived/scripts/haproxy_check.sh

KA1配置vrrp_scrpit并调用

[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
    script "/etc/keepalived/scripts/haproxy_check.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
    user root
}
​
​
vrrp_instance WEB_VIP {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
    track_script {
        check_haproxy
    }
}
​
[root@KA1 ~]# systemctl restart keepalived.service

测试

通过关闭和开启haproxy来观察vip是否迁移

未停止haproxy前

image-20260129160307245

停止haproxy测试

image-20260129160351808

4.keepalived+haproxy双主架构

在KA1与KA2的haproxy都配置好负载

[root@KA1 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
  bind 172.25.254.100:80
  mode http
  server web1 172.25.254.10:80 check
  server web2 172.25.254.20:80 check
​
listen dbcluster
    bind 172.25.254.200:3306
    mode tcp
​
    server db1 172.25.254.10:3306 check
    server db2 172.25.254.20:3306 check
[root@KA1 ~]# systemctl restart haproxy.service

在KA2也配置vrrp_script调用

[root@KA2 ~]# /etc/keepalived/scripts/haproxy_check.sh
[root@KA2 ~]# chmod +x /etc/keepalived/scripts/haproxy_check.sh
​
[root@KA2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
    script "/etc/keepalived/scripts/haproxy_check.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
    user root
}
......
vrrp_instance DB_VIP {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    preempt delay 5
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      172.25.254.200/24 dev eth0 label eth0:1
    }
    track_script {
        check_haproxy
    }
}
​
[root@KA2 ~]# systemctl restart keepalived.service

测试

[root@KA2 ~]# systemctl stop haproxy.service

停止haproxy后查看KA1是否有VIP200

更多推荐