前言
在分布式架構中,負載均衡和高可用是保障系統穩定性的兩大核心能力。本文將深入講解如何通過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 2weight -20 # 檢測失敗時降低優先級
}vrrp_instance VI_1 {state MASTER # 初始狀態interface eth0 # 物理網卡名稱virtual_router_id 51 # 集群ID(必須一致)priority 100 # 初始優先級(主>備)advert_int 1 # 心跳間隔authentication { # 認證配置auth_type PASSauth_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; thensystemctl 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 MASTERvirtual_router_id 52priority 100virtual_ipaddress { 192.168.1.101/24 }
}# 節點2額外配置
vrrp_instance VI_2 {state BACKUPvirtual_router_id 52priority 90virtual_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需與物理網絡在同一子網
- 生產環境建議使用雙主+健康檢查增強模式