在互联网行业,“业务不中断”是底线要求。一次服务器宕机可能导致百万级损失,而单点故障正是业务中断的头号元凶。
一套兼具高性能负载均衡与故障自动切换能力的架构,既能扛住百万级并发请求,又能在节点故障时无缝衔接,已成为企业级应用不可或缺的“稳定性基石”。今天,我们就从原理到实操,深入解析这套由LVS、Keepalived和Nginx构建的、被众多大厂采用的高可用负载均衡方案。
一、核心组件:三位一体构建高可用基石
一套可靠的高可用架构,离不开“负载分发、故障兜底、应用适配”的三重保障。LVS、Keepalived、Nginx各司其职,协同工作:
(一)Keepalived:高可用集群的“守护者”
如果将集群比作一支军队,那么Keepalived就是其中的“指挥官”,其核心使命是消除单点故障。它基于VRRP(虚拟路由冗余协议)工作,机制可概括为“主备心跳检测”:
- 主服务器(Master):对外提供统一的访问入口——虚拟IP(VIP),并持续向备用服务器发送“心跳包”宣告存活。
- 备用服务器(Backup):持续监听心跳。一旦在设定时间内未收到信号,则判定主服务器故障,立即升为主服务器并接管VIP。
- 无缝切换:整个故障切换过程在毫秒级完成,对用户完全透明,实现真正的业务零中断。
此外,Keepalived内置健康检查功能,可通过TCP、HTTP等方式监控后端真实服务器的状态,自动剔除故障节点并在其恢复后重新加入集群,确保流量不会流向不可用的服务。
(二)LVS:内核级的“流量调度员”
面对海量并发请求,单台服务器必然捉襟见肘。LVS作为工作于Linux内核态的负载均衡器,是专司“流量分发”的专家。
其最大优势在于极致性能。由于工作在内核态,避免了用户态的资源开销,能轻松处理数十万级别的并发连接。它支持NAT、TUN和DR三种转发模式,其中DR(直接路由)模式因报文转发效率最高,成为Web服务场景下的首选。
LVS根据预设的调度算法(如轮询rr、加权轮询wrr),将客户端请求均匀地分发到后端多台服务器上,既避免了单点过载,也显著提升了集群整体的吞吐能力。
(三)Nginx:应用层的“灵活适配器”
如果说LVS擅长的是四层“粗粒度”的流量调度,那么Nginx则精于七层“细粒度”的应用协议处理。它擅长HTTP/HTTPS协议解析、静态资源缓存、反向代理,并能实现基于URL、Cookie等更复杂的负载均衡策略。
在LVS+Keepalived+Nginx的架构中,Nginx作为后端Web服务节点,接收来自LVS分发的请求后,可以进一步根据后端应用服务器(如Tomcat)的状态进行转发。这样既分担了应用服务器的直接压力,又通过其丰富的模块化特性提升了服务的灵活性与可管理性。
三者协同的工作流程非常清晰:客户端请求首先到达VIP → LVS根据算法将请求分发至某一台Nginx节点 → Nginx将请求代理到最终的应用服务器。若主LVS节点发生故障,Keepalived会立即将VIP漂移至备用LVS节点,整个过程业务无感知。
二、架构优势:为何成为大厂标配?
这套组合方案能经久不衰,核心在于它精准地解决了企业级应用最关键的几个诉求:
1. 性能卓越,应对高并发游刃有余
LVS内核态转发的高性能,结合Nginx高效的异步事件处理模型,使得整个集群能够从容应对数十万乃至百万级的并发连接。相比单纯使用Nginx做负载均衡,LVS分担了最底层的TCP连接压力,有效防止Nginx自身成为瓶颈,特别适用于电商大促、直播等突发流量场景。
2. 高可用兜底,保障业务连续性
通过Keepalived实现的主备自动切换与节点健康检查,从负载均衡器到后端服务节点,全方位杜绝了单点故障。服务可用性可轻松达到99.99%以上,满足大厂对业务连续性的严苛要求。
3. 灵活可扩展,适配复杂业务场景
架构具有良好的水平扩展能力。业务增长时,只需横向增加Nginx节点或应用服务器即可,无需改动整体架构。同时,它支持多种负载均衡算法、会话保持策略,能够灵活适配Web网站、API网关、数据库代理等多种场景。
4. 稳定可靠,运维成本可控
LVS、Keepalived、Nginx均是久经考验的开源软件,社区活跃、成熟稳定。一旦配置完成,即可长期稳定运行,后续主要以监控和维护为主,极大降低了大规模集群的运维管理复杂度与成本。
三、实战搭建:从零部署高可用集群
以下以“2台负载调度器 + 2台Nginx后端节点”的典型拓扑为例,逐步搭建整套环境。
(一)环境规划
所有服务器采用CentOS 7系统,角色与IP规划如下:
| 角色 |
IP地址 |
核心软件 |
虚拟IP(VIP) |
| 主负载调度器(Master) |
192.168.10.110 |
ipvsadm, Keepalived |
192.168.10.180 |
| 备负载调度器(Backup) |
192.168.10.119 |
ipvsadm, Keepalived |
192.168.10.180 |
| Nginx节点1 |
192.168.10.120 |
Nginx |
192.168.10.180(绑定至lo:0) |
| Nginx节点2 |
192.168.10.123 |
Nginx |
192.168.10.180(绑定至lo:0) |
| 客户端 |
192.168.10.2 |
- |
- |
基础环境配置(所有服务器执行):
# 关闭防火墙与SELinux(生产环境应配置安全策略)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装基础工具
yum -y install wget gcc gcc-c++ make
(二)负载调度器配置(主备节点相同步骤)
1. 安装核心软件
yum -y install ipvsadm keepalived
# 加载IPVS内核模块
modprobe ip_vs
# 验证模块加载
cat /proc/net/ip_vs
2. 配置Keepalived(主备配置差异见注释)
备份原配置后编辑:
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
主节点 (192.168.10.110) 配置文件示例:
global_defs {
smtp_server 127.0.0.1
router_id LVS_01 # 备节点此处改为 LVS_02
}
vrrp_instance VI_1 {
state MASTER # 备节点改为 BACKUP
interface ens33 # 网卡名称请根据实际情况调整(ifconfig查看)
virtual_router_id 10 # 主备必须相同
priority 100 # 备节点改为 90(值低优先级低)
advert_int 1 # 心跳间隔1秒
authentication {
auth_type PASS
auth_pass abc123 # 主备密码必须一致
}
virtual_ipaddress {
192.168.10.180 # 虚拟IP(VIP)
}
}
# 定义LVS虚拟服务器
virtual_server 192.168.10.180 80 {
delay_loop 6 # 健康检查间隔6秒
lb_algo rr # 调度算法:轮询(rr),可选wrr(加权轮询)
lb_kind DR # 转发模式:直接路由(DR)
persistence_timeout 50 # 会话保持时间50秒
# 后端真实服务器1(Nginx节点1)
real_server 192.168.10.120 80 {
weight 1 # 权重
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# 后端真实服务器2(Nginx节点2)
real_server 192.168.10.123 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
备用节点 (192.168.10.119) 需修改:router_id LVS_02、state BACKUP、priority 90。
3. 绑定VIP到物理网卡(主备节点都需配置)
创建子接口配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
添加内容:
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
重启网络并激活:
systemctl restart network
ifup ens33:0
# 验证
ifconfig ens33:0
4. 调整内核参数(防止ICMP重定向干扰)
vim /etc/sysctl.conf
添加:
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
应用配置:
sysctl -p
5. 启动服务
systemctl start keepalived
# 保存LVS规则并启动
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
# 查看规则列表
ipvsadm -ln
(三)Nginx后端节点配置
1. 安装并启动Nginx
yum -y install nginx
systemctl start nginx && systemctl enable nginx
2. 配置测试页面(用于区分节点)
3. 绑定VIP到本地回环接口(DR模式关键步骤)
创建回环子接口配置:
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
添加:
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
重启网络并添加路由:
systemctl restart network
ifup lo:0
route add -host 192.168.10.180 dev lo:0
4. 优化ARP参数(防止VIP响应冲突)
vim /etc/sysctl.conf
添加:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
应用配置:
sysctl -p
四、功能验证:测试集群效果
完成搭建后,通过以下测试验证架构是否正常工作。
1. 负载均衡测试
在客户端浏览器访问VIP地址:http://192.168.10.180。多次刷新页面,观察页面内容应在“Node 1”和“Node 2”之间交替显示,说明LVS的轮询调度生效。
2. 高可用故障切换测试
- 在主负载调度器(
192.168.10.110)上停止Keepalived服务:systemctl stop keepalived。
- 稍等片刻,在备用负载调度器(
192.168.10.119)上执行 ip addr show,应能看到VIP (192.168.10.180) 已绑定到其网卡上。
- 客户端再次访问VIP,服务应完全正常,无任何中断感。
3. 健康检查测试
- 在其中一台Nginx节点(如
192.168.10.120)上停止Nginx服务:systemctl stop nginx。
- 客户端访问VIP,此时应只能看到来自另一台正常Nginx节点(
192.168.10.123)的页面。
- 重新启动故障节点的Nginx:
systemctl start nginx。稍等片刻(Keepalived健康检查周期),再次访问VIP,流量恢复被分配到两个节点。
五、生产环境避坑指南
1. 脑裂问题
现象:主备节点都认为自己是Master,导致VIP冲突,服务不可用。
原因:心跳线网络中断、防火墙阻止VRRP报文、主备配置不一致。
解决方案:
- 使用双心跳线进行冗余。
- 配置第三方仲裁(如网关),心跳中断时,无法Ping通仲裁IP的节点自动降级。
- 部署监控脚本,检测到脑裂时立即告警。
2. ARP缓存问题
现象:客户端偶尔访问VIP失败。
解决方案:确保后端Nginx节点的ARP参数配置正确。可在客户端临时清理ARP缓存:arp -d 192.168.10.180。
3. 内核参数错误
现象:LVS转发不成功或Keepalived状态异常。
解决方案:严格按照上述步骤配置内核参数,并使用 sysctl -p 确认生效。
六、总结
LVS+Keepalived+Nginx架构的成功,在于它以相对简单的组合,实现了高性能、高可用与高灵活性的完美平衡:
- 性能层面:LVS内核态处理能力为高并发打下坚实基础。
- 可用性层面:Keepalived确保了从入口到后端服务的全链路故障自动切换。
- 灵活性层面:Nginx提供了丰富的应用层处理能力,适配复杂业务。
这套架构不仅适用于传统Web服务,其思想也可扩展至数据库读写分离、API网关等场景,是企业服务从“可用”迈向“可靠、高效”的关键一步。
关于技术选型的思考:或许有读者认为此架构有些“传统”,如今云原生和Kubernetes更为流行。确实,K8s在容器编排、自动扩缩容等方面功能强大。但技术选型的核心在于匹配业务现状与团队能力。LVS+Keepalived+Nginx方案架构清晰、运维简单、稳定可靠,对于许多业务规模适中或追求极致稳定性的场景,它依然是性价比极高的选择。即便在现代化的云原生体系中,它也常作为K8s集群边缘的入口负载均衡方案,继续发挥着重要作用。适合自己的,才是最好的技术方案。