LVS-DR簡單模型實現負載均衡
LVS-DR模型:基於直接路由的web服務
基本的原理:Director和RealServer必須在物理上有一個網絡卡通過區域網相連(高速交換機或者HUB),Director只負責排程請求,響應報文則由RealServer直接返回給Client。使用者的IP為CIP,使用者請求VIP,VIP被Director和RealServer共享,DIP是連線RealServer的IP地址,
由於RIP和VIP及DIP在同一個物理網段,在ARP廣播每個RealServer都能收到,正常情況下都會迴應,為了解決這個問題,設定Director的VIP對外可見,用於接收虛擬服務的請求報文,而每個Realserver的VIP配置在各自的No-ARP網路裝置上,對外不可見。由Directory根據排程演算法選擇Realserver,將資料幀的MAC地址改為所選RS的MAC,再將修改後的資料幀在RS組所在的區域網內傳送。因為資料幀的MAC是選出的RS,所以該RS肯定可以收到這個資料幀,而後根據本地路由表將資料包路由至本地迴環裝置,接著,監聽於本地迴環裝置VIP上的服務則對進來的資料進行相應的處理,而後將處理結果迴應至RIP,但資料包的原地址依然是VIP。最後該響應報文會根據路由表被直接返回給Client
注意:
- 每個伺服器的網絡卡是橋接的
- RIP和DIP必須在同一個物理網段
- RIP的閘道器一定不能指向DIP
- DIP不能做埠對映
- 若網頁打不開,檢視虛擬機器的防火牆是否關閉
Director
DIP:eth0:10.33.1.129 VIP:eth0:0:10.33.1.120
arp_announce:定義將自己地址向外通告MAC-IP時的限制級別:
0:將本地任何介面上的任何地址向外通告
1:試圖僅向目標網路通告與其網路匹配的地址
2:僅向與本地介面上地址匹配的網路進行通告
arp_ignore: 定義網絡卡在響應外部ARP請求時候的響應級別:
0 - (default): reply for any local target IP address, configured on any interface.
預設值,不管哪塊網絡卡接收到了ARP請求,只要發現本機有這個MAC都給與響應
1 - reply only if the target IP address is local address configured on the incoming interface.
儘量避免響應ARP請求中MAC不是本網絡卡的,一個主機有多塊網絡卡,其中一塊網絡卡接收到了ARP請求,發現所請求的MAC是本機另一塊網絡卡的,這個時候接收到ARP請求的這塊網絡卡就儘量避免響應
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender’s IP
總是選擇匹配的網絡卡來響應,一個主機有多塊網絡卡,其中一塊網絡卡接收到了ARP請求,發現所請求的MAC是本機另一塊網絡卡的,這個時候接收到ARP請求的這塊網絡卡就一定不響應,只有發現請求的MAC是自己的才給與響應
在啟用VIP之前設定RealServers上arp_ignore和arp_announce,否則,則需要在Director上清空arp表才能正常使用LVS
[root@wrapper ~]#vim /etc/sysctl.conf
[root@wrapper ~]# sysctl -p
也可以在每個Real Server執行以下命令
在Real Server本地lo介面的別名(lo:0)上配置一個不向外通告,也不響應ARP請求的VIP,同時要新增路由
RS1:eth0:10.33.1.117 lo:0:10.33.1.120
RS1:eth0:10.33.1.143 lo:0:10.33.1.120
物理機ping一下VIP,只有Director上的VIP響應
ipvsadm配置叢集服務
語法:ipvsadm [options] -t|-u -f service-address [options]
定義一個叢集服務:
ipvsadm -A|-E -t|-u -f service-address [-s scheduler]
-A ##新增一個叢集服務
-E ##修改一個叢集服務
-s ##指定排程用的演算法
-t|-u ##service-address為VIP:port
-f ##service-address為防火牆標記
向叢集服務中新增RS:
ipvsadm -a|e -t|u|f service-address -r server-address [options]
-a ##新增一個RS
-e ##修改一個RS
-service-address ##已定義過的叢集服務
-r ##指定RS地址
-w|weight ##指定該real server的權重,這個設為0表示禁用該realserver。
指定LVS的型別:
-g|--gatewaying ##direct routing(DR模型,預設選項)
-m|--masquerading ##masquerading(NAT模型)
-i|--ipip ##ipip encapsulation(tun型別)
scheduler(LVS演算法)
ipvs在排程時所使用的演算法,新增叢集服務時通過“-s”指定(這個由核心中的ipvs程式碼提供)
靜態方法:僅根據演算法本身進行排程,不考慮後端伺服器的負載
rr # round robin,輪詢
wrr # weighted round robin, 加權輪詢(根據新增RS時指定的權重進行排程,權重越大排程的次數越多)
sh # source hashing,表示來源於同一個CIP的請求將始終被定向至同一個RS(SESSION保持)
dh # destination hashing,只要訪問同一個地址,就排程到同一個real server
動態方法:根據演算法及各RS當前的負載狀況進行排程
lc # least connection,排程給當前連線數最少的RS
Overhead=Active*256+Inactive # Active:活動狀態連線數,Inactive:非活動狀態連數,排程時Director選擇Overhead值最小的RS
wlc # weighted lc #預設使用這種演算法,更容易保證排程公平
Overhead=(Active*256+Inactive)/weight #weight:權重
sed # shortest expection delay
Overhead=(Active+1)*256/weight
nq # Never Queue #現將請求分配給所有的空閒伺服器,沒有空閒的伺服器了之後,再根據sed演算法進行排程
lblc # Locality-Based Least Connection #主要用於cache集群系統,動態的DH,很少用到
lblcr # lblc with Replication #帶複製功能的lblc
在Direcor上新增叢集服務
訪問測試
檢視排程狀況