Keepalived 心跳通信模式&应用层监控

Keepalived 心跳通信模式

Keepalived 它通过 VRRP (Virtual Router Redundancy Protocol) 协议来实现负载均衡器或 Web 服务器的高可用性。Keepalived 支持两种心跳通信模式:组播模式和单播模式。

组播模式 (Multicast Mode)

  • 定义:在默认情况下,Keepalived 使用 VRRP 协议的组播地址 224.0.0.18 来发送心跳包,以便各个 Keepalived 节点之间可以互相感知对方的存在。
  • 优点
    • 配置简单,不需要特别指定对端 IP 地址。
    • 适用于传统的网络环境,特别是那些支持组播的局域网。
  • 缺点
    • 在某些网络环境中,尤其是云环境(如 AWS、Azure、Google Cloud 等),由于网络策略限制,可能不支持组播,导致心跳包无法正常传递。
    • 如果网络设备不正确处理组播流量,可能会导致 Keepalived 实例之间的通信失败。

单播模式 (Unicast Mode)

  • 定义:在单播模式下,Keepalived 实例会直接向指定的对端 IP 地址发送心跳包,而不是使用组播地址。这种方式更加灵活,并且不受限于网络设备是否支持组播。
  • 优点
    • 适用于不支持组播的网络环境,例如云环境。
    • 更加安全,因为心跳包只在指定的节点之间传输。
    • 可以更好地控制心跳包的传输路径,有助于故障排查。
  • 缺点
    • 配置相对复杂,需要在每个节点上明确指定对端节点的 IP 地址。

主要区别

特性 组播模式 单播模式
通信方式 使用组播地址 224.0.0.18 直接向指定的对端 IP 地址发送
网络兼容性 需要网络支持组播 不依赖组播,适用于所有网络环境
配置复杂度 简单,无需指定对端 IP 复杂,需明确指定对端节点 IP
安全性 所有节点都能接收心跳信息 心跳信息仅在指定节点间传输
云环境适用性 在大多数云环境中不可用 适用于云环境
故障排查 可能受网络设备影响 通信路径明确,易于排查

选择建议

  • 传统数据中心:如果网络环境支持组播并且没有特殊的安全要求,可以选择组播模式,因为它配置简单。
  • 云环境:在云环境中,由于网络策略的限制,通常必须使用单播模式。
  • 网络受限环境:如果网络环境不支持组播或存在其他限制,应选择单播模式。
  • 安全性要求高:如果对通信的安全性有较高要求,推荐使用单播模式。

组播模式是Keepalived的默认模式,不需要额外的配置,默认支持。

单播模式配置实例

在这里插入图片描述
如上,两台nginx服务器已经配置了keepalived的基本配置(keepalived基本配置可以参照https://www.situgou.top/的《keeplivead 高可用集群–基本配置》),实现了可以通过虚拟IP进行故障转移,没有配置通信模式,所以默认是组播的,现在需要修改他们的配置修改为单播模式

Master配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@centos-manager local]# vi  /etc/keepalived/keepalived.conf
global_defs {
router_id haweb_1
}

vrrp_sync_group VGM {
group {
VI_HA
}

}

vrrp_instance VI_HA {
state MASTER 主服务为MASTER
interface eth0
virtual_router_id 51
priority 100 #权值范围1-255,越大越高
advert_int 5

authentication {
auth_type PASS
auth_pass test
}

unicast_src_ip 10.201.9.134 # 本节点的源IP地址,用于单播通信
unicast_peer { # 单播对端节点列表
10.201.9.133 # 对端节点IP地址(备节点IP)
}

virtual_ipaddress {
10.201.9.177/24 dev eth0
}

}

在配置文件中添加unicast_peerunicast_peer即可。

slave配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@node1 ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id haweb_1
}

vrrp_sync_group VGM {
group {
VI_HA
}

}

vrrp_instance VI_HA {
state BACKUP 主服务为MASTER
interface ens33
virtual_router_id 51
priority 90 #权值范围1-255,越大越高
advert_int 5

authentication {
auth_type PASS
auth_pass test
}

unicast_src_ip 10.201.9.133 # 本节点的源IP地址,用于单播通信
unicast_peer { # 单播对端节点列表
10.201.9.134 # 对端节点IP地址
}

virtual_ipaddress {
10.201.9.177/24 dev ens33
}
}

测试

根据以上配置修改完成之后,还没有重启keepalived服务,所以现在默认还是组播模式,可以使用tcpdump抓包看下。
命令:tcpdump -i ens33 -nn proto 112,ens33是我当前服务器的网卡名称,测试时根据实际情况修改。
备机:
在这里插入图片描述
主机:
在这里插入图片描述
通过在备机和主机上抓包,可以看到现在通信模式是使用 VRRP 协议的组播地址 224.0.0.18 来发送心跳包

重启keepalived服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@node1 ~]# systemctl   restart keepalived
[root@node1 ~]#
[root@node1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since 二 2026-02-03 23:39:37 CST; 27s ago
Docs: man:keepalived(8)
man:keepalived.conf(5)
man:genhash(1)
https://keepalived.org
Process: 35222 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 35224 (keepalived)
Tasks: 2
Memory: 668.0K
CGroup: /system.slice/keepalived.service
├─35224 /usr/local/sbin/keepalived -D
└─35225 /usr/local/sbin/keepalived -D

203 23:39:57 node1 Keepalived_vrrp[35225]: (VI_HA) Sending/queueing gratuitous ARPs on ens33 for 10.201.9.177
203 23:39:57 node1 Keepalived_vrrp[35225]: Sending gratuitous ARP on ens33 for 10.201.9.177
203 23:39:57 node1 Keepalived_vrrp[35225]: Sending gratuitous ARP on ens33 for 10.201.9.177
203 23:39:57 node1 Keepalived_vrrp[35225]: Sending gratuitous ARP on ens33 for 10.201.9.177
203 23:39:57 node1 Keepalived_vrrp[35225]: Sending gratuitous ARP on ens33 for 10.201.9.177
203 23:39:58 node1 Keepalived_vrrp[35225]: Sending gratuitous ARP on ens33 for 10.201.9.177
203 23:40:03 node1 Keepalived_vrrp[35225]: (VI_HA) Master received advert from 10.201.9.134 with higher priority 100, ours 90
203 23:40:03 node1 Keepalived_vrrp[35225]: (VI_HA) Entering BACKUP STATE
203 23:40:03 node1 Keepalived_vrrp[35225]: (VI_HA) removing VIPs.
203 23:40:03 node1 Keepalived_vrrp[35225]: VRRP_Group(VGM) Syncing instances to BACKUP state

抓包验证
备机:
在这里插入图片描述
主机:
在这里插入图片描述
重启服务之后再通过抓包命令查看,可以看到他们当前的通信方式不再是组播,而是想对方发送心跳包了。说明配置成功。

Keepalived 脑裂+应用层监控

Keepalived脑裂是指在高可用(HA)集群环境中,当多个节点(通常是主备节点)都同时认为自己是唯一活跃的主节点时发生的状态异常

  • 正常情况:在一个keepalived高可用配置中,通常有一个主节点(MASTER)和一个或多个备份节点(BACKUP)。主节点持有虚拟IP并提供服务,备份节点监控主节点状态。

  • 脑裂发生时:由于网络故障、心跳线断开或其他原因,节点之间无法正常通信,导致多个节点都认为其他节点已失效,于是都升级为MASTER角色并试图接管虚拟IP地址。可能会造成多个节点同时对外提供服务,客户端连接混乱等危害。

在这里插入图片描述
如上图,目前已经完成了keepalived的基本配置,但是还存在问题,就是如果是nginx应用挂了的话,keepalived不会进行切换。所以我们的就需要使用脚本对nginx的应用进行监控。当nginx功能异常的话,就停止keepalived或者是降低keepalived的priority。

  • 创建服务监控脚本
    该脚本需要主备机上面都存在
1
2
3
4
5
6
7
8
9
10
11
12
[root@centos-manager local]# vim /etc/keepalived/nginxstatus.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/bin/systemctl restart nginx.service
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/bin/systemctl stop keepalived.service
fi
fi
[root@centos-manager local]# chmod +x /etc/keepalived/nginxstatus.sh
  • Master修改keepalived配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@centos-manager keepalived]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_001B # 路由器ID,必须唯一,用于标识这台keepalived实例
}
vrrp_instance VI_1 { # VRRP实例名称为VI_1
state MASTER # 当前状态为主节点(MASTER)/备份节点(BACKUP)
interface ens33 # 绑定的网络接口,这里是ens33
virtual_router_id 51 # 虚拟路由器ID,主备两台机器必须相同
priority 100 # 优先级,数值越大优先级越高
unicast_src_ip 10.201.9.134 # 本地IP地址,单播源地址
unicast_peer { # 对端IP地址列表(单播对等体)
10.201.9.133 # 备用服务器IP地址
}
advert_int 1 # VRRP通告间隔,默认1秒
authentication { # 认证配置
auth_type PASS # 认证类型为密码认证
auth_pass test # 认证密码
}
virtual_ipaddress { # 虚拟IP地址配置
10.201.9.177/24 dev ens33 label ens33:0
} # VIP: 10.201.9.177,子网掩码/24,绑定到ens33网卡,别名为ens33:0
}
virtual_server 10.201.9.177 80 { # 虚拟服务器,VIP地址10.201.9.177,端口80
delay_loop 2 # 健康检查间隔2秒
lb_algo rr # LVS负载均衡算法:轮询(Round Robin)
lb_kind DR # LVS工作模式:直接路由(Direct Routing)
persistence_timeout 60 # 持久连接超时时间60秒
protocol TCP # 协议类型TCP
real_server 10.201.9.134 80 { # 真实服务器定义
weight 1 # 权重为1
notify_down /etc/keepalived/nginxstatus.sh # 当真实服务器宕机时执行的脚本
TCP_CHECK { # TCP健康检查配置
connect_port 80 # 检查端口80
connect_timeout 3 # 连接超时3秒
nb_get_retry 2 # 重试次数2次
delay_before_retry 1 # 重试间隔1秒
}
}
}
  • bakcup修改keepalived配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@node1 keepalived]# vi keepalived.conf
global_defs {
router_id LVS_001B # 路由器ID,必须唯一,用于标识这台keepalived实例
}
vrrp_instance VI_1 { # VRRP实例名称为VI_1
state BACKUP # 当前状态为主节点(MASTER)/备份节点(BACKUP)
interface ens33 # 绑定的网络接口,这里是ens33
virtual_router_id 51 # 虚拟路由器ID,主备两台机器必须相同
priority 90 # 优先级,数值越大优先级越高
unicast_src_ip 10.201.9.133 # 本地IP地址,单播源地址
unicast_peer { # 对端IP地址列表(单播对等体)
10.201.9.134
}
advert_int 1 # VRRP通告间隔,默认1秒
authentication { # 认证配置
auth_type PASS # 认证类型为密码认证
auth_pass test # 认证密码
}
virtual_ipaddress { # 虚拟IP地址配置
10.201.9.177/24 dev ens33 label ens33:0
} # VIP: 10.201.9.177,子网掩码/24,绑定到ens33网卡,别名为ens33:0
}
virtual_server 10.201.9.177 80 { # 虚拟服务器,VIP地址10.201.9.177,端口80
delay_loop 2 # 健康检查间隔2秒
lb_algo rr # LVS负载均衡算法:轮询(Round Robin)
lb_kind DR # LVS工作模式:直接路由(Direct Routing)
persistence_timeout 60 # 持久连接超时时间60秒
protocol TCP # 协议类型TCP
real_server 10.201.9.133 80 { # 真实服务器定义
weight 1 # 权重为1
notify_down /etc/keepalived/nginxstatus.sh # 当真实服务器宕机时执行的脚本
TCP_CHECK { # TCP健康检查配置
connect_port 80 # 检查端口80
connect_timeout 3 # 连接超时3秒
nb_get_retry 2 # 重试次数2次
delay_before_retry 1 # 重试间隔1秒
}
}
}
  • 重启keepalived服务
    分别重启master和backup的keepalived服务
1
[root@node1 keepalived]# systemctl  restart  keepalived
  • 测试
    将主机的nginx停止,查看keepalived是否能够将nginx启动起来
    在这里插入图片描述在这里插入图片描述
    从上面的两张图可以看出来,当我手动把nginx进程杀死之后,keepalived监测到80端口不在监听了之后,就会调用nginxstatus.sh脚本将nginx启动起来。
    那如果是nginx无法正常启动呢
    在这里插入图片描述
    在这里插入图片描述
    如上图,我将nginx的配置文件修改错误,并将nginx进程杀掉,随后keepalived会调用nginx的状态检查脚本拉起nginx,当使用脚本无法拉起nginx的时候,就会将本机的keepalived的服务停止,此时虚拟ip便会漂移到备机上。

Keepalived 心跳通信模式&应用层监控
https://www.situgou.top/2026/02/07/Keepalived 心跳通信模式&应用层监控/
作者
xqj_Blog
发布于
2026年2月7日
许可协议