載均衡集群指南)
一、什么是集群集群Cluster 是指將多臺(tái)獨(dú)立的計(jì)算機(jī)服務(wù)器通過高速網(wǎng)絡(luò)連接起來協(xié)同完成特定任務(wù)的計(jì)算系統(tǒng)。從外部看整個(gè)集群就像一臺(tái)性能超強(qiáng)的超級(jí)計(jì)算機(jī)。為什么需要集群高可用性HA單點(diǎn)故障時(shí)自動(dòng)切換保證服務(wù)7×24小時(shí)在線高性能HP將請(qǐng)求分散到多臺(tái)服務(wù)器提升整體處理能力高可擴(kuò)展性HS通過增加節(jié)點(diǎn)即可線性擴(kuò)展性能二、集群分類根據(jù)功能和目標(biāo)集群主要分為三大類類型英文縮寫核心目標(biāo)典型產(chǎn)品負(fù)載均衡集群LBLoad Balancing將請(qǐng)求流量分發(fā)到多個(gè)后端服務(wù)器LVS、Nginx、HAProxy高可用集群HAHigh Availability保證服務(wù)持續(xù)在線故障自動(dòng)切換Keepalived、Heartbeat高性能集群HPHigh Performance并行計(jì)算解決大規(guī)??茖W(xué)計(jì)算問題Hadoop、MPI關(guān)系圖解三、LVS的作用LVSLinux Virtual Server是Linux內(nèi)核自帶的四層負(fù)載均衡軟件由章文嵩博士開發(fā)現(xiàn)已成為Linux內(nèi)核標(biāo)準(zhǔn)組件。核心作用請(qǐng)求分發(fā)將用戶請(qǐng)求按規(guī)則分發(fā)到后端真實(shí)服務(wù)器RealServer服務(wù)隱藏后端服務(wù)器的真實(shí)IP對(duì)內(nèi)網(wǎng)可見對(duì)外只暴露VIP虛擬IP水平擴(kuò)展通過增加后端服務(wù)器提升服務(wù)能力高可用性配合Keepalived實(shí)現(xiàn)故障自動(dòng)切換LVS vs Nginx七層負(fù)載對(duì)比項(xiàng)LVS四層Nginx七層工作層級(jí)傳輸層TCP/UDP應(yīng)用層HTTP/HTTPS處理速度極快內(nèi)核態(tài)較快用戶態(tài)協(xié)議支持所有TCP/UDP協(xié)議僅HTTP/HTTPS等配置復(fù)雜度相對(duì)簡單靈活但復(fù)雜典型場景大流量入口、數(shù)據(jù)庫負(fù)載Web應(yīng)用、API網(wǎng)關(guān)四、LVS的4種模式及原理圖解LVS通過修改數(shù)據(jù)包來實(shí)現(xiàn)流量轉(zhuǎn)發(fā)主要有4種工作模式1. NAT模式網(wǎng)絡(luò)地址轉(zhuǎn)換原理請(qǐng)求包到達(dá)LVS后將目標(biāo)IPVIP改為RealServer的IPDNATRS處理請(qǐng)求后將響應(yīng)包發(fā)回LVSLVS再將源IP改為VIP后返回客戶端SNAT特點(diǎn)優(yōu)支持端口映射RS可以使用任何操作系統(tǒng)缺進(jìn)出流量都經(jīng)過LVS成為瓶頸性能最低需修改IP和端口2. DR模式直接路由-最常用原理LVS和RS必須在同一物理網(wǎng)段二層可達(dá)RS的lo接口配置VIP非ARP響應(yīng)LVS僅修改請(qǐng)求包的目標(biāo)MAC地址IP和端口不變RS直接響應(yīng)客戶端不經(jīng)過LVS特點(diǎn)優(yōu)性能最高響應(yīng)不走LVS可處理大規(guī)模流量缺LVS和RS必須在同一VLANRS需要配置VIP和抑制ARPRS配置示例# 在RS上配置VIP到lo ifconfig lo:0 172.25.254.100 netmask 255.255.255.255 up # 抑制ARP響應(yīng) echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce3. TUN模式隧道原理LVS將原始請(qǐng)求包封裝在IPIP隧道中發(fā)送給RSRS解封裝后處理請(qǐng)求直接響應(yīng)客戶端RS需要配置tunl接口和VIP特點(diǎn)優(yōu)支持跨網(wǎng)段部署響應(yīng)流量不經(jīng)過LVS缺有隧道封裝開銷RS需要支持IPIP隧道4. FULLNAT模式全網(wǎng)絡(luò)地址轉(zhuǎn)換— 阿里開源原理同時(shí)修改源IP和目標(biāo)IPLVS和RS可以跨網(wǎng)段部署RS默認(rèn)網(wǎng)關(guān)指向LVS的內(nèi)網(wǎng)IP特點(diǎn)優(yōu)LVS和RS可跨網(wǎng)段解決了DR模式的網(wǎng)絡(luò)限制缺進(jìn)出流量都經(jīng)過LVS性能折中五、LVS的13種調(diào)度算法LVS內(nèi)核支持豐富的調(diào)度算法可分為靜態(tài)算法和動(dòng)態(tài)算法兩類。靜態(tài)算法不檢查RS負(fù)載狀態(tài)算法縮寫原理適用場景輪詢r(jià)r按順序輪流分配RS性能一致時(shí)加權(quán)輪詢wrr按權(quán)重比例分配RS性能有差異時(shí)目標(biāo)地址散列dh同一目標(biāo)IP固定到同一RS緩存服務(wù)器源地址散列sh同一源IP固定到同一RS需要會(huì)話保持動(dòng)態(tài)算法檢查RS負(fù)載狀態(tài)算法縮寫原理適用場景最小連接lc分配給連接數(shù)最少的RS長連接服務(wù)加權(quán)最小連接wlc按權(quán)重比例優(yōu)先給連接數(shù)少的通用推薦最短期望延遲sed特殊wlc算法除以權(quán)重高性能場景永不排隊(duì)nqsed優(yōu)化版無空閑時(shí)不排隊(duì)防止空閑RS等待局部最小連接lblc同一目標(biāo)IP到同一RS的lc帶緩存的Web帶復(fù)制的局部最小連接lblcr先找目標(biāo)IP找不到再用lc大規(guī)模緩存目標(biāo)地址散列dh目標(biāo)IP哈希防火墻集群源地址散列sh源IP哈希會(huì)話保持最少隊(duì)列調(diào)度seq等待隊(duì)列最短的優(yōu)先算法選擇建議# 最常用組合 # 短連接HTTPwlc 或 rr ipvsadm -A -t VIP:80 -s wlc # 長連接數(shù)據(jù)庫lc ipvsadm -A -t VIP:3306 -s lc # 有緩存場景sh源地址哈希 ipvsadm -A -t VIP:80 -s sh六、LVS多端口輪詢問題解決方案問題描述當(dāng)后端服務(wù)有多個(gè)端口如HTTP的80和HTTPS的443我們需要將兩種流量都負(fù)載均衡但LVS的傳統(tǒng)做法是每個(gè)端口單獨(dú)配置# 80端口 ipvsadm -A -t VIP:80 -s rr ipvsadm -a -t VIP:80 -r RS1:80 -m ipvsadm -a -t VIP:80 -r RS2:80 -m # 443端口 ipvsadm -A -t VIP:443 -s rr ipvsadm -a -t VIP:443 -r RS1:443 -m ipvsadm -a -t VIP:443 -r RS2:443 -m缺端口越多配置越繁瑣且無法實(shí)現(xiàn)一組RS同時(shí)支持多個(gè)端口的策略統(tǒng)一。解決方案一防火墻標(biāo)記FWM利用iptables給多個(gè)端口打上相同的防火墻標(biāo)記LVS基于標(biāo)記進(jìn)行調(diào)度# 1. 用iptables給80和443端口打標(biāo)記66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK --set-mark 66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 443 -j MARK --set-mark 66 # 2. LVS使用-f指定防火墻標(biāo)記而非端口 ipvsadm -A -f 66 -s rr # 3. 添加RS使用實(shí)際端口 ipvsadm -a -f 66 -r RS1:80 -m ipvsadm -a -f 66 -r RS2:80 -m # 443同理 ipvsadm -a -f 66 -r RS1:443 -m ipvsadm -a -f 66 -r RS2:443 -m優(yōu)多個(gè)端口共享同一組調(diào)度策略和會(huì)話保持。解決方案二配置文件中統(tǒng)一管理# /etc/sysconfig/ipvsadm 配置示例 -A -f 66 -s wlc -a -f 66 -r 192.168.0.10:80 -m -w 2 -a -f 66 -r 192.168.0.10:443 -m -w 2 -a -f 66 -r 192.168.0.20:80 -m -w 1 -a -f 66 -r 192.168.0.20:443 -m -w 1七、LVS會(huì)話粘滯解決方案問題描述會(huì)話粘滯Session Sticky用戶登錄后后續(xù)請(qǐng)求必須轉(zhuǎn)發(fā)到同一臺(tái)RS否則會(huì)出現(xiàn)未登錄或購物車丟失等問題。LVS默認(rèn)的輪詢算法會(huì)導(dǎo)致同一用戶的請(qǐng)求被分發(fā)到不同RS造成會(huì)話失效。解決方案方案一源地址哈希sh算法 — 簡單有效# 使用源地址哈希同一源IP始終到同一RS ipvsadm -A -t VIP:80 -s sh ipvsadm -a -t VIP:80 -r RS1 -m ipvsadm -a -t VIP:80 -r RS2 -m優(yōu)點(diǎn)配置簡單無額外開銷缺點(diǎn)若RS宕機(jī)該IP的所有用戶都會(huì)受影響無法解決NAT網(wǎng)絡(luò)下多用戶共享IP的問題方案二持久連接-p參數(shù)# 指定持久超時(shí)時(shí)間單位秒 ipvsadm -A -t VIP:80 -s rr -p 300 ipvsadm -a -t VIP:80 -r RS1 -m ipvsadm -a -t VIP:80 -r RS2 -m原理LVS在內(nèi)存中維護(hù)一個(gè)連接跟蹤表記錄源IP→選定RS的映射超時(shí)時(shí)間內(nèi)同一源IP的請(qǐng)求都發(fā)往同一RS。適用配合其他調(diào)度算法如wlc使用兼顧負(fù)載均衡和會(huì)話保持。方案三防火墻標(biāo)記 持久連接解決多端口會(huì)話# 80和443標(biāo)記為66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK --set-mark 66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 443 -j MARK --set-mark 66 # LVS使用標(biāo)記并開啟持久 ipvsadm -A -f 66 -s rr -p 600 ipvsadm -a -f 66 -r RS1 -m ipvsadm -a -f 66 -r RS2 -m效果用戶從HTTP跳轉(zhuǎn)到HTTPS時(shí)仍然保持在同一臺(tái)RS不會(huì)丟失會(huì)話。方案四應(yīng)用層會(huì)話共享終極方案將Session存儲(chǔ)在Redis/Memcached等共享緩存中后端RS無論哪臺(tái)處理都能讀取到用戶會(huì)話。優(yōu)點(diǎn)徹底解決粘滯問題后端RS可隨意擴(kuò)縮容缺點(diǎn)需要修改應(yīng)用程序代碼八、一鍵配置腳本實(shí)戰(zhàn)以下是一個(gè)規(guī)范化的Bash腳本涵蓋了LVS四種模式配置、算法切換、防火墻標(biāo)記和會(huì)話保持等所有核心功能。#!/bin/bash # LVS 四種模式及高級(jí)功能完整配置腳本 (重構(gòu)版) # 適用場景學(xué)習(xí)/測試 LVS 各項(xiàng)核心配置 # 基于截圖內(nèi)容整理添加了環(huán)境檢查與邏輯控制 # 1. 基礎(chǔ)環(huán)境變量 (按需修改) VIP172.25.254.100 RS1172.25.254.10 RS2172.25.254.11 INTERFACEeth0 # 若VIP綁定的網(wǎng)卡名稱不一致請(qǐng)修改這里 # 2. 基礎(chǔ)環(huán)境安裝 (所有模式通用) install_env() { echo 開始安裝 LVS 基礎(chǔ)環(huán)境... # 截圖中的 yum 或 apt此處用最通用的判斷 if command -v yum /dev/null; then yum install -y ipvsadm elif command -v apt /dev/null; then apt update apt install -y ipvsadm else echo 不支持的系統(tǒng)包管理器請(qǐng)手動(dòng)安裝 ipvsadm exit 1 fi # 開啟 IP 轉(zhuǎn)發(fā) (NAT 模式必須) echo 1 /proc/sys/net/ipv4/ip_forward echo 環(huán)境安裝完成。 } # 3. 規(guī)則清理 (每次切換模式前執(zhí)行) clear_rules() { echo 清空所有已有的 LVS 規(guī)則和綁定... ipvsadm -C ip addr del $VIP/32 dev $INTERFACE 2/dev/null echo 規(guī)則已清空。 } # 4. 四種核心模式配置函數(shù) # 模式 A: NAT 模式 (配置 VIP 在 Director 上后端 RS 網(wǎng)關(guān)指向 Director) conf_nat() { clear_rules echo 配置 NAT 模式... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -m ipvsadm -a -t $VIP:80 -r $RS2:80 -m # NAT 模式下后端 RS 的網(wǎng)關(guān)必須指向 Director 的 DIP需在 RS 手動(dòng)配置 echo 注意NAT 模式請(qǐng)確保 RS 的默認(rèn)網(wǎng)關(guān)指向本機(jī)內(nèi)網(wǎng) IP。 } # 模式 B: DR 模式 (企業(yè)常用VIP 綁定在 Lo 網(wǎng)卡抑制 ARP) conf_dr() { clear_rules echo 配置 DR 模式... # Director 上綁定 VIP ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -g ipvsadm -a -t $VIP:80 -r $RS2:80 -g echo 注意DR 模式需要在 RS 上執(zhí)行以下命令 echo ip addr add $VIP/32 dev lo:0 echo echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce echo echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore echo echo 2 /proc/sys/net/ipv4/conf/all/arp_announce } # 模式 C: TUN 模式 (IP 隧道) conf_tun() { clear_rules echo 配置 TUN (隧道) 模式... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -i ipvsadm -a -t $VIP:80 -r $RS2:80 -i echo 注意TUN 模式需要 RS 支持隧道并配置 tunl0。 } # 模式 D: FULLNAT 模式 conf_fullnat() { clear_rules echo 配置 FULLNAT 模式 (需內(nèi)核支持)... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -f ipvsadm -a -t $VIP:80 -r $RS2:80 -f echo 注意FULLNAT 需要特殊的內(nèi)核補(bǔ)丁 (如 LVS 全 NAT 版本)。 } # 5. 調(diào)度算法切換 (常用: 輪詢 rr / 加權(quán) wlc) # 用法示例change_algo wlc change_algo() { local new_algo$1 echo 正在將調(diào)度算法切換為: $new_algo # 需要先用 -E 編輯虛擬服務(wù)來修改調(diào)度算法 ipvsadm -E -t $VIP:80 -s $new_algo # 用 -e 編輯真實(shí)服務(wù)器保持后端權(quán)重等屬性 ipvsadm -e -t $VIP:80 -r $RS1:80 -m -w 1 ipvsadm -e -t $VIP:80 -r $RS2:80 -m -w 2 echo 算法切換完成。 } # 6. 端口輪詢 / FWMARK (防火墻標(biāo)記) # 示例標(biāo)記 80 和 443 為一組 conf_fwmark() { clear_rules echo 配置 FWMARK 標(biāo)準(zhǔn)解決多端口輪詢問題... # 1. 配置 iptables 進(jìn)行端口標(biāo)記 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 10 # 2. 配置 LVS 按 FWMARK 轉(zhuǎn)發(fā) ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r $RS1:80 -m ipvsadm -a -f 10 -r $RS2:80 -m echo FWMARK 配置完成。 } # 7. 會(huì)話保持 (粘滯 Persistent) # 方案 1: SH (源地址哈希) conf_sh_affinity() { clear_rules echo 配置 SH 哈希會(huì)話保持... ipvsadm -A -t $VIP:80 -s sh ipvsadm -a -t $VIP:80 -r $RS1:80 -g -w 1 ipvsadm -a -t $VIP:80 -r $RS2:80 -g -w 2 } # 方案 2: 持久化超時(shí) (LVS 原生) conf_timeout_persistence() { clear_rules local persist_time300 # 設(shè)置 300 秒持久化 echo 配置 LVS 持久化超時(shí) ($persist_time 秒)... ipvsadm -A -t $VIP:80 -s rr -p $persist_time ipvsadm -a -t $VIP:80 -r $RS1:80 -m ipvsadm -a -t $VIP:80 -r $RS2:80 -m } # 方案 3: Redis 共享會(huì)話 (僅提示LVS 只負(fù)責(zé)轉(zhuǎn)發(fā)) conf_redis_session() { echo Redis 共享會(huì)話方案 (無需修改 LVS) echo 此方案不依賴 LVS 配置而是修改后端 Web 應(yīng)用 (如 PHP/Java) 的 Session 存儲(chǔ)。 echo LVS 無需特意配置持久化只需用輪詢 rr/wlc應(yīng)用層通過 Redis 共享 Session 即可。 echo 這樣故障時(shí)也無需擔(dān)心 Session 丟失。 } # 8. 策略保存與開機(jī)自啟 save_rules() { echo 保存當(dāng)前 LVS 規(guī)則... ipvsadm-save /etc/sysconfig/ipvsadm echo 規(guī)則已保存至 /etc/sysconfig/ipvsadm echo 啟用開機(jī)自啟動(dòng)... systemctl enable ipvsadm --now 2/dev/null || echo 請(qǐng)手動(dòng)執(zhí)行: systemctl enable ipvsadm } # 9. 查看當(dāng)前規(guī)則 show_rules() { echo 當(dāng)前 LVS 配置: ipvsadm -Ln echo 連接統(tǒng)計(jì): ipvsadm -Ln --stats } # 10. 使用示例菜單 show_menu() { echo LVS 一鍵配置腳本菜單 echo 1. 安裝基礎(chǔ)環(huán)境 echo 2. 配置 NAT 模式 echo 3. 配置 DR 模式 echo 4. 配置 TUN 模式 echo 5. 配置 FULLNAT 模式 echo 6. 切換調(diào)度算法 (需指定算法名) echo 7. 配置 FWMARK 多端口負(fù)載均衡 echo 8. 配置 SH 源地址哈希會(huì)話保持 echo 9. 配置持久連接會(huì)話保持 echo 10. 保存規(guī)則并設(shè)置開機(jī)自啟 echo 11. 查看當(dāng)前規(guī)則 echo 12. 清空所有規(guī)則 echo 0. 退出 } # 主程序 (支持命令行參數(shù)和交互菜單) main() { # 如果帶了參數(shù)直接執(zhí)行對(duì)應(yīng)功能 case $1 in install) install_env ;; nat) conf_nat ;; dr) conf_dr ;; tun) conf_tun ;; fullnat) conf_fullnat ;; algo) change_algo $2 ;; fwmark) conf_fwmark ;; sh) conf_sh_affinity ;; persist) conf_timeout_persistence ;; save) save_rules ;; show) show_rules ;; clear) clear_rules ;; *) # 沒有參數(shù)則顯示交互菜單 while true; do show_menu read -p 請(qǐng)輸入選項(xiàng)編號(hào): choice case $choice in 1) install_env ;; 2) conf_nat ;; 3) conf_dr ;; 4) conf_tun ;; 5) conf_fullnat ;; 6) read -p 請(qǐng)輸入算法名 (rr/wlc/wrr/sed/nq等): algo; change_algo $algo ;; 7) conf_fwmark ;; 8) conf_sh_affinity ;; 9) conf_timeout_persistence ;; 10) save_rules ;; 11) show_rules ;; 12) clear_rules ;; 0) echo 退出...; exit 0 ;; *) echo 無效選項(xiàng)請(qǐng)重新輸入 ;; esac echo done ;; esac } # 執(zhí)行主程序 main $