高可用Keepalived解析
高可用Keepalived解析
HA集群能解决哪些问题?
- 企业关键业务系统:如企业的ERP(企业资源计划)系统、CRM(客户关系管理)系统等,这些系统对于企业的日常运营至关重要,一旦停机可能会给企业带来巨大的经济损失。通过构建HA集群,可以确保这些关键业务系统的高可用性,保障企业的正常运营。
- 数据中心:数据中心是大量数据存储和处理的核心场所,需要保证数据服务的持续稳定。HA集群可以应用于数据中心的服务器、存储设备等各个层面,提高整个数据中心的可靠性和可用性。
- 云计算平台:云计算服务需要为大量用户提供稳定的计算资源和服务。HA集群能够保证云计算平台在面对各种故障时,依然能够为用户提供不间断的服务,避免因系统停机给用户带来不便。
Keepalived介绍
Keeplived起初是为LVS设计的,专门用来监控集群中系统各个服务器节点的状态,它根据TCP/IP参考模型的第三、第四、第五层检测每个服务器节点的状态。如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来 Keepalived 又加入了VRRP的功能,VRRP Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能。
VRRP原理
在局域网中,用户都采用配置一个默认网关的形式去访问外网,如果这太默认网关出现问题,那么所有的用户访问外网都访问不了。通过部署多个网关来解决问题,但是也同样带来了网关冲突的问题。VRRP就可以解决这个问题,VRRP(虚拟路由冗余策略)既能够实现网关的备份,又可以解决多个网关的冲突。
VRRP概述
通过把几台实际的物理设备,绑定成一个虚拟的设备,客户端只会知道一个网关,但是这个网关可能是由2个或以上的设备组成的一台虚拟的路由设备,VRRP在当前充当网关角色的设备出现故障时,离开切换成第二台设备,提供的网关地址不会改变。
VRRP基本概念
VRRP:路由器:运行VRRP协议的路由器,VRRP时配置在路由接口上的也是通过路由接口来工作的
VRID:一个VRRP组(VRRP Group)由多台协同工作的路由器(的接口)组成,使用相同的VRID(Virtual Router Identifier,虚拟路由器标识符)进行标识。属于同一个VRRP组的路由器之间交互VRRP协议报文并产生一台虚拟“路由器”。一个VRRP组中只能出现一台Master路由器。
**虚拟路由器:**VRRP为每一个组抽象出一台虚拟“路由器”(Virtual Router),该路由器并非真实存在的物理设备,而是由VRRP虚拟出来的逻辑设备。一个VRRP组只会产生一台虚拟路由器。
虚拟IP地址及虚拟MAC地址:虚拟路由器拥有自己的IP地址以及MAC地址,其中IP地址由网络管理员在配置VRRP时指定,一台虚拟路由器可以有一个或多个IP地址,通常情况下用户使用该地址作为网关地址。而虚拟MAC地址的格式是“0000-5e00-01xx”,其中xx为VRID。
Master路由器:Master路由器”在一个VRRP组中承担报文转发任务。在每一个VRRP组中,只有Master路由器才会响应针对虚拟IP地址的ARP Request。Master路由器会以一定的时间间隔周期性地发送VRRP报文,以便通知同一个VRRP组中的Backup路由器关于自己的存活情况。
Backup路由器:也被称为备份路由器。Backup路由器将会实时侦听Master路由器发送出来的VRRP报文,它随时准备接替Master路由器的工作。
Priority:优先级值是选举Master路由器和Backup路由器的依据,优先级取值范围0-255,值越大越优先,值相等则比较接口IP地址大小,大者优先。
VRRP主备切换
当Master设备主动放弃Master地位(如Master设备退出备份组)时,会发送优先级为0的通告报文,用来使Backup设备快速切换成Master设备,而不用等到MASTER_DOWN定时器超时。这个切换的时间称为Skew_time。
当Master设备发生网络故障而不能发送通告报文的时候,Backup设备并不能立即知道其工作状况。等到MASTER_DOWN定时器超时后,才会认为Master设备无法正常工作,从而将状态切换为Master。
Keepalived VRRP 工作原理
Keepalived通过VRRP实现高可用性,它还能实现对集群中服务器运行状态的监控以及故障隔离。
Keepalived工作在TCP/IP 参考模型的 三层、四层、七层,也就是分别为:网络层,传输层和应用层。
根据TCP/IP参数模型隔层所能实现的功能,Keepalived运行机制如下:
网络层:提供四个重要的协议,互联网络IP协议、互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP。
Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层:提供两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接。
Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
VRRP 脑裂
脑裂的定义
在 keepalived 高可用集群中,脑裂(Split-Brain) 是指主从节点(或双主节点)之间因通信中断,导致各自认为对方故障,从而同时争抢资源(如虚拟 IP),引发集群状态混乱的现象。
脑裂产生的原因
脑裂的核心是节点间心跳检测失败,但实际节点均正常运行,常见情况可能导致:
- 网络问题:主从节点间的心跳线路(如专用网线、交换机)故障、断网或延迟过高。
- 防火墙规则:节点间的 VRRP 协议端口(默认 112 端口,UDP 协议)被防火墙屏蔽。
- 资源耗尽:某节点因 CPU、内存耗尽或负载过高,无法响应心跳请求。
- 配置错误: keepalived 配置中 vrrp_instance 的 state 、 priority 或 authentication 等参数不一致,导致节点间无法正常协商。
脑裂的危害
双节点同时持有虚拟 IP(VIP),导致客户端请求混乱(部分请求成功,部分失败)。
若集群管理的是数据库、存储等资源,可能引发数据不一致(如双写冲突)。
集群失去高可用意义,甚至因资源竞争导致服务崩溃。
如何避免脑裂
增加心跳检测线路
启用VRRP认证
配置防火墙规则
部署第三方检测软件
降低脑裂影响范围
监控和警告
总结
脑裂的本质是节点通信失效与状态判断不一致,预防核心在于多重检测自动隔离:通过多线路心跳、认证机制降低误判概率,结合脚本和第三方工具在脑裂发生时快速隔离异常节点,同时配合监控及时干预,保障集群稳定。
Keepalvied 高可用技术实践
实验环境

基础配置
IP、网关、主机名
# client1
hostnamectl set-hostname client1
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
# web1
hostnamectl set-hostname web1
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
# web2
hostnamectl set-hostname web2
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes
nmcli connection up ens33
配置web
[root@web1-2 ~]#
# 部署 web
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y nginx
echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
systemctl enable nginx.service --now
# 访问后端 nginx
[root@client1 ~]# curl 10.1.8.11
Welcome to web1.laogao.cloud
[root@client1 ~]# curl 10.1.8.12
Welcome to web2.laogao.cloud
配置 keepalived
配置web2
web2作为备用节点
[root@web2 ~ 19:15:02]# yum -y install keepalived
[root@web2 ~ 19:15:14]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bk
[root@web2 ~ 19:15:32]# vim /etc/keepalived/keepalived.conf
#修改内容如下
global_defs {
router_id web2 #rid 这个要唯一不唯一会导致冲突一般和主机名一样即可
}
vrrp_instance nginx { #两台设备名称要一至
state BACKUP #备份状态不会主动抢占
interface ens33 #基于ens33网卡
virtual_router_id 51
priority 100 #优先级,数字越大游戏机越高 0-255
advert_int 1
authentication {
auth_type PASS
auth_pass 111111111 #密码,两个节点密码要一至,只会校验前8位
}
virtual_ipaddress {
10.1.8.100/24 #虚拟网卡ip
}
}
说明
- router_id web2 ,定义路由器名称,每个节点使用不同的名称。
- state BACKUP ,定义节点角色为备节点,MASTER则代表主节点。
- interface ens33 ,定义VIP配置到该接口。
- virtual_router_id 51 ,定义虚拟路由器ID,范围1-255,每个节点使用相同名称。
- priority 100 ,定义节点优先级,值越大优先级越高。
- authentication ,定义心跳认证。
- virtual_ipaddress ,定义虚拟VIP。
配置web1
[root@web1 ~ 19:17:33]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bk
[root@web1 ~ 19:17:44]# vim /etc/keepalived/keepalived.conf
[root@web1 ~ 19:19:04]# systemctl enable keepalived.service
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/rvice.
[root@web1 ~ 19:20:30]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.11/24 10.1.8.100/24 fe80::20e9:e022:8683:78bb/64 fe80::295b:597f:939b:8be6/64
virbr0 DOWN 192.168.122.1/24
virbr0-nic DOWN
高可用验证
# 访问 web
[root@client1 ~]# curl 10.1.8.100
Welcome to web1.laogao.cloud
[root@client2 ~]# curl 10.1.8.100
Welcome to web1.laogao.cloud
# 关闭 web1 的 keepalive服务,再次访问
[root@web1 ~]# systemctl stop keepalived.service
[root@client1 ~]# curl 10.1.8.100
Welcome to web2.laogao.cloud
# 再次启动 web1 的keepalive服务,再次访问
# master会抢占
[root@web1 ~]# systemctl start keepalived.service
[root@client1 ~]# curl 10.1.8.100
Welcome to web1.laogao.cloud
keepalived配置文件
配置文件位置:/etc/keepalived/keepalived.conf
配置文件主要包括三部分:
GLOBAL,全局配置部分
VRRPD ,VRRP协议配置部分
LVS ,LVS服务管理配置部分
示例:
! 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通告中的所有地址是很耗时的。设置这个标志意味着,如果这个通告和之前接收到的通告
来自同一个主路由器,则不会执行检查。
vrrp_skip_check_adv_addr
# 严格遵守VRRP协议。
vrrp_strict
# 接口发送免费ARP消息的延迟毫秒数
vrrp_garp_interval 0
# 接口发送未经请求的NA消息的延迟毫秒数
vrrp_gna_interval 0
}
# VRRP协议配置
# VI_1是虚拟实例名称,可自定义
vrrp_instance VI_1 {
# 指定当前节点角色,可以值为MASTER和BACKUP,这里的值不重要。配置文件的 state 只是启动初始
状态,实际会根据 priority 优先级竞选。
state MASTER
# VIP使用的接口
interface eth0
#从0到255的任意唯一数字,用于区分VRRPD的多个实例,同一个高可用集群使用相同的id
virtual_router_id 51
# 用于选举为MASTER,高于其他节点50,将成为MASTER
priority 100
# VRRP通告之间间隔,1s
advert_int 1
# VRRP通告认证凭据
authentication {
auth_type PASS
auth_pass 1111
}
# 提供的VIP列表,还可以通过<IPADDR>/<MASK>指定多个地址
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
# LVS服务管理配置
# 虚拟服务器是 192.168.200.100 443 {
virtual_server 192.168.200.100 443
# delay timer for service polling
delay_loop 6
# LVS scheduler,支持lb_algo rr|wrr|lc|wlc|lblc|sh|dh
lb_algo rr
# LVS forwarding method,支持NAT|DR|TUN
lb_kind NAT
# LVS persistence timeout in seconds, default 6 minutes
persistence_timeout 50
# L4 protocol,支持TCP|UDP|SCTP
protocol TCP
# one entry for each realserver
real_server 192.168.201.100 443 {
# relative weight to use, default: 1
weight 1
}
}
生产实际
在实际生成环境中如果出现故障主备切换,故障的设备修好之后肯定是不希望他抢回主权的来防止业务中断。
初始web1是master,web2是backup
web1挂了,web2成为master,web1又恢复了为了保持稳定性不抢占维持backup身份,当web2挂了,web1成为master
#配置web1
[root@web1 ~ 19:28:01]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id web1
}
vrrp_instance nginx {
state BACKUP
nopreempt #不抢占
interface ens33
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111111111
}
virtual_ipaddress {
10.1.8.100/24
}
}
#配置web2
web2配置和上面一样,因为web2优先级低所以不要打nopreempt
# 测试,将web1 master关掉,web2成为master
[root@web1 ~]# systemctl stop keepalived.service
#web2成为master
[root@web2 ~]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.12/24 `10.1.8.100/24`
#将web1 keepalived服务恢复,观察现象
[root@web1 ~]# systemctl start keepalived.service
# 发现master还是web2
[root@web2 ~]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.12/24 10.1.8.100/24
# 把web2 keepalived关掉,观察web1
[root@web1 ~]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.8.11/24 10.1.8.100/24
Keepalived日志
# 以下步骤在 web1 和 web2 节点完成
[root@web1,web2 ~]# vim /etc/sysconfig/keepalived
14 KEEPALIVED_OPTIONS="-D -d -S 0"
参数含义
-D:后台守护进程模式(Daemon),默认必带
-d:开启 debug 调试日志,日志会打印更多 vrrp 细节,会打大量日志到 /var/log/messages
-S 0:syslog facility 0,使用 LOG_SYSLOG 设施输出日志
⚠️ -d debug 模式生产环境不建议长期开,日志量非常大,会刷爆 messages。
排查问题临时打开,问题解决后要删掉 -d。
[root@web1,web2 ~]# vim /etc/rsyslog.d/keepalived.conf
local0.* /var/log/keepalived.log #把keepalived 日志单独输出到
/var/log/keepalived.log,不再混在 /var/log/messages。
# 重启日志服务
[root@web1,web2 ~]# systemctl restart rsyslog
# 重启 keepalived,观察日志
[root@web1,web2 ~]# systemctl restart keepalived.service
# 监控日志
[root@web1,web2 ~]# tail -f /var/log/keepalived.log
总结
Keepalived 基于 VRRP 协议实现高可用,核心通过虚拟 IP(VIP)对外提供统一访问入口,支持主从、双主两种部署模式。
它通过优先级配置确定主节点,主节点故障时,备节点自动接管 VIP 与服务,实现无缝切换;还可搭配健康检查脚本,实时监测后端服务状态。常与 LVS、Nginx 等负载均衡工具联动,解决单点故障问题,为Web、数据库等服务构建稳定的高可用架构。
更多推荐



所有评论(0)