LVS基礎-四種模式原理與實現
簡介
LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。本專案在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。現在 LVS 已經是 Linux 核心標準的一部分。使用 LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 作業系統實現一個高效能高可用的 Linux 伺服器叢集,它具有良好的可靠性、可擴充套件性和可操作性。從而以低廉的成本實現最優的效能。LVS 是一個實現負載均衡叢集的開源軟體專案,LVS架構從邏輯上可分為排程層、Server叢集層和共享儲存。
LVS叢集的型別
- lvs-nat:修改請求報文的目標IP;
- lvs-dr:操縱封裝新的MAC地址;
- lvs-tun:在原請求IP報文之外新加一個IP首部;
- lvs-fullnat:修改請求報文的源和目標IP;
ipvsadm命令:
ipvsadm命令: ipvs工作在核心,ipvsadm用來管理ipvs的使用者空間工具 格式:
ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]] [-M netmask][--pe persistence_engine][-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
常用的命令:
新增一個叢集服務
ipvsadm -A -t|u|f service-address [-s scheduler] [-p [ti meout]]
-A:新增一個叢集服務
service-address:一般是vip,提供給使用者訪問的ip
-t|u|f:
-t: TCP協議的埠,VIP:TCP_PORT
-u: UDP協議的埠,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
-s:排程方法,預設wlc
-p:持久連結時間
刪除一個叢集服務
ipvsadm -D -t|u|f service-address
-t|u|f:
-t: TCP協議的埠,VIP:TCP_PORT
-u: UDP協議的埠,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
在叢集中新增一個RS
ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:在叢集中新增一個RS
-t|u|f:
-t: TCP協議的埠,VIP:TCP_PORT
-u: UDP協議的埠,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
-r server-address :後端Real server ip
[-g|i|m]:
-g:gateway, dr型別
-i: ipip, tun型別
-m: masquerade, nat型別
-w:指定權重
從叢集中刪除某個RS
ipvsadm -d -t|u|f service-address -r server-address
-d:刪除
-t|u|f:
-t: TCP協議的埠,VIP:TCP_PORT
-u: UDP協議的埠,VIP:UDP_PORT
-f:firewall MARK,是一個數字;
-r server-address :後端Real server ip
清空定義的所有內容
ipvsadm -C
檢視:
ipvsadm -L|l [options]
options:
--numeric, -n:用數字的格式輸出ip和埠
--exact:expand numbers (display exact values)
--connection, -c:輸出當前ipvs連線
--stats:輸出狀態資訊
--rate :檢視速率
儲存和過載:
ipvsadm -S #儲存規則
ipvsadm -R #過載規則
相關術語
- DS:Director Server。指的是前端負載均衡器節點。
- RS:Real Server。後端真實的工作伺服器。
- VIP:Virtual ip向外部直接面向用戶請求,作為使用者請求的目標的IP地址。
- DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
- RIP:Real Server IP,後端伺服器的IP地址。
- CIP:Client IP,訪問客戶端的IP地址。
排程方法
- 輪叫排程 rr 這種演算法是最簡單的,就是按依次迴圈的方式將請求排程到不同的伺服器上,該演算法最大的特點就是簡單。輪詢演算法假設所有的伺服器處理請求的能力都是一樣的,排程器會將所有的請求平均分配給每個真實伺服器,不管後端 RS 配置和處理能力,非常均衡地分發下去。
- 加權輪叫 wrr 這種演算法比 rr 的演算法多了一個權重的概念,可以給 RS 設定權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr演算法的一種優化和補充, LVS 會考慮每臺伺服器的效能,並給每臺伺服器新增要給權值,如果伺服器A的權值為1,伺服器B的權值為2,則排程到伺服器B的請求會是伺服器A的2倍。權值越高的伺服器,處理的請求越多。
- 最少連結 lc 這個演算法會根據後端 RS 的連線數來決定把請求分發給誰,比如 RS1 連線數比 RS2 連線數少,那麼請求就優先發給 RS1
- 加權最少連結 wlc 這個演算法比 lc 多了一個權重的概念。
- 基於區域性性的最少連線排程演算法 lblc 這個演算法是請求資料包的目標 IP 地址的一種排程演算法,該演算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的伺服器,如果這臺伺服器依然可用,並且有能力處理該請求,排程器會盡量選擇相同的伺服器,否則會繼續選擇其它可行的伺服器
- 複雜的基於區域性性最少的連線演算法 lblcr 記錄的不是要給目標 IP 與一臺伺服器之間的連線記錄,它會維護一個目標 IP 到一組伺服器之間的對映關係,防止單點伺服器負載過高。
- 目標地址雜湊排程演算法 dh 該演算法是根據目標 IP 地址通過雜湊函式將目標 IP 與伺服器建立對映關係,出現伺服器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該伺服器。
- 源地址雜湊排程演算法 sh 與目標地址雜湊排程演算法類似,但它是根據源地址雜湊演算法進行靜態分配固定的伺服器資源
nat模式
過程
- 當用戶訪問Director Server,資料包會先進入核心空間的PREPOUTING鏈,這時候源ip地址為cip(使用者自己的ip),目的ip為vip
- 在PREPOUTING鏈上檢查發現,vip是自己,於是傳送到核心空間的INPUT鏈
- ipvs工作在INPUT鏈上,發現vip是叢集服務。修改資料包的目的ip為後端伺服器的rip(後端伺服器可以不止一個,上圖只是假設分配給了第一臺real server)然後傳送資料包到POSTROUTING鏈
- Director Server將資料包傳送到rip1
- rip1收到請求做出處理,構建響應報文,此時資料包源地址為rip1,目的地址為cip
- 當響應的資料包到達Director Server,Director Server會自動將源ip改為vip,這時候返回給使用者的報文源ip為vip,目的ip為cip
nat模式特點
- RIP和DIP必須在同一個IP網路,且應該使用私網地址;RS的閘道器要指向DIP;
- 請求報文和響應報文都必須經由Director轉發;Director易於成為系統瓶頸;
- 支援埠對映,可修改請求報文的目標PORT;
- vs必須是Linux系統,rs可以是任意系統;
實驗測試: 拓撲圖
DIP:192.168.253.141 RIP1:192.168.253.140 RIP2:192.168.253.129
實驗內容:負載均衡一個web服務。RS1和RS2提供web服務。DR負責將請求分發到2個RS上,因為是校園網,沒辦法使用橋接網路。所以這裡DR伺服器上DIP和VIP都是192.168.253.141
第一步:現在DR上下載ipvsadm,ipvs的使用者空間管理工具
yum install ipvsadm
第二步:在DR上新建一個叢集服務
##新建一個叢集服務
ipvsadm -A -t 192.168.253.141:80 -s rr
##新增2個RS
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.140:80 -m -w 1
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.129:80 -m -w 1
第三步:在RS1和RS2上搭建web服務。
RS1:
yum install httpd
echo "192.168.253.140" > /var/www/html/index.html
systemctl start httpd
RS2:
yum install httpd
echo "192.168.253.129" > /var/www/html/index.html
systemctl start httpd
第四步:測試 成功。
DR模式
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;
過程:
- 使用者傳送請求到DR,首先進入DR核心空間的PREROUTING鏈,檢查發現VIP是自己,於是將資料包傳送到INPUT鏈
- INPUT鏈上工作著ipvs,檢查是否是叢集服務,如果是則將目標MAC地址修改為後端服務Real server的mac地址,然後將資料包傳送到POSTROUTING鏈,此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RS的MAC地址
- 當RS收到資料包的時候,拆開的時候,發現mac是自己,於是接受報文發往INPUT鏈再到使用者空間處理,然後將響應報文傳送出去。這裡不需要將資料包傳送到DR,可以通過別的網絡卡出去。 此時的源IP地址為VIP,目標IP為CIP
- 資料包到達客戶端
DR模式特點:
確保前端路由器將目標IP為VIP的請求報文發往Director,因為RS和DR都擁有VIP,如果前端的路由器發起arp廣播詢問誰是VIP擁有者,這時候如果DR和RS都應答自己擁有VIP就會出現爭搶。導致DR無法正常分配請求給後端RS。解決的方法有幾種
- 在前端閘道器做靜態繫結,將VIP的mac繫結在DR上
- 在RS上使用arptables;在arp的層次上實現在ARP解析時做防火牆規則,過濾RS響應ARP請求。缺點:配置麻煩,複雜
- 在RS上修改核心引數(arp_announce,arp_ignore)以限制arp通告及應答級別;(最常用) 限制響應級別:arp_ignore 0:預設值,表示可使用本地任意介面上配置的任意地址進行響應; 1: 僅在請求的目標IP配置在本地主機的接收到請求報文介面上時,才給予響應; 限制通告級別:arp_announce 0:預設值,把本機上的所有介面的所有資訊向每個介面上的網路進行通告; 1:儘量避免向非直接連線網路進行通告; 2:必須避免向非本網路通告;
RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網路;RIP的閘道器不能指向DIP,以確保響應報文不會經由Director;
- RS跟Director要在同一個物理網路;
- 請求報要文經由Director,但響應不能經由Director,而是由RS直接發往Client;
- 不支援埠對映;
實驗測試: 環境: DR: VIP:192.168.253.192 DIP:192.168.253.141 RS1: VIP:192.168.253.192(lo:0介面上) RIP1:192.168.253.140 RS2: VIP:192.168.253.192(lo:0介面上) RIP1:192.168.253.129
第一步:在DR上設定VIP
ifconfig ens33:0 192.168.253.192 up
第二步:在DR上建立叢集服務
ipvsadm -A -t 192.168.253.192:80 -s rr
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.129 -g -w 1
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.140 -g -w 1
第三步:在RS1上配置VIP,修改核心引數
配置VIP
ifconfig lo:0 192.168.253.192/32 up
修改核心引數
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
第四步:在RS2上配飾VIP,修改核心引數
ifconfig lo:0 192.168.253.192/32 up
修改核心引數
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
第五步:測試,別的伺服器上測試
根據這個過程我們可以作2個指令碼,一個用於DR配置,另一個用於RS配置 DR端配置指令碼
#!/bin/bash
#
vip='192.168.253.192'
iface='en33:0'
mask='255.255.255.255'
port='80'
rs1='192.168.253.140'
rs2='192.168.253.129'
scheduler='rr'
type='-g'
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac
RS端配置指令碼
#!/bin/bash
#
vip=192.168.253.192
mask='255.255.255.255'
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
esac
tun模式
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);
特點: (1) DIP, VIP, RIP都應該是公網地址; (2) RS的閘道器不能,也不可能指向DIP; (3) 請求報文要經由Director,但響應不能經由Director; (4) 不支援埠對映; (5) RS的OS得支援隧道功能;
fullnat模式
通過同時修改請求報文的源IP地址和目標IP地址進行轉發;此型別預設不支援;
(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網路;因此,RIP的閘道器一般不會指向DIP; (2) RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client; (3) 請求和響應報文都經由Director; (4) 支援埠對映;