在高并发业务场景中,单台服务器的性能和可靠性往往难以满足需求。负载均衡技术通过将流量分发到多台后端服务器,提升系统吞吐量;而高可用架构则通过消除单点故障,保障服务持续运行。本文将从 Nginx/LVS 的核心原理出发,结合 Keepalived 的高可用机制,详解 7 层负载均衡与双 VIP 架构的搭建过程,助力构建稳定可靠的服务集群。
一、负载均衡基础:Nginx 与 LVS 的核心区别
负载均衡技术主要分为4 层(传输层) 和7 层(应用层),Nginx 与 LVS 分别是两者的典型代表,适用场景各有侧重。
1. Nginx:7 层负载均衡
Nginx 是一款轻量级的 HTTP 服务器,同时具备优秀的 7 层负载均衡能力,基于 HTTP/HTTPS 协议工作,支持复杂的路由规则和应用层处理。
核心模块与工作原理:
ngx_http_proxy_module:实现反向代理,通过proxy_pass指令将请求转发至后端服务器,例如:
location /api/ {
proxy_pass http://backend_server; # 转发至后端服务集群
proxy_set_header Host $host; # 传递原始主机头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
ngx_http_upstream_module:管理后端服务器集群,支持多种负载均衡策略:
轮询(默认):按顺序分发请求到各服务器;
weight(权重):server 192.168.1.101 weight=5; 权重越高,接收请求越多,适合服务器性能不均的场景;
ip_hash:根据客户端 IP 哈希值固定分发到某台服务器,解决会话保持问题(如登录状态);
least_conn:优先分发到连接数最少的服务器,适合长连接场景(如 WebSocket)。
优势与适用场景:
支持 URL 路由(如location /static/转发至静态资源服务器)、SSL 卸载(集中处理 HTTPS 加密);
配置简单,适合 Web 应用、API 服务等 7 层协议场景;
单实例能支撑数万并发,通过集群可进一步提升性能。
2. LVS:4 层负载均衡的 “性能王者”
LVS(Linux Virtual Server)是内核级别的 4 层负载均衡技术,基于 TCP/UDP 协议工作,性能远超 Nginx,能支撑百万级并发,适合高吞吐场景。
核心模式与工作原理:
DR 模式(Direct Routing):最常用的模式,LVS 仅处理请求分发,后端服务器直接向客户端返回响应,避免流量回传瓶颈。原理是通过修改数据包的 MAC 地址,将请求转发至后端服务器,后端服务器需配置 VIP(虚拟 IP)在回环网卡;
NAT 模式:请求和响应均经过 LVS,适合后端服务器无法直接访问公网的场景,但存在性能瓶颈(流量翻倍);
TUN 模式:通过 IP 隧道转发数据包,适合跨机房集群,但配置复杂。
调度算法:
rr(轮询)、wrr(加权轮询) 类似 Nginx;
lc(最少连接)、wlc(加权最少连接) 适合长连接服务;
sh(源地址哈希) 类似 ip_hash,实现会话绑定。
优势与适用场景:
内核级转发,性能损耗极低,适合数据库、视频流等 4 层协议服务;
稳定性强,单点故障影响小(可配合 Keepalived 实现高可用)。
二、Keepalived:高可用的 “守护者”
即使负载均衡器性能再强,单点故障仍会导致整个服务中断。Keepalived 基于 VRRP(虚拟路由冗余协议)实现双机热备,确保负载均衡层的高可用。
1. 核心工作原理
VRRP 通过选举机制产生主节点(Master)和从节点(Backup),主节点持有 VIP(虚拟 IP)并处理流量,从节点实时监控主节点状态,当主节点故障时自动接管 VIP,实现无缝切换。
优先级:主节点优先级高于从节点(默认 100,数值越大优先级越高);
心跳检测:主节点定期发送 VRRP 通告报文(默认每 1 秒),从节点若超时未收到则认为主节点故障;
抢占模式:默认开启,当主节点恢复后,会抢占回 VIP(可关闭避免频繁切换)。
2. 健康检测机制
Keepalived 不仅能检测负载均衡器本身的状态,还能通过脚本检测后端服务健康状态,确保流量只分发到正常节点。
配置示例(检测 Nginx 是否存活):
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 检测脚本路径
interval 2 # 每2秒检测一次
weight -20 # 检测失败,优先级减20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100 # VIP
}
track_script {
check_nginx # 关联检测脚本
}
}
检测脚本check_nginx.sh:
#!/bin/bash
if ! ps -C nginx > /dev/null; then
systemctl start nginx # 尝试重启Nginx
sleep 2
if ! ps -C nginx > /dev/null; then
exit 1 # 重启失败,返回非0值触发主从切换
fi
fi
3. Notify 功能:状态切换时的 “自动化工具”
Notify 功能允许在主从状态切换时执行自定义脚本(如发送告警、切换服务配置),提升运维自动化水平。
配置示例:
vrrp_instance VI_1 {
# ... 其他配置 ...
notify_master "/etc/keepalived/notify_master.sh" # 成为主节点时执行
notify_backup "/etc/keepalived/notify_backup.sh" # 成为从节点时执行
notify_fault "/etc/keepalived/notify_fault.sh" # 故障时执行
}
notify_master.sh(发送告警并启用服务):
#!/bin/bash
echo "[$(date)] 切换为主节点,VIP: 192.168.1.100" >> /var/log/keepalived_notify.log
systemctl start nginx # 确保Nginx启动
curl -X POST -d "状态切换:主节点接管VIP" https://alert.example.com # 发送告警
三、实战:Nginx 7 层负载均衡 + 双 VIP 高可用架构
1. 架构设计目标
负载均衡:通过 Nginx 将 HTTP 请求分发到 2 台后端 Web 服务器;
高可用:2 台 Nginx 节点(主从)配合 Keepalived,实现 VIP 自动漂移,避免单点故障;
双 VIP:主节点持有 VIP1(192.168.1.100),从节点持有 VIP2(192.168.1.101),正常情况下分担流量,故障时自动接管对方 VIP。
2. 环境准备
角色 |
主机名 |
IP 地址 |
职责 |
Nginx 主节点 |
lb-master |
192.168.1.10 |
主负载均衡,持有 VIP1 |
Nginx 从节点 |
lb-backup |
192.168.1.11 |
从负载均衡,持有 VIP2 |
后端服务器 1 |
web1 |
192.168.1.20 |
提供 Web 服务 |
后端服务器 2 |
web2 |
192.168.1.21 |
提供 Web 服务 |
3. 搭建步骤
步骤 1:配置后端 Web 服务器
在 web1 和 web2 上部署简单 Web 服务(以 Nginx 为例):
# 安装Nginx
yum install -y nginx
# 编写测试页面
echo "web1: $(hostname -I)" > /usr/share/nginx/html/index.html # web1
echo "web2: $(hostname -I)" > /usr/share/nginx/html/index.html # web2
systemctl start nginx && systemctl enable nginx
步骤 2:配置 Nginx 7 层负载均衡
在 lb-master 和 lb-backup 上配置相同的负载均衡规则(/etc/nginx/conf.d/proxy.conf):
upstream web_servers {
server 192.168.1.20 weight=1; # 后端服务器1
server 192.168.1.21 weight=1; # 后端服务器2
ip_hash; # 启用会话保持
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://web_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
启动 Nginx 并验证:systemctl start nginx && nginx -t
步骤 3:配置 Keepalived 双 VIP 高可用
在 lb-master 上配置/etc/keepalived/keepalived.conf:
global_defs {
router_id LVS_MASTER # 唯一标识
}
# 检测Nginx存活的脚本
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
# VIP1配置(主节点)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100 # 高于从节点
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 # VIP1
}
track_script {
check_nginx
}
notify_master "/etc/keepalived/notify_master.sh"
notify_backup "/etc/keepalived/notify_backup.sh"
}
# VIP2配置(从节点角色)
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 90 # 低于从节点的VI_2优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.101/24 dev eth0 # VIP2
}
track_script {
check_nginx
}
}
在 lb-backup 上配置 Keepalived(与主节点类似,调整state和priority):
VI_1 的state设为 BACKUP,priority设为 90;
VI_2 的state设为 MASTER,priority设为 100。
步骤 4:启动服务并测试
启动 Keepalived:systemctl start keepalived && systemctl enable keepalived;
验证 VIP:在主节点执行ip addr,应看到 VIP1;从节点看到 VIP2;
测试负载均衡:访问http://192.168.1.100和http://192.168.1.101,应交替返回 web1 和 web2 的页面;
测试故障切换:关闭 lb-master 的 Nginx(systemctl stop nginx),等待 3 秒后,在 lb-backup 上执行ip addr,应看到 VIP1 已漂移过来。
四、常见问题与优化
- VIP 冲突:确保后端服务器不配置 VIP,避免 ARP 广播冲突;
- 健康检测频率:interval不宜过短(建议 1-3 秒),避免误判;
- 会话保持:7 层用 Nginx 的ip_hash,4 层用 LVS 的sh算法,或引入 Redis 存储会话;
- 监控告警:结合 Prometheus+Grafana 监控 Nginx 连接数、Keepalived 状态,及时发现异常。
总结
Nginx 与 LVS 分别在 7 层和 4 层负载均衡中发挥核心作用,而 Keepalived 通过 VRRP 协议解决了单点故障问题。双 VIP 架构,既实现了负载分担,又保障了高可用。