前言
在分布式架构中,负载均衡和高可用是保障系统稳定性的两大核心能力。本文将深入讲解如何通过Nginx实现七层负载均衡,并结合Keepalived构建无单点故障的高可用架构。文末附完整配置模板!
一、Nginx负载均衡实现方案
1. 核心原理
Nginx通过反向代理将客户端请求分发到多个后端服务器,基于Upstream模块实现流量调度,支持多种负载算法。
2. 基础配置模板
http {
upstream backend {
# 默认轮询算法
server 192.168.1.101:80 weight=5; # 权重配置
server 192.168.1.102:80 max_fails=3 fail_timeout=30s; # 健康检查
server 192.168.1.103:80 backup; # 备用节点
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
3. 负载均衡算法对比
算法 | 配置指令 | 适用场景 | 特点 |
---|---|---|---|
轮询(默认) | 默认 | 通用场景 | 简单公平,支持权重 |
最少连接 | least_conn |
长连接服务(如数据库) | 动态分配,资源利用率高 |
IP哈希 | ip_hash |
会话保持需求 | 固定用户->服务器映射 |
一致性哈希 | hash $key |
缓存服务器集群 | 减少缓存击穿 |
4. 高级功能实现
- 健康检查(被动模式):
server 192.168.1.102 max_fails=3 fail_timeout=30s;
- 流量分割(灰度发布):
upstream backend { server 192.168.1.101 weight=90; # 90%流量到新版本 server 192.168.1.102 weight=10; # 10%流量到旧版本 }
二、Nginx高可用架构(Keepalived方案)
1. 架构原理
通过VRRP协议实现虚拟IP(VIP)漂移,主备节点自动切换,保障服务不间断。
2. 环境准备
- 两台Nginx服务器(主:192.168.1.101,备:192.168.1.102)
- 虚拟IP:192.168.1.100(对外暴露的统一入口)
3. Keepalived配置详解
主节点配置(/etc/keepalived/keepalived.conf):
global_defs {
router_id nginx_master # 标识节点名称
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 健康检查脚本
interval 2
weight -20 # 检测失败时降低优先级
}
vrrp_instance VI_1 {
state MASTER # 初始状态
interface eth0 # 物理网卡名称
virtual_router_id 51 # 集群ID(必须一致)
priority 100 # 初始优先级(主>备)
advert_int 1 # 心跳间隔
authentication { # 认证配置
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP
}
track_script { # 绑定健康检查
chk_nginx
}
}
备节点配置(仅不同部分):
state BACKUP # 设置为备用
priority 90 # 优先级低于主节点
4. 健康检查脚本
创建 /etc/keepalived/check_nginx.sh
:
#!/bin/bash
# 检测Nginx进程是否存在
if ! pgrep -x "nginx" > /dev/null; then
systemctl restart nginx || exit 1 # 尝试重启,失败则返回1
fi
# 可选:HTTP状态检测
curl -s http://localhost/health > /dev/null || exit 1
赋予执行权限:
chmod +x /etc/keepalived/check_nginx.sh
5. 启动与验证
systemctl start keepalived # 启动服务
systemctl enable keepalived # 设置开机自启
查看VIP绑定:
ip addr show eth0 | grep 192.168.1.100
三、高级优化方案
1. 双主模式(Active-Active)
# 节点1额外配置
vrrp_instance VI_2 {
state MASTER
virtual_router_id 52
priority 100
virtual_ipaddress { 192.168.1.101/24 }
}
# 节点2额外配置
vrrp_instance VI_2 {
state BACKUP
virtual_router_id 52
priority 90
virtual_ipaddress { 192.168.1.101/24 }
}
2. 结合DNS轮询
- 将多个VIP绑定到同一个域名
- 实现多级负载均衡(DNS层+Nginx层)
3. 监控告警集成
- Prometheus监控指标:
# 安装nginx_exporter location /stub_status { stub_status; allow 127.0.0.1; deny all; }
四、常见问题与解决方案
问题现象 | 排查步骤 | 解决方案 |
---|---|---|
VIP不漂移 | 1. 检查防火墙是否允许VRRP协议 2. 查看keepalived日志 |
开放IP协议号112 |
脑裂(双主) | 1. 检查网络连通性 2. 确认virtual_router_id唯一 |
配置不同的router_id |
健康检查误判 | 1. 检查脚本执行权限 2. 增加curl超时设置 |
优化检测逻辑 |
总结
通过Nginx实现负载均衡可提升系统吞吐量,而结合Keepalived的高可用方案能确保服务零中断。实际部署时需注意:
- 根据业务场景选择合适的负载算法
- VIP需与物理网络在同一子网
- 生产环境建议使用双主+健康检查增强模式