Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

LVS DR 模式自動化部署腳本:Director 與 RealServer 雙端配置全解析

編輯:Linux 系統常見問題解答

LVS DR(Direct Routing)模式以「請求經 Director、回應直達 Client」著稱,效能最高、架構最簡。本文提供可直接落地的 lvs-dr.sh(Director 端)與 realserver.sh(RealServer 端)腳本,並詳細解析 ARP 抑制、VIP 掛載、調度算法等關鍵細節。

DR 模式流程圖

Request:  Client → VIP (Director eth0:1) → MAC 改寫 → RealServer (DIP)
Response: RealServer → Client (直接,不經 Director)

核心條件:Director 與所有 RealServer 必須在同一個 L2 廣播域(同 VLAN/同交換機)。

環境規劃

角色DIP (實際 IP)VIP (虛擬 IP)介面
Director192.168.142.133192.168.142.211eth0 / eth0:1
RealServer1192.168.142.130192.168.142.211eth0 / lo:0
RealServer2192.168.142.131192.168.142.211eth0 / lo:0

Director 端腳本:/usr/local/lvs/lvs-dr.sh

#!/bin/bash
# lvs-dr.sh — LVS DR 模式 Director 啟停腳本
VIP=192.168.142.211
VPORT=80
RIP1=192.168.142.130
RIP2=192.168.142.131
RPORT=80
IFACE=eth0

usage() { echo "Usage: $0 {start|stop|status}"; exit 1; }
[ $# -eq 1 ] || usage

case $1 in
  start)
    echo "Starting LVS Director..."
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # 1. 綁定 VIP 到 eth0:1(host 路由,避免 ARP 衝突)
    /sbin/ifconfig ${IFACE}:1 ${VIP} broadcast ${VIP} netmask 255.255.255.255 up
    /sbin/route add -host ${VIP} dev ${IFACE}:1

    # 2. 清空 IPVS 規則
    /sbin/ipvsadm -C

    # 3. 新增虛擬服務(輪詢調度)
    /sbin/ipvsadm -A -t ${VIP}:${VPORT} -s rr

    # 4. 新增真實伺服器(-g 表 DR 模式,-w 權重)
    /sbin/ipvsadm -a -t ${VIP}:${VPORT} -r ${RIP1}:${RPORT} -g -w 1
    /sbin/ipvsadm -a -t ${VIP}:${VPORT} -r ${RIP2}:${RPORT} -g -w 1

    /sbin/ipvsadm -L -n
    ;;
  stop)
    echo "Stopping LVS Director..."
    /sbin/ipvsadm -C
    /sbin/ifconfig ${IFACE}:1 down
    ;;
  status)
    /sbin/ipvsadm -L -n
    ;;
  *) usage ;;
esac

RealServer 端腳本:/usr/local/lvs/realserver.sh

#!/bin/bash
# realserver.sh — LVS DR 模式 RealServer 啟停腳本
VIP=192.168.142.211
BCAST=192.168.142.255
IFACE=eth0

usage() { echo "Usage: $0 {start|stop}"; exit 1; }
[ $# -eq 1 ] || usage

case $1 in
  start)
    echo "Configuring RealServer for LVS DR..."

    # 關鍵:ARP 抑制,防止 RealServer 宣告 VIP
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/${IFACE}/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/${IFACE}/arp_announce

    # VIP 掛載在 lo:0(host 路由,netmask 255.255.255.255)
    /sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 broadcast ${BCAST} up
    /sbin/route add -host ${VIP} dev lo:0
    ;;
  stop)
    /sbin/ifconfig lo:0 down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/${IFACE}/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/${IFACE}/arp_announce
    echo "RealServer stopped."
    ;;
  *) usage ;;
esac

關鍵參數深度解析

參數值作用
arp_ignore1只回應目標 IP 配置在本介面的 ARP 請求(lo:0 符合,eth0 不回)
arp_announce2發送 ARP 回應時,強制使用最佳路由介面的源 IP(避免用 DIP 回應 VIP 的 ARP)
netmask 255.255.255.255/32VIP 視為主機路由,不進入區域路由表,防止 RealServer 以 VIP 為源 IP 發封包
-gDR 模式Director 僅改寫 MAC,不修改 IP 標頭,RealServer 直回 Client

持久化與 systemd 整合

# Director 端
cat > /etc/systemd/system/lvs-dr.service <<'EOF'
[Unit]
Description=LVS DR Director
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/lvs/lvs-dr.sh start
ExecStop=/usr/local/lvs/lvs-dr.sh stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now lvs-dr

# RealServer 端(每台均執行)
cat > /etc/systemd/system/lvs-realserver.service <<'EOF'
[Unit]
Description=LVS DR RealServer
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/lvs/realserver.sh start
ExecStop=/usr/local/lvs/realserver.sh stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now lvs-realserver

驗證與壓測

# 1. 確認 VIP 只在 Director eth0:1、RealServer lo:0 出現
ip addr show | grep 192.168.142.211

# 2. Director 查看連線統計
watch -n1 'ipvsadm -L -n --stats --rate'

# 3. Client 端壓測
wrk -t4 -c200 -d30s https://192.168.142.211/
# 觀察 RealServer 1/2 讀取請求日誌交替出現

常見坑點

  • ❌ VIP 能 ping 通但 curl 不通:RealServer 未啟動 Web 服務、或防火牆攔截 80 埠
  • ❌ 單點流量全跑一台:檢查 -s rr(輪詢)是否生效、RealServer 權重 -w 是否一致
  • ❌ ARP 衝突導致斷連:確認 arp_ignore/arp_announce 只在 all 與 eth0 設定,不要 設 lo
  • ❌ 跨 VLAN/路由器部署:DR 模式不支援,需改 NAT 或 TUN 模式

結語: LVS DR 模式腳本化後,新增 RealServer 僅需修改腳本變數並重啟服務,極適合水平擴展的無狀態 Web 叢集。搭配 Keepalived 實現 Director 雙機熱備,即可構建企業級四層負載均衡基礎設施。

Copyright © Windows教程網 All Rights Reserved