技術簡介:
LVS集群采用IP負載均衡技術和基于內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。為此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性
集群采用三層結構:
一般來說,LVS集群采用三層結構,其主要組成部分為:
A、負載調度器(load balancer),它是整個集群對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認為服務是來自一個IP地址(我們可稱之為虛擬IP地址)上的
B、服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等
C、共享存儲(shared storage),它為服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務
lvs集群類型中的術語:
vs:Virtual Server, Director, Dispatcher, Balancer
rs:Real Server, upstream server, backend server
CIP:Client IP
VIP: Virtual serve IP
DIP: Director IP
RIP: Real server IP
請求過程:CIP <–> VIP <==> DIP <–> RIP
lvs集群的類型:
lvs-nat:修改請求報文的目標IP,然后轉發給被選中的RS
lvs-dr:在請求報文的首部重新封裝新的MAC地址,然后轉發給被選中的RS
lvs-tun:在原請求IP報文之外新加一個IP首部<源地址為CIP,目標地址為RIP>,然后轉發給RS
lvs-fullnat:修改請求報文的源和目標IP<源地址修改為DIP,目標地址修改為RIP>,然后轉發給RS
lvs-nat:
類似多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發
(1) RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP
(2) 請求報文和響應報文都必須經由Director轉發;Director易于成為系統瓶頸
(3) 支持端口映射,可修改請求報文的目標PORT
(4) vs必須是Linux系統,rs可以是任意系統
lvs-dr:
Direct Routing,直接路由
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址
源IP/PORT,以及目標IP/PORT均保持不變;
Director和各RS都得配置使用VIP;
(1) VIP地址要配置在VS主機和所有的RS主機上
(2) 確保前端路由器將目標IP為VIP的請求報文發往Director,限制RS主機上關于VIP的廣播和應答:
(a) 在前端網關做靜態綁定;
(b) 在RS上使用arptables;
(c) 在RS上修改內核參數以限制arp通告及應答級別;
arp_announce
arp_ignore
(3) RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director
(4) RS跟Director要在同一個物理網絡,VS和所有RS主機之間不能跨路由器
(5) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client
(6) 不支持端口映射
lvs-tun:
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS
(1) DIP, VIP, RIP都應該是公網地址
(2) RS的網關不能,也不可能指向DIP
(3) RS的主機上也要配置VIP地址
(3) 請求報文要經由Director,但響應不能經由Director
(4) 不支持端口映射
(5) RS的OS得支持隧道功能
lvs-fullnat:
通過同時修改請求報文的源IP地址和目標IP地址進行轉發;
CIP –> DIP
VIP –> RIP
(1) VIP是公網地址,RIP和DIP是私網地址,可以跨路由器,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP;
(2) RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client;
(3) 請求和響應報文都經由Director;
(4) 支持端口映射;
注意:此類型默認不支持
ipvs scheduler:<ipvs的調度方法>
根據其調度時是否考慮各RS當前的負載狀態,可分為靜態方法和動態方法兩種:
靜態方法:僅根據算法本身進行調度
RR:roundrobin,輪詢;把所有的RS主機統計起來,每次有新請求來,以輪詢的方式一個個的調度用戶請求到RS主機上去
WRR:Weighted RR,加權輪詢;把所有的RS主機統計起來,并記錄每個RS主機的權值<在這里表示自身的某個服務的處理能力,能力越強,權值越高>,每次有新請求來,以權值的大小進行輪詢,調度用戶請求到RS主機上去,權值高的主機,會接收到更多的用戶請求
SH:Source Hashing,實現session sticy,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定
DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS
DH:提高VS后緩存服務器中緩存的命中率
DH:多數情況用于緩存服務器
動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;
Overhead:VS進行調度的比較器,優先調度給Overhead值小的服務器
LC:least connections 最少連接
Overhead=activeconns*256+inactiveconns
基于上面的Overhead算法,計算所有RS主機的Overhead值,把新請求調度到Overhead值小的服務器
WLC:Weighted LC 加權的最少連接
Overhead=(activeconns*256+inactiveconns)/weight
基于上面的Overhead算法,計算所有RS主機的Overhead值,把新請求調度到Overhead值小的服務器
SED:Shortest Expection Delay
Overhead=(activeconns+1)*256/weight
基于上面的Overhead算法,計算所有RS主機的Overhead值,把新請求調度到Overhead值小的服務器
NQ:Never Queue
永不排隊,每個后端服務器,至少先分一個,然后在使用SED調度算法對新請求進行調度
LBLC:Locality-Based LC,動態的DH算法
簡單的理解就是:類似靜態方法的DH算法,但它是動態的
LBLCR:LBLC with Replication,帶復制功能的LBLC
在LBLC上,后端服務器,基于session replication機制,復制一臺RS主機的緩存到其他RS主機上,則當老用戶進行請求的時候,不僅可以轉發給老用戶第一次訪問的主機,也可以轉發給RS其他主機,因為此時其他RS主機也有此老用戶訪問的緩存
lvs-nat配置:
拓撲結構:
設計要點:
(1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP;
VIP=10.1.43.101
DIP=172.16.0.1
RIP-1=172.16.0.2
RIP-2=172.16.0.3
RS1: yum -y install httpd mysql-server vim /var/www/html/index.html <h1>RS1</h1> ifconfig eth0 172.16.0.2/24 up route add default gw 172.16.0.1 service httpd start RS2: yum -y install httpd mysql-server vim /var/www/html/index.html <h1>RS2</h1> ifconfig eth0 172.16.0.3/24 up route add default gw 172.16.0.1 service httpd start VS: ifconfig eno33554984 172.16.0.1/24 up echo 1 > /proc/sys/net/ipv4/ip_forward ipvsadm -A -t 10.1.43.101:80 -s rr ipvsadm -a -t 10.1.43.101:80 -r 172.16.0.2 -m -w 1 ipvsadm -a -t 10.1.43.101:80 -r 172.16.0.3 -m -w 1
lvs-dr配置:
拓撲結構:
設計要點:
VS上的VIP地址可以直接配置在DIP地址所在的網卡上,Linux主機上,一塊網卡可以配置多個地址
RS上的VIP地址必須配置在lo接口上,并且還要關閉arp的響應和通告功能
外網接口:10.1.43.101
內網接口:172.16.0.1
VIP:172.16.0.10
DIP:172.16.0.9
RIP-1:172.16.0.2
RIP-2:172.16.0.3
dr模型中,各主機上均需要配置VIP,解決地址沖突的方式有三種:
(1) 在前端網關做靜態綁定
(2) 在各RS使用arptables
(3) 在各RS修改內核參數,來限制arp響應和通告的級別
限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,才給予響應
限制通告級別:arp_announce
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告
1:盡量避免向非直接連接網絡進行通告
2:必須避免向非本網絡通告
RS的預配置腳本:<在RS主機上運行此腳本即可>
#!/bin/bash # vip=172.16.0.10 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 route add default gw 172.16.0.1 ;; 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
VS的配置腳本:<在VS主機上運行此腳本即可>
#!/bin/bash # vip='172.16.0.10' iface='eno16777736:0' mask='255.255.255.255' port='80' rs1='172.16.0.2' rs2='172.16.0.3' scheduler='wrr' 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
路由器上配置:
ifconfig eno16777736 10.1.43.101/16 up ifconfig eno33554984 10.1.43.101/16 up echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -d 10.1.43.101 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.10:80
原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/54653