Keepalived 是一个用于实现高可用性(HA)和负载均衡的开源工具,用 C 编写的路由软件,特别适用于 Linux 服务器。它通常与 HAProxy 等负载均衡器结合使用,以确保服务的高可用性。Keepalived 主要通过 VRRP(虚拟路由冗余协议)来实现虚拟 IP 地址的故障转移。官网

Keepalived 的主要功能

  • VRRP(Virtual Router Redundancy Protocol):

    • 通过 VRRP 协议实现高可用性,多个服务器可以共享一个虚拟 IP 地址,保证在主服务器出现故障时,备用服务器能够快速接管虚拟 IP,继续提供服务。
  • 健康检查:

    • Keepalived 可以配置健康检查脚本,定期检测服务的状态。如果检测到服务故障,可以自动进行故障转移。
  • 负载均衡:

    • Keepalived 也可以实现简单的负载均衡,通过配置不同的调度算法将流量分配到多个后端服务器。

工作原理

  • VRRP 是一种网络协议,用于在多个路由器之间实现冗余,以确保当主路由器出现故障时,备用路由器可以迅速接管。Keepalived 使用 VRRP 协议实现虚拟 IP 地址的故障转移。

    • 虚拟路由器:由多个物理路由器组成的一个虚拟路由器组。这个组共享一个虚拟 IP 地址(VIP),这个 VIP 是客户端用来访问服务的地址。
    • 主路由器(Master):负责处理 VIP 上的所有流量。
    • 备用路由器(Backup):处于待命状态,当主路由器发生故障时,备用路由器之一会接管 VIP。

Keepalived 的工作流程

  • 初始化:当 Keepalived 启动时,所有配置的 VRRP 实例都会初始化。每个实例会根据配置文件设置* 初始状态(Master 或 Backup)、优先级和虚拟 IP 地址。
  • 发送广告报文:主路由器定期发送 VRRP 广告报文,告知网络中的其他路由器它是主路由器。如果其他路由器在一定时间内没有收到广告报文,它们会认为主路由器失效。
  • 健康检查:Keepalived 会定期运行健康检查脚本。如果主路由器的健康检查失败,Keepalived 会将其状态切换为 Backup,并停止发送广告报文。
  • 故障转移:当备用路由器检测到主路由器的广告报文丢失时,它会根据优先级选举一个新的主路由器,并开始发送广告报文,同时接管虚拟 IP 地址。
  • 恢复:如果主路由器恢复正常,它会重新加入 VRRP 实例。如果它的优先级高于当前的主路由器,它会重新夺回主路由器的角色。

安装使用

双节点下载

apt install -y keepalived
systemctl enable --now keepalived

实验环境;Ubuntu2404

节点 IP
master 192.168.200.190
node 192.168.200.195

主/备模式(同一子网)

官网文档
这种模式下,有一个主节点(Active)和一个或多个备节点(Passive)。只有主节点处理流量,当主节点出现故障时,备节点接管。

特点:

  • 简单易配置
    故障转移速度快
    资源利用率较低,因为备节点在正常情况下处于待命状态

  • 自带配置文件模板

 cat /etc/keepalived/keepalived.conf.sample
  • 配置keepalived.conf
vim /etc/keepalived/keepalived.conf
  • 只需要配置全局和vrrp示例即可
root@master:~# 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
}

vrrp_instance VI_1 {
    state MASTER
    #设置当前节点的状态,可以是 MASTER 或 BACKUP。MASTER 表示当前节点是主节点
    interface eth0
    #指定用于 VRRP 的网络接口,虚拟机为ens33
    virtual_router_id 51
    #设置 VRRP 实例的唯一标识符。这个 ID 在同一 VRRP 实例中必须唯一
    priority 100
    #设置节点的优先级,值范围是 1 到 254。优先级较高的节点更有可能成为主节点
    advert_int 1
    #设置 VRRP 广告的间隔时间(秒)。主节点每隔此时间广播一次 VRRP 广告
    authentication {
    #配置 VRRP 实例的认证信息,以确保只有授权的节点能参与 VRRP 选举
        auth_type PASS
        #auth_type: 认证类型,这里使用 PASS(简单密码认证)
        auth_pass 1111
        #auth_pass: 认证密码
    }
    virtual_ipaddress {
    #配置要绑定到虚拟路由器的 IP 地址。所有参与此 VRRP 实例的节点共享这些 IP 地址
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
  • 开始配置前需要开启参数;允许将非本地 IP 地址绑定到本地网络接口上。这个参数对于使用虚拟 IP 地址(VIP)和实现高可用性(如 Keepalived)特别重要
echo "net.ipv4.ip_nonlocal_bind=1" |  tee -a /etc/sysctl.conf
sysctl -p
  • 开始配置主节点
root@master:~# 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
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.199/24
    }
}
systemctl restart keepalived
  • 配置备用节点
root@node:~# 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_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.199/24
    }
}
systemctl restart keepalived
  • 主节点验证查看
root@master:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:01 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.190/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.199/24 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5f:fb01/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:0b brd ff:ff:ff:ff:ff:ff
    altname enp2s2
    inet6 fe80::20c:29ff:fe5f:fb0b/64 scope link
       valid_lft forever preferred_lft forever
  • 虚拟机VIP192.168.200.199已经生成
root@master:~# systemctl status keepalived
● keepalived.service - Keepalive Daemon (LVS and VRRP)
     Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; preset: enabled)
     Active: active (running) since Sun 2024-07-21 11:04:12 UTC; 32s ago
       Docs: man:keepalived(8)
             man:keepalived.conf(5)
             man:genhash(1)
             https://keepalived.org
   Main PID: 3590 (keepalived)
      Tasks: 2 (limit: 4556)
     Memory: 2.0M (peak: 2.1M)
        CPU: 49ms
     CGroup: /system.slice/keepalived.service
             ├─3590 /usr/sbin/keepalived --dont-fork
             └─3592 /usr/sbin/keepalived --dont-fork

Jul 21 11:04:26 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:28 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:30 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:32 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:33 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:34 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:38 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:40 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:43 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
Jul 21 11:04:44 master Keepalived_vrrp[3592]: (VI_1) received a 1 auth, expecting 0!
  • node节点ping
root@node:~# ping 192.168.200.199
PING 192.168.200.199 (192.168.200.199) 56(84) bytes of data.
64 bytes from 192.168.200.199: icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from 192.168.200.199: icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from 192.168.200.199: icmp_seq=3 ttl=64 time=1.55 ms
64 bytes from 192.168.200.199: icmp_seq=4 ttl=64 time=0.051 ms
^C
--- 192.168.200.199 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3083ms
rtt min/avg/max/mdev = 0.040/0.426/1.554/0.651 ms
  • 关闭master节点keepalived后查看
root@master:~# systemctl stop keepalived
root@master:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:01 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.190/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5f:fb01/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:0b brd ff:ff:ff:ff:ff:ff
    altname enp2s2
    inet6 fe80::20c:29ff:fe5f:fb0b/64 scope link
       valid_lft forever preferred_lft forever
  • IP由node节点接管
root@node:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:8b:b8:b3 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.195/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.199/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8b:b8b3/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:8b:b8:bd brd ff:ff:ff:ff:ff:ff
    altname enp2s2
    inet6 fe80::20c:29ff:fe8b:b8bd/64 scope link
       valid_lft forever preferred_lft forever
  • master节点恢复后再次接管,因为优先级高
root@master:~# systemctl restart keepalived
root@master:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:01 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.200.190/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.199/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5f:fb01/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5f:fb:0b brd ff:ff:ff:ff:ff:ff
    altname enp2s2
    inet6 fe80::20c:29ff:fe5f:fb0b/64 scope link
       valid_lft forever preferred_lft forever

但是这种情况下服务会中断一点时间,因为master节点恢复后备用节点将会把IP给主节点,而不是备用节点一直接管,用户会感到卡顿一下

主/备模式(跨网)

如果两台服务器不在同一子网,如(10.126.225.0/24 和 10.126.82.0/24),传统的 Keepalived + VRRP 可能无法直接使用(因为 VRRP 依赖二层广播)

改用 VRRP over Unicast(单播模式):如果两台服务器可以互相通信(即使不在同一子网),可以修改 Keepalived 配置,使用 单播(Unicast) 代替组播(Multicast)。

  • 配置主节点
vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER    # proxy01 用 MASTER,proxy02 用 BACKUP
    interface ens192  # 或 eth0,确保接口名正确
    unicast_peer {
        10.126.82.86   # proxy02 的 IP(proxy01 的配置)
        10.126.225.86  # proxy01 的 IP(proxy02 的配置)
    }
    virtual_router_id 51
    priority 101    # proxy01 高,proxy02 低(如 99)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.126.225.87/24  # VIP
    }
}
[root@proxy01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:85:3e:2a brd ff:ff:ff:ff:ff:ff
    inet 10.126.225.86/24 brd 10.126.225.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::306f:ffa5:1ff:704a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  • 配置从节点
vi /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state BACKUP    # proxy01 用 MASTER,proxy02 用 BACKUP
    interface eth0  # 或 eth0,确保接口名正确
    unicast_peer {
        10.126.82.86   # proxy02 的 IP(proxy01 的配置)
        10.126.225.86  # proxy01 的 IP(proxy02 的配置)
    }
    virtual_router_id 51
    priority 99    # proxy01 高,proxy02 低(如 99)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.126.225.87/24  # VIP
    }
}      
[root@proxy02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0c:da:41:1d:e0:ef brd ff:ff:ff:ff:ff:ff
    inet 10.126.82.86/24 brd 10.126.82.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::eda:41ff:fe1d:e0ef/64 scope link 
       valid_lft forever preferred_lft forever
  • 重启服务
systemctl restart keepalived
[root@proxy01 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2025-04-17 19:18:53 CST; 42min ago
  Process: 12810 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 12811 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─12811 /usr/sbin/keepalived -D
           ├─12812 /usr/sbin/keepalived -D
           └─12813 /usr/sbin/keepalived -D

Apr 17 19:18:55 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:18:55 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:18:55 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:18:55 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
Apr 17 19:19:00 proxy01 Keepalived_vrrp[12813]: Sending gratuitous ARP on ens192 for 10.126.225.87
  • 地址已生成
[root@proxy01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:85:3e:2a brd ff:ff:ff:ff:ff:ff
    inet 10.126.225.86/24 brd 10.126.225.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 10.126.225.87/24 scope global secondary ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::306f:ffa5:1ff:704a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@proxy01 ~]# 
  • 停止主节点测试,查看vip是否飘到从节点
[root@proxy01 ~]# systemctl stop keepalived
[root@proxy01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:85:3e:2a brd ff:ff:ff:ff:ff:ff
    inet 10.126.225.86/24 brd 10.126.225.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::306f:ffa5:1ff:704a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@proxy01 ~]# 
[root@proxy02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0c:da:41:1d:e0:ef brd ff:ff:ff:ff:ff:ff
    inet 10.126.82.86/24 brd 10.126.82.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.126.225.87/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::eda:41ff:fe1d:e0ef/64 scope link 
       valid_lft forever preferred_lft forever
[root@proxy02 ~]# 

脚本健康检测

场景:keepalived只有本身服务挂掉后才会触发切换,当keepalived和其他服务在同一节点上,例如haproxy,如果haproxy挂了,keepalived还在正常运行,则业务已经中断

  • 没有健康检测的情况
    Keepalived只检查自己是否存活
    HAProxy进程挂了,但Keepalived还在运行
    VIP不会漂移,用户请求依然发到故障节点
    结果:服务中断!❌

  • 有健康检测的情况
    Keepalived定期检查HAProxy状态
    检测到HAProxy故障 → 自动降低本机优先级
    VIP漂移到备用节点
    结果:服务不中断!✅

  • 安装服务

yum install -y haproxy keepalived
  • 创建健康检测脚本(双节点)
# 使用 systemctl 检测服务状态
cat > /etc/keepalived/check_haproxy.sh << 'EOF'
#!/bin/bash
# 使用systemctl检测haproxy服务状态
if systemctl is-active --quiet haproxy; then
    exit 0
else
    exit 1
fi
EOF

chmod +x /etc/keepalived/check_haproxy.sh
# 1. 确认脚本当前返回0(HAProxy运行中)
/etc/keepalived/check_haproxy.sh
echo "当前返回值: $?"
  • 主节点keepalived配置文件
vi  /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2      # 每2秒检查一次
    weight -20      # 检查失败时,优先级降低20
    fall 2          # 连续失败2次才判定失败
    rise 1          # 成功1次即恢复
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33              # 替换为你的网卡名
    virtual_router_id 51
    priority 100                # 主节点优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456        # 统一密码
    }
    virtual_ipaddress {
        192.168.200.99/24        # 替换为你的VIP
    }
    track_script {
        chk_haproxy             # 关联健康检查
    }
}
  • 从节点配置文件
! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP                # 区别在这里
    interface ens33
    virtual_router_id 51
    priority 90                 # 比主节点低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.200.99/24
    }
    track_script {
        chk_haproxy
    }
}
  • 启动服务
systemctl restart haproxy keepalived
  • 节点1查看
[root@redis01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:eb:95:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.100/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.99/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feeb:9544/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:eb:95:4e brd ff:ff:ff:ff:ff:ff
[root@redis01 ~]#
  • 停止服务验证
[root@redis01 ~]# systemctl stop haproxy
[root@redis01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:eb:95:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.100/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.99/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feeb:9544/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:eb:95:4e brd ff:ff:ff:ff:ff:ff
[root@redis01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:eb:95:44 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.100/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feeb:9544/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:eb:95:4e brd ff:ff:ff:ff:ff:ff
[root@redis01 ~]#
[root@redis02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f2:5e:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.101/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.99/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef2:5e88/64 scope link
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:f2:5e:92 brd ff:ff:ff:ff:ff:ff
[root@redis02 ~]#
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐