Nginx + Keepalived 高可用负载均衡集群实现
Nginx 作为高性能的反向代理服务器,结合 Keepalived 实现 VIP(虚拟 IP)漂移,可以构建高可用的负载均衡集群。以下是具体实现方法:
环境准备
- 两台以上服务器安装 Nginx 和 Keepalived
- 统一的虚拟 IP(VIP),例如 10.96.4.32
- 所有节点配置相同的 Nginx 负载均衡规则
Nginx 负载均衡配置
在每台 Nginx 服务器上配置相同的 upstream 规则,指向后端应用服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| http { upstream backend { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; }
server { listen 80; location / { proxy_pass http://backend; } } }
|
Keepalived 主节点配置
主节点(Master)配置文件 /etc/keepalived/keepalived.conf:
注:# 主备节点设为BACKUP+nopreempt才可以实现非抢占式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| ! Configuration File for keepalived
global_defs { router_id lb02 #标识信息 }
vrrp_script check { script "/usr/local/nginx/check/check_nginx.sh" interval 4
}
vrrp_instance VI_1 { state BACKUP #角色是master/backup # 所有节点设为BACKUP+nopreempt才可以实现非抢占式 interface eth0 #vip 绑定端口 virtual_router_id 40 #让master 和backup在同一个虚拟路由里,id 号必须相同; priority 150 #优先级,谁的优先级高谁就是master ; advert_int 3 #心跳间隔时间 nopreempt #非抢占式 authentication { auth_type PASS #认证 auth_pass 1111 #密码 }
virtual_ipaddress { 10.96.4.32 #虚拟ip }
track_script { check } }
|
Keepalived 备节点配置
备节点(Backup)配置文件差异部分:
1 2 3 4 5 6 7 8 9
| global_defs { router_id lb01 }
vrrp_instance VI_1 { state BACKUP priority 100 # 其他配置与主节点相同 }
|
脚本本地检测,防止脑裂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
NGPID=$(ps -C nginx --no-header|wc -l) NGINX=/usr/local/nginx/sbin/nginx HTTPCODE=$(curl -s -o /dev/null -w "%{http_code}" "http://192.168.1.101:8080/RATIOHandleProject/ProxyService/ReportListProxyService?wsdl") if [ $NGPID -lt 4 ];then # $NGINX # sleep 2 NGPIDT=$(ps -C nginx --no-header|wc -l) if [ $NGPIDT -lt 4 ] && [ "$HTTPCODE" -ne 200 ];then service keepalived stop $NGINX -s stop fi fi
|
健康检查机制
Keepalived 通过以下方式确保高可用:
- 每 4 秒执行
check_nginx.sh 检查 Nginx 进程状态以及后端程序可用性检测
- 当 Nginx 和后端程序异常时,触发 VIP 漂移到备用节点
- 主节点恢复后,VIP 不自动回切(因设置
nopreempt 禁用抢占模式)
- 心跳VIP之间每3秒进行VRRP协议通信检测
注意事项
- 确保防火墙允许 VRRP 协议通信(IP 协议号 112)
- 所有节点时间同步(NTP 服务)
- 建议配置邮件报警通知运维人员
- 生产环境建议使用至少 3 个节点避免脑裂问题
- 监控Nginx和Keepalived的运行状态(zabbix/prometheus)
通过这种架构,可以实现前端负载均衡服务的毫秒级故障转移,确保业务连续性。