前言
在企业级服务部署中,单点故障是业务稳定运行的核心隐患。Keepalived作为基于VRRP协议的高可用工具,可解决服务单点问题;结合LVS(Linux Virtual Server)后,既能实现负载均衡分发流量,又能保障调度器高可用,是Web服务集群的经典部署方案。本文将从Keepalived基础热备、Keepalived+LVS高可用调度器两大核心场景,完整拆解部署原理、配置步骤与验证方法。
一、Keepalived热备基础
1.1 Keepalived概述
- 核心痛点:调度器/服务节点出现单点故障,导致业务中断。
- 核心作用:实现高可用集群 ,最初专为LVS设计,用于监控服务器节点状态;后续集成VRRP协议,彻底解决单点故障问题。
- Keepalived作用:
- 定义LVS集群,向集群中添加RS(Real Server)
- 对集群成员进行健康检查(监控健康状态)
- 支持VRRP虚拟路由冗余协议,可以进行及时且平滑的故障切换,防止单点故障
- 核心优势:故障自动检测、自动剔除故障节点、节点恢复后自动加入集群,全程无需人工干预。
VRRP协议:又叫虚拟路由冗余(备份)协议,是热备的关键
1.2 Keepalived运行原理
- 实时检测集群内所有服务器节点的运行状态;
- 节点异常/故障时,自动将故障节点从集群中剔除;
- 故障节点恢复正常后,自动将其重新加入集群;
- 所有工作自动完成,无需人工干预。 基于VRRP协议实现VIP(虚拟IP)浮动,客户端仅访问VIP,无需感知后端节点变化。
1.3 高可用Web案例部署
- 客户端访问VIP,VIP会落在优先级高的服务器上
或者说优先级高的称为主服务器,优先级低的称为备用服务器,主服务器故障,自动切换为备用服务器

这里的VIP又称为浮动IP
优先级高的节点,默认会成为 MASTER(主服务器),VIP 会绑定在它的网卡上,客户端访问 VIP 时,流量会被路由到这台主服务器。
优先级低的节点,默认是 BACKUP(备用服务器)。
两台节点本地都配置同一 VIP,凭借优先级区分主备,不会出现 IP 冲突。
当主服务器故障(或业务检测失败),备用服务器会自动升级为新的主服务器,VIP 会 "漂移" 到备用服务器上,客户端访问无感知。
1.3.1 实验环境
- 使用template模板机 下方4台虚拟机
- 配置IP地址,使用WindTerm远程连接虚拟机

1.3.2 部署Web服务(web1+web2)
web1部署httpd
- web1主机安装httpd,配置默认首页内容为web1
bash
[root@web1 ~]# dnf -y install httpd #安装httpd
[root@web1 ~]# echo web1 > /var/www/html/index.html #编写首页文件
[root@web1 ~]# systemctl enable httpd --now #启动服务并将服务设置开机自启
[root@web1 ~]# ss -nutlp | grep :80 #查看端口
web2部署httpd
bash
# 安装httpd服务
[root@web2 ~]# dnf -y install httpd
# 配置默认首页,标识web2
[root@web2 ~]# echo web2 > /var/www/html/index.html
# 启动服务并设置开机自启
[root@web2 ~]# systemctl enable httpd --now
# 验证80端口监听
[root@web2 ~]# ss -nutlp | grep :80
1.3.3 web1部署Keepalived(主节点)
- web1主机安装keepalived,配置VIP
- keepalived主配置文件:/etc/keepalived/keepalived.conf
安装并备份配置
bash
# 安装keepalived
[root@web1 ~]# dnf -y install keepalived
# 备份默认配置文件
[root@web1 ~]# cp /etc/keepalived/keepalived.conf /opt/
配置Keepalived(主节点MASTER)
bash
[root@web1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #当发生故障切换的时候,给谁发送邮件
lisi@test.com #收件人邮箱,写自己的邮箱就可以了
}
notification_email_from root@localhost #设置发件人的邮箱
smtp_server 192.168.8.100 #邮件服务器地址
smtp_connect_timeout 30 #邮件的连接超时时间,单位为秒
router_id LVS_1 #定义路由ID,相当于机器名,每个机器的ID必须不一样
vrrp_skip_check_adv_addr #跳过检查IP地址
vrrp_strict #严格遵循VRRP协议
vrrp_garp_interval 0 #当设备故障,用来通知交换机,"我故障了",0标识最快速度发送
vrrp_gna_interval 0 #邻居(即备用主机)通告间隔
}
vrrp_instance VI_1 { #定义一个高可用的实例,名字叫做VI_1
state MASTER #状态,此主机扮演的角色为MASTER(主服务器)
interface ens160 #绑定在ens160网卡(VIP在这个网卡上飘)
virtual_router_id 51 #虚拟路由ID(集群ID),相当于组号。数字随意,但是主备服务器必须一样
priority 100 #优先级,数字越大越优先成为主,备用服务器必须小于主服务器的数字
advert_int 1 #心跳检测的间隔,1秒钟进行一次存活检测
authentication { #集群认证(防止乱入节点)
auth_type PASS #认证方式,密码认证
auth_pass 1111 #密码为1111(主备必须一致)
}
virtual_ipaddress { #虚拟IP(VIP,也叫浮动ip)
192.168.8.80 #VIP地址
}
}
红色部分是需要我们修改的内容

启动服务并验证VIP
bash
# 启动keepalived并设置开机自启
[root@web1 ~]# systemctl enable keepalived --now
# 查看网卡,确认VIP已绑定
[root@web1 ~]# ip a s ens160
可以看到多了一个 8.80/32的浮动ip
(细节补充:虽然两台web服务器是几乎一样的配置,但是主服务器存在时,副服务器上使用ip a s命令是无法看到配置的VIP的)
1.3.4 web2部署Keepalived(备节点)
安装并备份配置
bash
# 安装keepalived
[root@web2 ~]# dnf -y install keepalived
# 备份默认配置文件
[root@web2 ~]# cp /etc/keepalived/keepalived.conf /opt/
配置Keepalived(备节点BACKUP)
bash
[root@web2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
lisi@test.com
}
notification_email_from root@localhost
smtp_server 192.168.8.200
smtp_connect_timeout 30
router_id LVS_2 # 路由ID(与主节点不同)
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP # 角色:备节点
interface ens160
virtual_router_id 51
priority 80 # 优先级(低于主节点,备机默认不抢VIP)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.80
}
}
启动服务并验证(主节点)
bash
# 启动keepalived并设置开机自启
[root@web2 ~]# systemctl enable keepalived --now
# 查看网卡,此时备节点无VIP(主节点正常)
[root@web2 ~]# ip a s ens160
1.3.5 客户端验证高可用
正常访问(主节点提供服务)
bash
# 客户端访问VIP,返回web1内容
[root@client ~]# curl 192.168.8.80
web1
模拟主节点故障,验证VIP浮动
bash
# 停止web1的keepalived,模拟故障
[root@web1 ~]# systemctl stop keepalived
# 查看web2网卡,VIP已自动浮动到备节点
[root@web2 ~]# ip a s ens160
# 客户端再次访问,返回web2内容,业务无中断
[root@client ~]# curl 192.168.8.80
web2
二、Keepalived+LVS高可用负载均衡
实验拓扑图:

VIP直接配置在网卡ens192上
2.1 架构概述
- 核心痛点:LVS调度器单点故障,导致整个负载均衡集群瘫痪。
- 架构方案:主备LVS调度器+Keepalived高可用+LVS-DR模式+Real Server
- 核心逻辑:
- 主备调度器共享VIP,Keepalived实现VIP浮动;
- LVS负责将客户端流量分发到后端Real Server;
- LVS-DR模式:直接路由模式,Real Server直接响应客户端,调度器仅转发请求;
- Real Server配置伪装VIP(lo网卡),并修改内核参数抑制ARP响应,避免IP冲突。
实验目的简述:在调度器(LVS)上配置Keepalived高可用,防止单点故障
2.2 实验环境
- 客户端:client(192.168.8.10/24)
- LVS调度器:lvs1(192.168.8.5/24,主)、lvs2(192.168.8.6/24,备)
- 共享VIP:192.168.8.50/24
- Real Server:web1(192.168.8.100/24)、web2(192.168.8.200/24)
- Real Server伪装VIP:192.168.8.50/32(lo网卡)
- 网络模式:vmnet8(同网段互通)
2.3 环境清理(复用Web节点)
- 停止keepalived服务
bash
# web1停止keepalived,清理旧VIP
[root@web1 ~]# systemctl stop keepalived
[root@web1 ~]# ip a s
# web2停止keepalived,清理旧VIP
[root@web2 ~]# systemctl stop keepalived
[root@web2 ~]# ip a s
2.4 主调度器lvs1配置
- lvs1主机安装keepalived
- keepalived主配置文件:/etc/keepalived/keepalived.conf
2.4.1 安装依赖
bash
# 安装keepalived和ipvsadm(LVS管理工具)
[root@lvs1 ~]# dnf -y install keepalived ipvsadm
# 备份配置文件
[root@lvs1 ~]# cp /etc/keepalived/keepalived.conf /opt/
2.4.2 配置Keepalived+LVS
bash
[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 修改配置文件
global_defs {
notification_email { #当发生故障切换的时候,将邮件发送给谁
lisi@test.com #收件人邮箱
}
notification_email_from root@localhost #设置发件人邮箱
smtp_server 192.168.8.5 #邮件服务器地址
smtp_connect_timeout 30 #邮件的连接超时时间
router_id LVS_1 #路由ID,相当于机器名,每个机器的ID必须不一样
vrrp_skip_check_adv_addr
vrrp_strict #严格遵循VRRP协议
vrrp_garp_interval 0 #用来通知交换机"我的VIP换了",0标识最快速度发送
vrrp_gna_interval 0 #邻居通告间隔
}
vrrp_instance VI_1 { #定义一个高可用的实例,名字叫做VI_1
state MASTER #角色为MASTER
interface ens160 #绑定在ens160网卡(VIP在这个网卡上飘)
virtual_router_id 51 #集群ID,主备必须一样
priority 100 #优先级,数字越大越优先成为主
advert_int 1 #心跳包发送间隔、1秒钟发送一次检测存活
authentication { #集群认证(防止乱入节点)
auth_type PASS #认证模式,密码认证
auth_pass 1111 #密码1111(主备必须一致)
}
virtual_ipaddress { #虚拟IP(VIP)
192.168.8.50 #VIP地址
}
}
virtual_server 192.168.8.50 80 { #定义LVS虚拟服务器,VIP 192.168.8.50 80端口
delay_loop 6 #每隔6秒检查一次后端服务器是否存活
lb_algo rr #负载均衡算法为: rr轮询
lb_kind DR #LVS模式: DR
persistence_timeout 50 #会话保持时间50(持续50秒都是一个主机提供服务)
protocol TCP #协议TCP
real_server 192.168.8.100 80 { #真实服务器的地址 和 端口号
weight 1
TCP_CHECK { #健康检查方式 TCP 端口检查
connect_timeout 3 #连接超时时间为3秒
retry 3 #失败后再重新尝试3次
delay_before_retry 3 #每次重试前等待3秒
}
}
real_server 192.168.8.200 80 { #真实服务器的地址 和 端口号
weight 1
TCP_CHECK { #健康检查方式 TCP 端口检查
connect_timeout 3 #连接超时时间3秒
retry 3 #失败重新3次
delay_before_retry 3 #重试前等待3秒
}
}
}
截图中红色部分即需要修改的内容:


注意该配置: persistence_timeout 50 #会话保持时间50(持续50秒都是一个主机提供服务),测试的时候可以适当调整该参数
2.4.3 启动服务并验证
bash
[root@lvs1 ~]# dnf -y install ipvsadm #安装ipvsadm,查看集群
[root@lvs1 ~]# systemctl start keepalived #重启服务
[root@lvs1 ~]# ip a s ens160 #查看网卡已经有了 浮动IP(VIP)
[root@lvs1 ~]# ipvsadm -Ln #查看集群状态
注意,这里安装ipvsadm 仅仅是为了可以使用-Ln命令查看集群
2.5 备调度器lvs2配置
2.5.1 安装依赖并同步配置
- lvs2主机安装keepalived
- keepalived主配置文件:/etc/keepalived/keepalived.conf
- lvs2主机直接从lvs1主机下载keepalived.conf,再做个性化修改即可
bash
# 安装keepalived和ipvsadm
[root@lvs2 ~]# dnf -y install keepalived ipvsadm
# 备份配置文件
[root@lvs2 ~]# cp /etc/keepalived/keepalived.conf /opt/
# 从主调度器同步配置文件
[root@lvs2 ~]# scp root@192.168.8.5:/etc/keepalived/keepalived.conf /etc/keepalived/
2.5.2 修改备节点配置
lvs2修改keepalived.conf配置文件
bash
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf
# 修改3处核心配置
router_id LVS_2 # 路由ID(唯一)
state BACKUP # 角色:备节点
priority 80 # 优先级(低于主节点)
2.5.3 启动服务并验证
bash
# 启动keepalived
[root@lvs2 ~]# systemctl start keepalived
# 查看LVS集群规则
[root@lvs2 ~]# ipvsadm -Ln
2.6 Real Server(web1+web2)配置
2.6.1 配置lo网卡伪装VIP(web1)
- web1安装network服务,配置伪装IP,配置在lo网卡的虚拟接口上
- 伪装IP配在本地回环 lo 网卡,可通过内核参数禁止 lo 上 VIP 发送 ARP 应答,只让调度器响应 ARP
(配置完伪装IP之后不可以立刻重启网络服务,必须配置完核参数抑制ARP响应之后再重启)
bash
# 安装network服务(用于配置lo虚拟网卡)
[root@web1 ~]# dnf -y install network-scripts
# 进入网卡配置目录
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
# 复制lo网卡配置,创建虚拟接口lo:0
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
# 编辑lo:0配置
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0 #设备名称
IPADDR=192.168.8.50 # 伪装VIP(与调度器VIP一致)
NETMASK=255.255.255.255 # 32位掩码,仅本机生效
ONBOOT=yes #开机自动启动此配置
BOOTPROTO=static #配置方式为静态手动配置
2.6.2 内核参数抑制ARP响应(web1)
- web1防止地址冲突,修改内核参数,禁止对外广播自己是192.168.4.50
bash
# 编辑内核参数配置文件
[root@web1 ~]# vim /etc/sysctl.conf
# 添加以下4行,抑制lo网卡VIP的ARP响应
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
#本机不要向外宣告自己的lo回环地址是192.168.4.50
# 生效内核参数
[root@web1 ~]# sysctl -p
# 重启网络服务
[root@web1 ~]# systemctl restart network
# 验证lo网卡VIP配置
[root@web1 ~]# ip a s
#查看ip地址,lo网卡上边已经有了4.50的伪装IP
2.6.3 web2重复上述配置
bash
# 安装network服务
[root@web2 ~]# dnf -y install network-scripts
# 复制lo配置
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
# 配置lo:0
[root@web2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.8.50
NETMASK=255.255.255.255
ONBOOT=yes
BOOTPROTO=static
# 配置内核参数
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
# 生效并验证
[root@web2 ~]# sysctl -p
[root@web2 ~]# systemctl restart network
[root@web2 ~]# ip a s
2.7 客户端验证负载均衡与高可用
2.7.1 正常访问(会话保持50秒)
- client主机访问VIP:http://192.168.8.50,50秒内由同一个服务器提供服务
- 因为keepalived中有persistence_timeout 50配置
bash
# 客户端访问VIP,50秒内固定访问同一节点
[root@client~]# curl 192.168.8.50
web1
[root@client~]# curl 192.168.8.50
web1
2.7.2 关闭会话保持,验证轮询
bash
# lvs1注释会话保持配置
[root@lvs1 ~]# sed -i '/persistence/s/^./#/' /etc/keepalived/keepalived.conf
#直接注释掉会话保持项
[root@lvs1 ~]# systemctl restart keepalived
# lvs2同步修改
[root@lvs2 ~]# sed -i '/persistence/s/^./#/' /etc/keepalived/keepalived.conf
[root@lvs2 ~]# systemctl restart keepalived
# 客户端访问,实现轮询
[root@client~]# curl 192.168.8.50
web1
[root@client~]# curl 192.168.8.50
web2
2.7.3 模拟调度器故障,验证VIP浮动(健康检查)
- 模拟lvs1宕机,关闭keepalived服务
- 此刻VIP会自动浮动至lvs2主机,客户端不影响问访问
bash
# 停止主调度器lvs1的keepalived
[root@lvs1 ~]# systemctl stop keepalived
# 备调度器lvs2自动绑定VIP
[root@lvs2 ~]# ip a s ens160
# 客户端正常访问,业务无中断
[root@client~]# curl 192.168.8.50
web1
2.7.4 模拟后端节点故障,自动剔除/加入
- 模拟web1宕机,关闭httpd服务
- 此刻LVS会自动将其移除集群,再次启动会将此主机再次加入集群(全程自动)
需要注意,重启服务之后再次加入集群并不是实时的,有等待时间(可手动更改)
bash
# 停止web1的httpd服务,模拟故障
[root@web1 ~]# systemctl stop httpd
# 调度器自动剔除故障节点
[root@lvs2 ~]# ipvsadm -Ln
# 客户端仅访问web2
[root@client~]# curl 192.168.8.50
web2
# 恢复web1服务
[root@web1 ~]# systemctl start httpd
# 调度器自动重新加入节点
[root@lvs2 ~]# ipvsadm -Ln
# 客户端恢复轮询
[root@client~]# curl 192.168.8.50
web1
当前架构优化思路:可以使用dns分离解析让两台调度器同时工作,不至于让一台主机一直工作到挂掉
目前架构的缺点:仅能处理静态页面(配置动静分离);无备份(crond周期备份数据;网站部署在额外主机,使用nfs挂载在web主机上)。
三、核心总结
- Keepalived核心 :基于VRRP协议实现VIP浮动,解决单点故障;主备节点virtual_router_id、认证密码必须一致 ,router_id、优先级必须不同。
- LVS-DR模式核心 :Real Server在lo网卡配置伪装VIP(32位掩码),通过内核参数抑制ARP响应,避免IP冲突;调度器仅转发请求,Real Server直接响应客户端,性能更高。
- 高可用+负载均衡核心 :
- Keepalived保障调度器无单点;
- LVS实现流量分发与后端节点健康检查;
- 全程故障自动切换、节点自动上下线,无需人工干预,适合企业级Web服务高并发、高可用场景。