LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。
LVS集群采用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
1,Cluster 理論
1.1,系統拓展的方式:
scale up:向上發展;
scaleout:向外發展;
1.2,集群類型:
LB:負載均衡集群 -->將一個系統上所面臨的諸多負載load Banlancing另外一個主機上;
硬件: F5 Big-ip
Citrix Netscaler
A10 A10
軟件:Lvs(大型網站)除了負載均衡沒有其他的健康檢測狀態;
haproxy, nginx (居多),httpd(proxy模塊) ,varnish
ats (apache traffic server)發展需要;
perlbal
基於工作協議層劃分:
傳輸層: Lvs,haproxy(模擬出TCP層可調度mode tcp);
應用層:haproxy(個別協議),nginx,ats,perlbal
HA:高可用集群,high availability
HP:高性能集群,high performancing
分布式存儲及並行處理集群,
1.3,系統:
可擴展性;
可用性;
容量;例如高速公路,可以跑多少汽車; 單位時間內完成的總量;
性能;例如車速,單位時間內通過的汽車數量;響應時間;
注意,系統運維:可用性-->做好標准化-->自動化運維 (穩定性高於一切);
#################################################################################
2,構建高可用擴展性系統的重要原則,在系統內部盡量避免穿行和交互;
GSLB: Global serviceload balancing全局負載均衡
SLB:service load balancing 服務負載平衡
分層:負載均衡層靜態內容層 數據存儲層
動態內容層
分割:功能上分割,把不同的請求分布到不同的server;
分布式:
分布式應用;
分布式靜態資源;
分布式數據和存儲;
分布式計算;
2.1,四層交換,四層路由
根據請求報文的目標IP和port將其轉發至後端主機集群中的某一台主機(根據負載均衡算法);
netfilter:
入站: prerouting------>input;
轉發:prerouting---> forward--->postrouting;
出站:output---->postrouting;
2.2,Lvs :
ipvsadm (寫規則)/ipvs(定義規則) 工作在netfilter的內核中;
ipvsadm:用戶空間的命令行工具,用於管理集群服務;
ipvs:工作在內核中netfilter INPUT 鉤子協議上;
支持TCP、UDP、AH、EST、AH_EST、SCTP等協議;
2.3,Centos 7 查看調度模塊信息;
# grep -i -A 10 'IPVS'/boot/config-3.10.0-229.el7.x86_64
2.4,Lvs arch :
調度器:director(導演)、dispatcher(調度員)、
RS:Real server,
client IP:cip
directorvirutal ip:vip
director ip:dip
real serverip:rip
2.5,Lvs type:
A, Lvs-nat:基於Dnat模式masquerade(地址偽裝)類型
B,Lvs-dr:直接路由directrouting,gateway類型
C,Lvs-tun:ip隧道 ip tunnelingIPIP 隧道類型
D,Lvs-fullnat:非標准類型 請求報文轉發時修改源、目標地址
A,Lvs-nat:
多目標的DNAT(iptables);
通過修改請求報文的目標IP地址和端口,完成端口映射,至挑選出某RS的RIP地址實現轉發;
(1) RS應該和DIP使用私網地址,且RS的網關需要指向DIP;
(2)請求和響應報文都要經由director轉發;極高負載的場景中,director可能會成為系統瓶頸;
(3)RS 可以使用任意OS,支持端口映射;
(4)RS的RIP和director的DIP必須在同一IP網絡;
如圖1.1所示:
B,Lvs-dr:direct routing
通過修改請求報文的目標mac地址進行轉發;
director:VIP ,DIP
RSs:RIP,VIP
(1)必須保證前段路由器將目標IP為VIP的請求報文發送給director;
解決方案:
靜態綁定;director MAC地址綁定
arptables;在每個real server 啟用arptables,
修改RS主機內核參數(linux 主機);
(2)RS的RIP可以使用私有地址,但也可以使用公網地址;
(3)RS根director必須在同一物理網絡;
(4)請求報文經由director調度,但響應報文不一定能經由director(由RS直接轉發);
(5)不支持端口映射
(6)RS可以大多數OS;
(7)RS的網關不能指向DIP;
#################################################################################
3,Lvs -type
Lvs-nat:RIP與DIP必須在同一網段;
Lvs-dir: director與RS必須在同一網段;
Lvs-tun:
不修改請求報文的IP首部,而是通過原有的IP首部之外,在封裝一個IP首部;
(1)RIP、DIP、VIP都是公網地址;
(2)RS網關不能指向DIP,
(3)請求報文經由director調度,響應報文必須不經由director;
(4)不支持端口映射,RS的OS必須支持隧道功能;
Lvs-fullnat:可以跨機房設置
請求報文到達時,director同時修改報文的源地址和目標地址;
(1)VIP是公網地址,DIP和RIP可以不在同一網段;
(2)RS接收到的請求報文源地址為DIP,因此要響應給DIP;
(3)請求報文和響應報文必須經由director;
(4)支持端口映射,RS的OS可以使用任意OS;
4,http:stateless
追蹤每一客戶端,需要給每一個客戶端發放一個cookie;
session保持:將來自於同一個用戶的請求,調用到同一個RS;
session綁定:請求報文插入cookie, (nginx可以,lvs不可以
session集群;session主從機制會浪費內存、cpu等消耗;
session服務器;共享存儲服務器,KV機制存儲;
5,Lvs scheduler:
靜態方法:僅根據算法本身進行調度,不考慮負載狀態;起點公平
RR: roundrobin ,輪詢
WRR:weighted rr ,加權
SH:source hash 源地址hash 實現session保持;損害負載均衡的效果;
將來自同一個IP的請求始終調度至同一RS;反向代理
DH:destination hash,目標地址hash,不管來自哪一個的請求,請求同一個目標時,都會調度至同一個RS, 正向代理
動態方法:根據算法及各RS的當前負載狀態進行調度;sh
LC:least connection 最少連接數;
overhead=active(活躍的鏈接數量)*256+inactive(不活躍的連接數)
WLC:weighted least connection 加權最少連接;
overhead=(active(活躍的)*256+inactive(不活躍的))/weight 服務器權重
SED:最短期望延遲 shortest expection delay
overhead=(active+1)*256/weight
NQ:never queue
SED算法改進
LBLC:locality-based lc,動態DH算法,實現正向代理時;
LBLCR:帶復制的的LBLC
權重大的響應請求,分配延遲
#######################################################################################
靜態
局部性:空間 + 時間
制作緩存時,基於內存的緩存方式
動態內容:時間 + 特定
制作緩存時,根據用戶時長判斷;
######################################################################
6,Lvs的集群服務:TCP、UDP、ah、esp
(1)一個ipvs主機可以同時定義多個clusterserver;
根據tcp,udp
(2)一個cluster server上至少有一個real server;
定義時:指明lvs-type 以及lvs scheduler(程序機);
7,ipvsadm的用法:
A,管理集群服務;
ipvsadm-A|E -t|u|f service-address [-s scheduler]
增加和修改
ipvsadm-D -t|u|f service-address
刪除
ipvsadm-C刪除
ipvsadm -L | l [options]
service-address:
tcp:-t ip:port
udp:-u ip:port
fwm:-f mark 數字防火牆標記;
-sscheculer:默認為wlc 非活動鏈接數量
B,管理集群服務中的RS;
ipvsadm -a|e -t|u|f service-address -rserver-address [-g|i|m] [-wweight]
ipvsadm -d -t|u|f service-address -r server-address
server-address;
ip [:port] 支持端口映射;大多數端口可省略;
Lvs-type:
-g:gateway,dr
-i:ipip, tun
-m:masquerade,nat nat模型
C, 清空和查看:
ipvsadm -C
ipvsadm -L | l[options]
-n:numberic 基於數字格式顯示地址和端口;
-c:connection 顯示ipvs連接數;
--stats:統計數據;pkts:總包數
--rate:速率; pps 每秒的包個數
--exact:精確值;
--sort:排序;
D, 保存和重載:
ipvsadm -R重載
ipvsadm -S [-n] 保存
E,置零計數器:
ipvsadm -Z[-t|u|f service-address]
######################################################################################################
二,實操部分
Lvs-nat
1,DIP 設置:director准備兩個網口,一個是網橋,一個是虛擬網卡2;
# cd /etc/sysconfig/network-scripts/
# vimifcfg-eno16777736
#ifconfig -a
查看eno16777736地址
設置另外一個端口vmnet2:
# cpifcfg-eno16777736 ifcfg-eno33554984
# vim ifcfg-eno33554984刪除UUID更改NAME、DEVICE參數;
2,接下來我們配置另外兩台web機器:
分別配置兩台web服務器的IP地址,和web服務;
然後在director上面測試兩個頁面;並關閉iptables防護牆;
#curl http://192.168.20.7
#curl http://192.168.20.8
#iptables -F
在director上轉發功能打開
# cat /proc/sys/net/ipv4/ip_forward
# vim /etc/sysctl.conf編輯添加"net.ipv4.ip_forword = 1"
3,現在在director上面設置規則:
# ipvsadm -A -t 172.16.100.117:80 -s rr
# ipvsadm -a -t 172.16.100.117:80 -r192.168.20.7 -m
# ipvsadm -a -t 172.16.100.117:80 -r192.168.20.8 -m
4,保存配置永久有效:
]# ipvsadm -S > /etc/sysconfig/ipvsadm
5,如果不小心刪除規則,可以及時修復;
6,重讀配置文件,並修復;
# ipvsadm -R < /etc/sysconfig/ipvsadm
7,開始驗證Lvs-nat 效果:
http://172.16.100.117來查看;
8,使用"-E"選項修改調度器:
#ipvsadm -E -t 172.16.100.117:80 -s sh
9,基於web修改RS端口映射;
# ipvsadm -e -t172.16.100.117:80 -r 192.168.20.7:8080 -m
# ipvsadm -e -t172.16.100.117:80 -r 192.168.20.8:8080 -m
或者修改 #vim/etc/sysconfig/ipvsadm 裡的參數;然後重讀信息。
wKioL1Yfm3XyKQg_AAEPFaaq0qQ904.jpg
這樣web服務又恢復了正常;
10,刪除一個real server;
#ipvsadm -d -t 172.16.100.117:80 -r192.168.20.7:8080
刪除集群服務:
#ipvsadm -D -t 172.16.100.117:80
修復ipvsadm
#ipvsadm -R < /etc/sysconfig/ipvsadm
11,Lvs-dr 內核參數配置arp_ignore對請求是否響應/ arp_announce 接不接受請求通告
arp_announce(通告)-INTEGER請求
0 默認,不保留通告
1 盡量不通告
2只能、總是避免通告
arp_announce = 1 盡量避免,
arp_announce = 2 只能、總是避免,
arp_ignore -INTEGER 響應
0 -默認 通告全場
1 -僅通告報文請求的入口,
Lvs-dr實操圖:
A,修改DIP
配置director主機地址和回環地址:
# ifconfigeno16777736:0 172.16.100.118/32 broadcast 172.16.100.118 up
# route add -host 172.16.100.118 deveno16777736:0限定接口-->目標地址響應
B,配置real server *參數配置--->配置VIP
配置兩台real server內核參數;
# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
# ifconfig lo:0 172.16.100.118/32broadcast 172.16.100.118 up添加回環Vip地址
# route add -host 172.16.100.118 devlo:0端口限定
C,請求RIP地址驗證;curl 命令;
D,director上添加集群服務;
#ipvsadm -C 刪除之前的配置
# ipvsadm -A -t172.16.100.118:80 -s rr
# ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.21 -g
# ipvsadm -a-t 172.16.100.118:80 -r 172.16.100.22 -g