Keepalived 原理及配置(高可用)

一、Keepalived 原理

  • keepalived 基于 VRRP(虚拟路由冗余协议)实现高可用。

  • 核心原理是通过竞选机制在多台服务器(主 / 备节点)中选举出一台主节点承担服务,同时备节点持续监控主节点状态:主节点正常时,通过组播发送 VRRP 通告消息宣告存活,独占虚拟 IP(VIP)对外提供服务;

  • 当主节点故障(如服务中断、网络异常),备节点因超时未收到通告,会触发重新竞选,优先级最高的备节点升级为主节点并接管 VIP,实现服务无缝切换,确保业务不中断。

  • 此外,keepalived 还支持健康检查(如检测端口、URL 状态),可更精准判断服务可用性。

VRRP 原理

  • VRRP(虚拟路由冗余协议)是一种实现路由冗余的协议,核心是通过将多台物理路由器组成一个 "虚拟路由器",对外提供统一的虚拟 IP(VIP)和虚拟 MAC 地址,避免单点故障。

  • 工作时,虚拟路由器内的设备通过优先级竞选主 / 备角色:优先级最高的成为主路由器,承担数据包转发任务,并定期发送 VRRP 通告消息(组播)宣告存活;

  • 备份路由器则监听通告,若超时未收到主路由器消息(判定主节点故障),则触发重新竞选,优先级最高的备份节点升级为主路由器,接管 VIP 和虚拟 MAC,继续提供路由服务,整个过程对客户端透明,确保网络持续可用。


二、Keepalived 日常配置

2.1.Keepalived 日志独立

bash 复制代码
vim /etc/sysconfig/keepalived 
########
KEEPALIVED_OPTIONS="-D -S 6"
########
​
vim /etc/rsyslog.conf
########
local7.*                                                /var/log/boot.log
local6.*                                                /var/log/keepalived.log     # 添加此条
########
​
systemctl restart rsyslog.service
systemctl restart keepalived.service 
​
# 测试:查看新日志文件,有内容则实验成功
cat /var/log/keepalived.log

2.2.Keepalived 子配置文件

bash 复制代码
vim /etc/keepalived/keepalived.conf 
######
include /etc/keepalived/conf.d/*.conf           # 在主配置文件添加此条,表示包含 conf.d 目录下 .conf 结尾的文件
######
​
# 检查语法
keepalived -t -f /etc/keepalived/keepalived.conf 
​
# 重启服务
systemctl restart keepalived.service 

三、Keepalived 模式配置

3.1.Keepalived 单主模式

实验准备:两台 keepalived 主机,两台 rs 主机,一台 client 主机

  • ka-master 主机:192.168.67.100

  • ka-slave 主机:192.168.67.200

  • rs1主机:192.168.13.10

  • rs2 主机:192.168.13.20

keepalived 主机配置

bash 复制代码
# 时间同步
# 100 作为服务vim /etc/chrony.conf端,200 作为客户端
# 服务端配置(100)
vim /etc/chrony.conf
...
allow 192.168.67.0/24               # 开启服务端允许 67 网段连接本机
...
systemctl restart chronyd.service 
​
#客户端配置(200)
vim /etc/chrony.conf 
...
server 192.168.67.100 iburst
...
systemctl restart chronyd.service 
​
# 客户端测试:查看时间同步结果,显示 ^* 则同步成功
chronyc sources -v
bash 复制代码
# 安装 keepalived 并配置
dnf install keepalived -y
vim /etc/keepalived/keepalived.conf
##################
...
! Configuration File for keepalived
​
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   # vrrp_strict
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44
}
vrrp_instance VI_1 {
    state MASTER                # slave 主机设置为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                # 优先级,slave 主机设置为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
...
# 其他都注释掉
##################
​
# 重启服务
systemctl restart keepalived.service
systemctl enable --now keepalived.service
​
# 测试:在优先级高的主机上查看 VIP
ifconfig
bash 复制代码
# 查看组播情况
tcpdump -i eth0 -nn host 224.0.0.44

master 的主机会发送组播消息,告诉 slave 的主机自己存活,如果 master 的主机故障,则会出现 VIP 飘逸到 slave 的主机。

如果 master 主机恢复运行,VIP 会重新漂移到 master 主机,因为 master 主机的优先级高于 slave 主机。

问题:VIP 反复飘逸,会导致网络波动。

所以产生了非抢占模式。

3.2.Keepalived 非抢占模式

在抢占模式的基础上,修改 Keepalived 主机配置文件

bash 复制代码
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {
    state BACKUP                # 两个主机的 state 都需要是 BACKUP,因为非抢占模式没有主备之分
    interface eth0
    virtual_router_id 51
    priority 100                # 优先级,另一台主机设置为 80
    nopreempt                   # 在抢占模式的基础上,添加此条,实现非抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
#######

测试

bash 复制代码
systemctl restart keepalived.service
bash 复制代码
# 停止 master 主机服务
# 发生 VIP 飘逸
systemctl stop keepalived.service
bash 复制代码
# 再次重启 master 服务,VIP 不发生飘逸
# master 优先级高于 slave 主机,但是服务恢复后,不发生 VIP 抢占
systemctl start keepalived.service
# VIP 仍然在 slave 上
复制代码

非抢占模式弊端:如果 slave 主机的性能没有 master 主机好,那么让 slave 注意一直承载 VIP 会发生性能瓶颈,所以出现了延迟抢占模式。

3.3.Keepalived 延迟抢占模式

在抢占模式的基础上,修改 Keepalived 主机配置文件

bash 复制代码
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {
    state BACKUP                # 延迟抢占模式两台主机都为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                # slave 主机优先级 80
    preempt_delay 10            # 延迟时间配置,默认时间单位 s,不用加 s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
#######

测试:延迟抢占模式,master 主机故障,VIP 会飘逸到 slave 主机,如果 master 主机恢复 VIP 会在设置的延迟抢占时间完毕后抢占 VIP。

bash 复制代码
systemctl stop keepalived.service 

master 没有 VIP,VIP 漂移到 slave 上。

10 s 后 VIP 会飘逸回 master。

3.4.Keepalived 单播模式

因为 Keepalived 的心跳检测默认是发送组播的形式保活,会造成网络拥堵,所以需要配置单播模式,减少网络流量。

bash 复制代码
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    preempt_delay 10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
    unicast_src_ip 192.168.67.100           # 本机 IP,注意:两台主机需按需配置
    unicast_peer {
        192.168.67.200                      # 对端主机 IP,注意:两台主机需按需配置
    }
}
#######

测试

bash 复制代码
# 在承载 vIP 的主机上查看单播情况
tcpdump -i eth0 -nn src host 192.168.67.100 and dst 192.168.67.200

3.5.Keepalived 邮件告警

Keepalived 下载软件

注意:Keepalived 主机的主机名要是域名的模式,这样发邮件才不会被卡住。

bash 复制代码
# 配置主机名
hostnamectl set-hostname ka-master.zyz.org
​
# 下载软件
dnf install s-nail sendmail -y
​
vim /etc/mail.rc
######
set from=zhaoyz0911@163.com
set smtp=smtp.163.com
set smtp-auth-user=zhaoyz0911@163.com
set smtp-auth-password=QXbQYU3c48EWe8Ch         # 此验证码要到邮箱里开启 POP3 并获得
set smtp-auth=login
set ssl-verify=ignore
######
​
systemctl restart sendmail.service
netstat -antlupe | grep 25
bash 复制代码
# 测试邮件是否可以发出
echo hello | mailx -s test zhaoyz0911@163.com

邮箱收到此邮件

bash 复制代码
vim /etc/keepalived/mail.sh
######
#!/bin/bash
mail_dest='zhaoyz0911@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
######
​
chmod +x /etc/keepalived/mail.sh
bash 复制代码
# 修改 Keepalived 配置文件,添加 keepalived 的状态变化时,可以自动触发脚本的功能
vim /etc/keepalived/keepalived.conf 
######
! Configuration File for keepalived
​
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   # vrrp_strict
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44
   enable_script_security               # 启用脚本安全机制,限制健康检查脚本的执行权限
   script_user root                     # 指定健康检查脚本的执行用户为 root
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    preempt_delay 10
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
    unicast_src_ip 192.168.67.100
    unicast_peer {
        192.168.67.200
    }
    notify_master "/etc/keepalived/mail.sh master"      # 当当前节点从其他状态切换为 master 状态时触发
    notify_backup "/etc/keepalived/mail.sh backup"      # 当当前节点从其他状态切换为 backup 状态时触发
    notify_fault "/etc/keepalived/mail.sh faild"        #当前节点因故障进入 fault 状态时触发
}
######

测试

bash 复制代码
systemctl restart keepalived.service

收到 VIP 转移的邮件,试验成功

3.6.Keepalived 双主模式

Keepalived 主机配置

bash 复制代码
! Configuration File for keepalived
​
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44
}
vrrp_instance WEB_VIP {
    state MASTER                    # 第二台 Keepalived 主机改为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                    # 第二台 Keepalived 主机改为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
vrrp_instance DB_VIP {
    state BACKUP                    # 第二台 Keepalived 主机改为 MASTER
    interface eth0
    virtual_router_id 52        
    priority 80                     # 第二台 Keepalived 主机改为 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.160/24 dev eth0 label eth0:1
    }
}

重启服务,测试

bash 复制代码
systemctl restart keepalived.service

关闭一台 Keepalived 主机,VIP 自动漂移到第二台 Keepalived 主机,则有两个 VIP。

bash 复制代码
systemctl stop keepalived.service 

四、Keepalived 高可用

4.1.Keepalived + LVS - DR 单主模式

实验准备:关闭所有主机的 SElinux 和 防火墙,全都为 NAT 模式网卡

  • client:192.168.67.123

  • ka-master:192.168.67.100、VIP:192.168.67.150

  • ka-slave:192.168.67.200、VIP:192.168.67.150

  • rs1:192.168.67.10、VIP:192.168.67.150

  • rs2:198.168.67.20、VIP:192.168.67.150

后端 rs 配置

配置 nginx 服务、配置虚拟网卡添加 VIP、arp 抑制

bash 复制代码
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html       # 另一个主机配置自己的 IP 作为默认发布文件内容
systemctl enable --now nginx
curl localhost
bash 复制代码
# 两个主机都需要配置 VIP
nmcli connection add type dummy ifname rstest ipv4.method manual ipv4.addresses 192.168.67.150/32 connection.autoconnect yes
nmcli connection up dummy-rstest
ip a
bash 复制代码
# arp 抑制
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf 
echo net.ipv4.conf.rstest.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf 
echo net.ipv4.conf.rstest.arp_announce = 2 >> /etc/sysctl.conf 
sysctl -p

Keppalived 主机配置

安装 ipvsadm 工具、配置 Keepalived 实现后端检测和负载均衡

bash 复制代码
yum install ipvsadm -y

修改 Keepalived 配置文件

bash 复制代码
vim /etc/keepalived/keepalived.conf
########
! Configuration File for keepalived
​
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44             # 组播
}
vrrp_instance WEB_VIP {
    state MASTER                            # 另一个主机设置为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                            # 另一个主机设置为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
virtual_server 192.168.67.150 80 {          # 类似于 ipvsadm -A 调度主机
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    real_server 192.168.67.10 80 {          # 类似于 ipvsadm -a 后端主机
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.67.20 80 {          # 类似于 ipvsadm -a 后端主机
        weight 1
        TCP_CHECK {
            connect_timeout 2
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
########
​
systemctl restart keepalived.service 

验证:查看 VIP

在持有 VIP 的主机上查看 ipvs 策略

客户端测试:轮询结果

4.2.Keepalived + LVS - DR 双主模式

实验准备:关闭所有主机的 SElinux 和 防火墙,全都为 NAT 模式网卡

  • client:192.168.67.123

  • ka-master:192.168.67.100/24、VIP1:192.168.67.150/24、VIP2:192.168.67.160/24

  • ka-slave:192.168.67.200/24、VIP1:192.168.67.150/24、VIP2:192.168.67.160/24

  • rs1:192.168.67.10/24、VIP1:192.168.67.150/32、VIP2:192.168.67.160/32

  • rs2:198.168.67.20/24、VIP1:192.168.67.150/32、VIP2:192.168.67.160/32

(VIP1 是提供 Nginx 服务的 VIP,VIP2 是提供 Mariadb 服务的 VIP)

后端 rs 配置

配置 nginx 服务:安装软件、默认发布文件、测试

配置虚拟网卡添加 VIP、arp 抑制

bash 复制代码
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html       # 另一个主机配置自己的 IP 作为默认发布文件内容
systemctl enable --now nginx
curl localhost
bash 复制代码
# 两个主机都需要配置 VIP
nmcli connection add type dummy ifname rstest ipv4.method manual ipv4.addresses 192.168.67.150/32 connection.autoconnect yes
nmcli connection add type dummy ifname dbtest ipv4.method manual ipv4.addresses 192.168.67.160/32 connection.autoconnect yes
nmcli connection up dummy-rstest
nmcli connection up dummy-dbtest
ip a
bash 复制代码
# arp 抑制
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf 
echo net.ipv4.conf.rstest.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf 
echo net.ipv4.conf.rstest.arp_announce = 2 >> /etc/sysctl.conf 
sysctl -p

配置 Mariadb 服务:安装软件、配置 server-id、授权用

bash 复制代码
# 安装 mariadb
yum install mariadb-server  -y
​
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
...
server-id=10        # 添加此行,注意两个主机的 id 需要不一致
...
​
systemctl enable --now mariadb
​
mysql -e "grant all on *.* to zyz@'%' identified by 'zyz'"      # 添加可远程登录的用户
​
# 测试:远程登录 mysql
mysql -uzyz -pzyz -h192.168.13.10
mysql -uzyz -pzyz -h192.168.13.20

测试 mysql server_id

Keppalived 主机配置

安装 ipvsadm 工具、配置 Keepalived 实现后端检测和负载均衡

bash 复制代码
yum install ipvsadm -y

修改 Keepalived 配置文件:双主模式,需要配置两个 vrrp_instance 和两个 virtual_server,一个提供 Web 服务,一个提供 Mysql 服务。

bash 复制代码
vim /etc/keepalived/keepalived.conf
########
! Configuration File for keepalived
​
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44                 # 组播
}
vrrp_instance WEB_VIP {
    state MASTER                                # 另一个主机设置为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                                # 另一个主机设置为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
}
vrrp_instance DB_VIP {
    state BACKUP                                # 另一个主机设置为 MASTER
    interface eth0
    virtual_router_id 52
    priority 80                                 # 另一个主机设置为 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.160/24 dev eth0 label eth0:1
    }
}
virtual_server 192.168.67.150 80 {              # 提供 Web 服务的 VIP,端口 80
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
​
    real_server 192.168.67.10 80 {              # 提供 Web 服务的 RS1,端口80
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.67.20 80 {              # 提供 Web 服务的 RS2,端口80
        weight 1
        TCP_CHECK {
            connect_timeout 2
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
virtual_server 192.168.67.160 3306 {            # 提供 Mysql 服务的 VIP,端口 3306
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
​
    real_server 192.168.67.10 3306 {            # 提供 Mysql 服务的 RS1,端口 3306
        weight 1
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 5
            connect_port 3306
        }
    }
    real_server 192.168.67.20 3306 {            # 提供 Mysql 服务的 RS2,端口 3306
        weight 1
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 5
            connect_port 3306
        }
    }
}
########
​
systemctl restart keepalived.service 

验证:查看 VIP

查看 ipvs 策略,两个 Keepalived 主机都可查到

客户端测试:Web 结果

客户端测试:Mysql 结果

4.3.Keepalived + HAProxy(Vrrp)脚本检测修改优先级

实验准备:关闭所有主机的 SElinux 和 防火墙,全都为 NAT 模式网卡

  • client:192.168.67.123

  • ka-master:192.168.67.100/24、VIP:192.168.67.150/24

  • ka-slave:192.168.67.200/24、VIP:192.168.67.150/24

  • rs1:192.168.67.10/24

  • rs2:198.168.67.20/24

Haproxy 实现后端检测和流量分发,Keepalived 实现 HAProxy 的健康检测,如果 HAProxy 故障,通过 VRRP 健康检测脚本实现动态改变优先级,实现 VIP 的漂移。Keepalived + HAProxy 模式只能使用抢占模式和延迟抢占模式,不适用于非抢占模式。

后端 rs 配置

配置 nginx 服务:安装软件、默认发布文件、测试

bash 复制代码
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html       # 另一个主机配置自己的 IP 作为默认发布文件内容
systemctl enable --now nginx
curl localhost

Keepalived 主机配置 HAProxy 服务

两个 Keepalived 主机都需配置 HAProxy 服务,内容相同。

bash 复制代码
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
# 除以下内容都注释掉
##########
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
listen webcluster
    bind    *:80
    mode    http
    balance roundrobin
    server web1 192.168.67.10:80 check inter 3 fall 2 rise 2
    server web2 192.168.67.20:80 check inter 3 fall 2 rise 2
#############

Keepalived 主机配置 Keepalived 服务

bash 复制代码
mkdir /etc/keepalived/scrips/
​
cat >> /etc/keepalived/scrips/haproxy.sh << EOF
#!/bin/bash
killall -0 haproxy &> /dev/null
EOF
​
chmod +x /etc/keepalived/scrips/haproxy.sh 
​
​
vim /etc/keepalived/keepalived.conf
#############
! Configuration File for keepalived
global_defs {
   notification_email {
     haha@haha.org
   }
   notification_email_from haha@haha.org
   smtp_server 127.0.0.0
   smtp_connect_timeout 30
   router_id ka-master
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 1
   vrrp_gna_interval 1
   vrrp_mcast_group4 224.0.0.44
   enable_script_security           # 启用脚本安全检查机制
   script_user root                 # 指定执行脚本时使用的用户身份为 root
}
vrrp_script TEST_CHECK {                        # 定义健康检查脚本
    script "/etc/keepalived/scrips/haproxy.sh"  # 脚本路径
    interval 1                                  # 脚本执行间隔,每1秒检查一次
    weight -30                                  # 脚本返回值非 0 时,当前节点优先级减少30
    fall 2                                      # 连续失败2次后,判定服务异常
    rise 2                                      # 连续成功2次后,判定服务恢复正常
    timeout 2                                   # 脚本执行超时时间,超过2秒视为执行失败
}
vrrp_instance WEB_VIP {
    state MASTER                                # 第二台主机配置为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                                # 第二台主机配置为 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.67.150/24 dev eth0 label eth0:0
    }
    track_script {                              # 关联健康检查脚本
        TEST_CHECK                              # 引用上面定义的 TEST_CHECK 脚本,监控haproxy 状态
    }
    unicast_src_ip 192.168.67.100               # 单播配置:源 IP,第二台主机配置为本机 IP
    unicast_peer {
        192.168.67.200                          # 单播配置:目标 IP,第二台主机配置为对方 IP
    }
}
#############
​
echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf 
sysctl -p
​
systemctl start keepalived.service 
systemctl enable --now keepalived.service 
systemctl start haproxy
systemctl enable --now haproxy

测试

持有 VIP 的主机查看单播情况:可以看到 vrid 51 的优先级是 100.

在此主机上关闭 HAProxy 服务,Keepalived 检测到 HAProxy 故障,运用脚本降低此主机的优先级为 70。

再开启此主机上的 HAProxy 服务,可以看到优先级恢复为 100。

在以上的操作过程中,client 客户端访问 VIP,Web 服务不停滞,客户端感受不到服务的故障,实现了高可用。


五、总结

  1. LVS + Keepalived

    • LVS 本身是内核态的负载均衡模块(工作在 TCP/IP 协议栈的传输层),但它的管理和后端健康检查依赖 Keepalived实现。

    • Keepalived 不仅负责 LVS 的主备高可用(VIP 漂移),还内置了对后端 RS 的健康检查(如 ICMP、TCP 端口检测),并能动态调整 LVS 的路由表(通过 ipvsadm 接口)。

    • 简单说:Keepalived 是 "大脑",既管高可用,又管后端检测和指挥 LVS 做流量分发;LVS 更像 "执行器",只负责按 Keepalived 的规则转发流量。

  2. HAProxy + Keepalived

    • HAProxy 是用户态的负载均衡软件(工作在应用层),自带完整的流量分发逻辑(支持 HTTP/HTTPS 等七层规则)和后端 RS 健康检查(更精细,如 URL 返回码检测)。

    • 此时 Keepalived 的作用被简化:仅负责 HAProxy 的主备高可用(监控 HAProxy 进程状态,通过优先级调整实现 VIP 漂移),不参与流量分发和后端检测。

    • 简单说:HAProxy 是 "全能选手",自己管流量分发和后端检测;Keepalived 只当 "保镖",确保 HAProxy 本身不单点故障。

底层核心差异: LVS 与 Keepalived 的耦合度更高(Keepalived 原生支持 LVS 配置),而 HAProxy 是独立的负载均衡器,Keepalived 仅为其提供高可用保障。这种差异导致 LVS 方案更适合四层高性能场景,HAProxy 方案更适合七层复杂规则场景。

相关推荐
wanhengidc15 小时前
云手机运行是否消耗自身流量?
运维·科技·安全·游戏·智能手机
wanhengidc16 小时前
云手机将要面临的挑战有哪些?
运维·网络·安全·游戏·智能手机
岚天start16 小时前
网络计算工具ipcalc详解
linux·运维·网络·网关·广播地址·掩码·ipcalc
SH11HF16 小时前
Jenkins调用ansible部署lnmp平台
运维·ansible·jenkins
小薛博客16 小时前
23、Jenkins容器化部署Vue应用
运维·vue.js·jenkins
xiaozhenghahaha16 小时前
Web相关知识(草稿)
运维·nginx
格林威17 小时前
Linux使用-Linux系统管理
linux·运维·服务器·深度学习·ubuntu·计算机视觉
网硕互联的小客服17 小时前
如何配置安全的 SFTP 服务器?
运维·服务器·安全
码农101号17 小时前
Linux 网络安全运维与文件权限控制和日志操作
运维·web安全·云计算
Gss77719 小时前
Ansible 项目管理核心要点总结
linux·运维·ansible