背景介紹:為什麼選擇 LVS 負載均衡?

在高併發 Web 架構中,隨着用户量增長,單台服務器的性能瓶頸和單點故障問題會愈發突出。傳統應用層負載均衡(如 Nginx)雖配置靈活,但在百萬級併發場景下,用户態轉發的性能限制會顯現。

LVS(Linux Virtual Server)作為內核級負載均衡方案,工作在傳輸層(Layer 4),通過 IPVS 模塊直接在內核中處理數據包轉發,無需用户態與內核態的頻繁切換,可輕鬆支撐百萬級併發連接,且資源佔用極低。其 NAT 模式配置簡單,無需修改後端服務器網絡架構,是大型互聯網企業高併發場景的首選方案,也適合負載均衡入門者快速掌握內核級負載均衡的核心原理。

本文將在 CentOS 7 系統上從零部署完整的 LVS 負載均衡集羣(NAT 模式),覆蓋環境準備、核心配置、效果驗證及持久化優化,助力快速構建高可用、高併發的 Web 架構。

核心關鍵詞解釋

  • LVS(Linux Virtual Server):集成於 Linux 內核的開源負載均衡項目,通過 IPVS 模塊實現高效數據包轉發,支持 NAT、DR、TUN 三種模式;
  • IPVS(IP Virtual Server):LVS 的核心內核模塊,負責實現負載均衡的調度算法和數據包轉發邏輯,無需額外安裝;
  • VIP(Virtual IP):虛擬 IP 地址,對外提供統一的服務訪問入口,客户端僅需訪問 VIP 即可享受負載均衡服務;
  • Director(調度器):運行 LVS 的服務器,負責接收客户端請求,根據調度算法轉發至後端真實服務器;
  • RS(Real Server):後端真實服務器,運行 Web 等應用服務,處理調度器轉發的請求;
  • NAT 模式:LVS 三種模式之一,通過地址轉換實現請求轉發,所有進出流量均經過調度器,配置簡單但存在流量瓶頸;
  • 調度算法:LVS 分發請求的規則,常用輪詢(rr)、加權輪詢(wrr)、最小連接(lc)等;
  • ipvsadm:LVS 的用户態管理工具,用於配置、查看和修改 LVS 負載均衡規則。

一、LVS 簡介與 NAT 模式原理

1. 什麼是 LVS?

LVS 是一個開源負載均衡項目,已集成到 Linux 內核中。它通過 IPVS(IP Virtual Server)模塊實現高效的數據包轉發,無需額外安裝內核,僅需通過用户態工具(如 ipvsadm)即可配置和管理。

2. NAT 模式工作原理

NAT(Network Address Translation)模式是 LVS 三種常用模式(NAT、DR、TUN)中配置最簡單的一種,其流量路徑遵循以下流程:

  1. 客户端發送請求至 LVS 的虛擬 IP(VIP);
  2. LVS 調度器(Director)接收請求後,根據預設的調度算法(如輪詢)將請求轉發給後端真實服務器(Real Server,簡稱 RS);
  3. 真實服務器處理請求後,將響應流量返回給 LVS 調度器(因真實服務器網關指向 LVS);
  4. LVS 調度器對響應流量做地址轉換,最終返回給客户端。

3. NAT 模式優缺點

  • ✅ 優點:配置簡單,真實服務器無需修改網絡配置,僅需指定網關即可;
  • ⚠️ 缺點:所有進出流量均需經過 LVS 調度器,LVS 易成為流量瓶頸,不適合超大規模併發場景。

二、實驗環境規劃

本次搭建需 3 台 CentOS 7 服務器,角色、主機名、IP 地址規劃如下表所示(LVS 公私網 IP 一致):

主機角色

主機名

操作系統

IP 地址

LVS 調度器

lvs-director

CentOS 7

虛擬 IP(公私網一致):10.0.0.1

真實服務器 1

web1

CentOS 7

內網 IP:10.0.0.2

真實服務器 2

web2

CentOS 7

內網 IP:10.0.0.3

三、步驟 1:準備後端 Web 服務器

若尚未部署 Web 服務,需在 web1 和 web2 上分別搭建簡單 Web 頁面(以 Apache 為例),確保後端服務可正常響應請求:

1. 在 web1 上執行

bash

# 安裝 Apache 服務(從 CentOS 官方 YUM 源獲取)
yum install -y httpd

# 創建 Web 首頁(標識 web1,便於測試時區分節點)
echo "<h1>Welcome to web1</h1>" > /var/www/html/index.html

# 啓動 Apache 並設置開機自啓(確保服務器重啓後服務自動運行)
systemctl start httpd
systemctl enable httpd

2. 在 web2 上執行

僅需將 Web 首頁內容改為 Welcome to web2,其餘命令與 web1 一致:

bash

yum install -y httpd
echo "<h1>Welcome to web2</h1>" > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd

3. 驗證 Web 服務

在 LVS 調度器或其他內網機器上,通過內網 IP 訪問 web1 和 web2,確認頁面正常返回:

bash

# 訪問 web1(應返回 web1 標識頁面)
curl http://10.0.0.2

# 訪問 web2(應返回 web2 標識頁面)
curl http://10.0.0.3

四、步驟 2:配置 LVS 調度器(Director)

LVS 調度器是整個負載均衡集羣的核心,需完成工具安裝、IP 轉發啓用、防火牆配置三個關鍵操作,確保數據包能正常轉發。

1. 安裝 LVS 管理工具

LVS 內核模塊(IPVS)默認已集成到 CentOS 7 內核中,無需額外安裝,僅需安裝用户態管理工具 ipvsadm

bash

yum install -y ipvsadm

2. 啓用 IP 轉發(關鍵!)

LVS 作為調度器,需開啓內核 IP 轉發功能,否則無法將客户端請求轉發至後端真實服務器:

bash

# 臨時啓用 IP 轉發(重啓後失效,用於快速測試)
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久啓用 IP 轉發(修改配置文件,重啓後仍生效)
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

# 使配置立即生效
sysctl -p

# 驗證 IP 轉發是否啓用(輸出 1 表示已啓用)
sysctl net.ipv4.ip_forward

3. 設置防火牆(可選)

若系統啓用了 firewalld,需開放 80 端口(Web 服務默認端口),或臨時關閉防火牆(僅測試環境推薦):

bash

# 方案 1:開放 80 端口(推薦,生產環境適用)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

# 方案 2:臨時關閉 firewalld(測試環境適用,簡化配置)
systemctl stop firewalld

五、步驟 3:配置 LVS 虛擬服務(NAT 模式)

通過 ipvsadm 命令創建 LVS 虛擬服務規則,指定 VIP、調度算法和後端真實服務器,實現請求分發:

bash

# 1. 清空現有 LVS 規則(首次配置可省略,避免舊規則干擾)
ipvsadm -C

# 2. 添加虛擬服務:VIP 為 10.0.0.1,端口 80,調度算法為輪詢(rr)
ipvsadm -A -t 10.0.0.1:80 -s rr

# 3. 添加後端真實服務器(-m 表示 NAT 模式)
ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.2:80 -m  # 添加 web1 節點
ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.3:80 -m  # 添加 web2 節點

關鍵參數説明

參數

含義

-A

添加虛擬服務(Virtual Server)

-a

為虛擬服務添加真實服務器(Real Server)

-t VIP:PORT

指定虛擬服務的 TCP 協議和端口(如 10.0.0.1:80)

-s rr

調度算法為輪詢(round-robin),其他常用算法:wrr(加權輪詢)、lc(最小連接)

-m

指定 LVS 模式為 NAT(Masquerading)

-r RS_IP:PORT

指定後端真實服務器的 IP 和端口

六、步驟 4:配置真實服務器網關(關鍵!)

NAT 模式要求真實服務器的默認網關指向 LVS 調度器的 IP(10.0.0.1),否則真實服務器的響應流量無法返回給 LVS,客户端將收不到響應。

1. 在 web1 和 web2 上修改網關

bash

# 編輯網卡配置文件(假設網卡為 eth0,實際需根據服務器網卡名稱調整,可通過 ip addr 查看)
vi /etc/sysconfig/network-scripts/ifcfg-eth0

# 在文件末尾添加網關配置(指向 LVS 調度器 IP)
GATEWAY=10.0.0.1

2. 重啓網絡服務生效

bash

systemctl restart network

3. 驗證網關配置

bash

# 查看默認網關,輸出應包含"default via 10.0.0.1 dev eth0"
ip route show default

七、步驟 5:測試負載均衡效果

配置完成後,需驗證 LVS 是否能將請求均勻分發到後端兩台真實服務器。

1. 命令行測試(推薦)

在任意客户端(或 LVS 調度器本機)執行循環請求 VIP,觀察返回結果是否交替顯示 web1 和 web2 的頁面:

bash

# 循環請求 10 次 VIP(10.0.0.1)
for i in {1..10}; do
  curl -s http://10.0.0.1
done

預期輸出(輪詢交替)

plaintext

<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
...

2. 瀏覽器測試

打開瀏覽器,訪問 http://10.0.0.1,多次刷新頁面,觀察頁面內容是否交替變化(若瀏覽器緩存影響,可開啓無痕模式測試)。

八、步驟 6:持久化 LVS 規則(開機自啓)

LVS 規則默認保存在內存中,服務器重啓後規則會丟失。需通過 systemd 創建服務,實現 LVS 規則開機自動加載,確保服務穩定性。

1. 創建 LVS 服務文件

bash

cat > /etc/systemd/system/lvs.service <<EOF
[Unit]
Description=LVS Load Balancer (NAT Mode)
After=network.target  # 網絡服務啓動後再啓動 LVS 服務

[Service]
Type=oneshot  # 一次性執行服務
# 啓動時清空舊規則並重新創建 LVS 規則(與步驟 3 配置一致)
ExecStart=/sbin/ipvsadm -C && \
         /sbin/ipvsadm -A -t 10.0.0.1:80 -s rr && \
         /sbin/ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.2:80 -m && \
         /sbin/ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.3:80 -m
RemainAfterExit=yes  # 執行完成後保持服務活躍狀態

[Install]
WantedBy=multi-user.target  # 多用户模式下啓動
EOF

2. 啓用並啓動服務

bash

# 重新加載 systemd 配置(識別新創建的服務)
systemctl daemon-reload

# 設置開機自啓(服務器重啓後自動加載 LVS 規則)
systemctl enable lvs

# 啓動服務(立即加載 LVS 規則)
systemctl start lvs

# 驗證服務狀態(輸出 active 表示正常)
systemctl status lvs

九、常用命令與排錯

1. 常用 LVS 管理命令

功能

命令

查看 LVS 規則(詳細信息,數字格式顯示 IP 和端口)

ipvsadm -ln

查看當前連接數(客户端 IP、後端 RS 等)

ipvsadm -lnc

清空所有 LVS 規則

ipvsadm -C

保存 LVS 規則到文件

ipvsadm -S > /etc/sysconfig/ipvsadm

從文件加載 LVS 規則

ipvsadm -R < /etc/sysconfig/ipvsadm

測試後端 RS 連通性

curl http://10.0.0.2(web1)、curl http://10.0.0.3(web2)

檢查真實服務器網關

ip route show default

2. 常見問題排查

問題 1:訪問 VIP 無響應
  • 檢查 LVS 調度器的安全組是否開放 80 端口(雲服務器場景);
  • 檢查 LVS 調度器的防火牆是否放行 80 端口(firewall-cmd --list-ports);
  • 檢查真實服務器的網關是否正確指向 LVS 的 IP(10.0.0.1);
  • 檢查真實服務器的 Web 服務是否正常運行(systemctl status httpd)。
問題 2:只有一台後端 RS 響應
  • 檢查 LVS 規則是否包含兩台 RS(ipvsadm -ln);
  • 檢查未響應的 RS 的 Web 服務是否正常(curl http://RS_IP);
  • 檢查未響應的 RS 的網關是否正確配置(ip route show default)。
問題 3:連接超時
  • 在 LVS 調度器上使用 tcpdump 抓包分析流量路徑,例如: bash
# 抓取與 web1(10.0.0.2)相關的 80 端口流量
tcpdump -i eth0 host 10.0.0.2 and port 80
  • 檢查 LVS 與 RS 之間的網絡是否通暢(ping 10.0.0.2ping 10.0.0.3)。

十、總結與進階建議

1. 總結

本文完整演示了在 CentOS 7 上從零搭建 LVS 負載均衡集羣(NAT 模式)的流程,核心亮點:

  • LVS 工作在傳輸層,內核級轉發,低延遲、高吞吐,適合高併發場景;
  • NAT 模式配置簡單,無需修改後端 RS 的網絡架構,僅需指定網關即可快速部署;
  • LVS 公私網 IP 統一為 10.0.0.1,簡化網絡配置,降低入門門檻;
  • 通過 systemd 實現 LVS 規則開機自啓,確保服務重啓後仍能正常工作。

同時需注意,NAT 模式的侷限性在於 LVS 調度器會成為流量瓶頸,所有進出流量均需經過調度器,不適合超大規模集羣。

2. 進階學習方向

  • 🔄 切換至 LVS-DR 模式(Direct Routing):DR 模式下,RS 直接將響應流量返回給客户端,繞過 LVS 調度器,突破 NAT 模式的性能瓶頸,適合大規模集羣;
  • 🛡️ 集成 Keepalived:實現 LVS 調度器的高可用(主備自動切換),避免 LVS 單點故障,確保負載均衡服務不中斷;
  • 📊 監控與運維:結合 Prometheus + Node Exporter + Grafana 監控 LVS 的連接數、轉發效率、後端 RS 狀態等指標,實時掌握集羣運行狀態,及時發現並處理異常。

總結

LVS 作為內核級負載均衡方案,憑藉其高性能、低資源佔用的優勢,成為高併發場景的核心組件。本文通過 NAT 模式的實戰部署,幫助快速理解 LVS 的工作原理和配置邏輯,適合作為負載均衡進階學習的基礎。

後續可根據業務規模,靈活選擇 LVS 模式(NAT/DR/TUN),並結合 Keepalived、監控工具等,構建更穩定、可擴展的高可用架構。