在介紹lvs以前,咱們先來聊聊Linux集羣。Linux集羣(cluster)就是一組Linux計算機,它們做爲一個總體向用戶提供一組網絡資源,這些單個的計算機系統就是集羣的節點javascript
(node)。一個理想的集羣,用戶是不會意識到集羣系統底層的節點的,在他們看來,集羣是一個系統,而非多個計算機系統,而且集羣系統的管理員能夠隨意增長和刪改集羣系統前端
的節點。java
(1)高可擴展性:在不影響業務的狀況下,能夠動態的添加或刪除資源node
(2)高可用性HA:集羣中的一個節點失效,它的任務可傳遞給其餘節點。能夠有效防止單點失效。linux
(3)高性能:負載平衡集羣容許系統同時接入更多的用戶。nginx
(4)高性價比:能夠採用廉價的符合工業標準的硬件構造高性能的系統。算法
(1)LB:負載均衡後端
(2)HA:高可用集羣緩存
(3)HP:高性能服務器
在初步瞭解了Linux集羣后,咱們進一步介紹負載均衡集羣技術LVS
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。
具體介紹能夠查詢度娘 https://baike.baidu.com/item/LVS/17738?fr=aladdin
LVS屬於Linux集羣LB類型,而目前LB類型的實現方式通常分兩種:硬件實現和軟件實現
硬件實現:
F5 BIGIP
Citrix NetScaler
A10
。。。
軟件實現:
LVS
nginx
haproxy
。。。
功能上:四種IP負載均衡技術和八種鏈接調度算法的IPVS軟件。
適用性上:基於OSI參考模型4層轉發,後端服務器可運行任何支持TCP/IP的操做系統,負載均衡調度器可以支持絕大多數的TCP和UDP協議
性能上:LVS服務器集羣系統具備良好的伸縮性,可支持幾百萬個併發鏈接
負載調度器(load balancer/Director):由一臺或多臺負載調度器組成,主要做用相似一個路由器,將用戶請求分發給服務器池上的real server;
服務器池(server pool/Realserver):一組真正執行客戶請求的服務器
共享存儲(shared storage):爲服務器池提供一個共享的存儲區,能使得服務器池擁有相同的內容,提供相同的服務。
lvs的類型有4種,咱們這裏詳細地介紹前三種類型。lvs的類型分別是NAT、DR、TUN、FULLNAT四種。
lvs-nat工做流程:
lvs-nat的工做的本質就是多目標的dnat。
(1)客戶端請求資源,源地址cip(client IP),目的地址vip(virtual IP)
(2)請求報文到達調度器,調度器發現目的地址是本身,而後修改請求報文的目標IP地址爲經過調度算法選出的RealServer,並將請求發送至RealServer
(3)RealServer收到請求後,將請求內容響應給負載調度器,負載調度器將響應報文的源地址設置爲VIP,目的地址設置爲CIP發出。
lvs-nat的特色:
(1)RS應該和DIP應該使用私網地址,且RS的網關爲DIP
(2)請求和響應報文都要經由director轉發,極高負載場景中,director可能會成爲系統瓶頸
(3)支持端口映射:
(4)RS可使用任意OS
lvs-dr工做流程:
lvs-dr的本質是修改目的地址MAC
(1)客戶端請求資源,源地址cip(client IP),目的地址vip(virtual IP)
(2)請求報文經過路由器,到達交換機,交換機檢查目的地址的MAC,併發送ARP廣播。
(3)調度器收到廣播,通過調度算法後將RealServer rip(realserver IP)的MAC地址添加到目的地址後,發往交換機
(4)交換機收到調度器發來的報文,檢查目的地址MAC,這裏的MAC地址已是通過調度器修改後的MAC,也就是RealServer的MAC,再次發送廣播
(5)RealServer接到請求,響應請求,將源地址設置爲vip,目的地址設置爲cip後不通過調度器發送給客戶端
lvs-dr特色:
(1)保證前端路由器將目標IP爲VIP的請求報文發送給director
(2)RS的RIP可使用私有地址,也可使用公網IP
(3)RS跟Director必須在同一個物理網絡中(ARP)能解析的
(4)請求本文經由Director調度,但響應報文必定不能由director
(5)不支持端口映射
(6)RS的網關不能指向DIP
(1)用戶發送請求到Director的VIP請求服務;
(2)當用戶請求到達Director的時候,根據調度算法選擇一臺RS進行轉發,這時使用隧道(tun)封裝兩個IP首部,此時源IP是DIP,目標IP是RIP;
(3)當RS接收到數據報後,看到外層的IP首部,目標地址是本身,就會拆開封裝,解析完畢後,發送響應報文,源IP是VIP,目標IP是CIP。
靜態方法:僅根據算法自己進行調度:(不考慮後端運行狀況)
RR:round robin 輪循
WRR:weighted rr, 加權輪循 (設置權重,權重比列分配)
SH:source hash 源地址hash ,實現session保持的機制:
DH:destation hash 目標地址hash,將對同一個目標的請求始終發往同一個RS
動態方法:根據算法及各RS的當前負載狀態進行調度:
overhead(負載)=
LC: least connection 最小鏈接數 overhead=Active*256+Inactive(非活動數)
WLC:weighted LC 加權最小鏈接數 overhead=(Active*256+Inactive)/Weight
SED:shortest expect delay WLC的改進
overhead=(Active+1)*256/weight
NQ:nerver queue 從不排隊,
SED的改進
LBLC:Locality-based LC 即爲動態的DH算法:
本地訪問互聯網時,採用,緩存,提升訪問命中率
LBLCR:帶複製的LBLC
因爲http是無狀態的鏈接,即請求時建鏈接、請求完釋放鏈接,以儘快將資源釋放出來服務其餘客戶端,因此可能在某些特定的狀況下出現問題。好比在登陸某寶購買商品
時會出現被要求重複登陸的狀況,由於無狀態,請求被髮往不一樣的RealServer致使,引入session保持能夠解決這類問題,目前session保持實現方法有如下幾種。
session保持:
session綁定:
source ip hash(LVS只支持ip hash)
cookie:任意新請求來時,插入cookie
session集羣:
保證主機宕機的危險
各主機間同步session,各主機擁有所有session
session服務器:
將session保存在共享存儲內,存儲或者nas,Redis(考慮Redis的高可用性)
管理羣集服務:
增:
ipvsadmin -A -t|u|f service-address [-s scheduler]
A 添加
service-address:
-t TCP
-u UDP
-f FWM
-s 9種調度器
例子 :
ipvsadmin -A -t 172.16.1.253:80 -s wlc
刪:
ipvsadmin -D -t 172.16.1.253:80
ipvsadmin -C 刪除全部集羣服務
改:
ipvsadmin -E -t|u|f service-address [-s scheduler]
-E 編輯
-t TCP
-u UDP
-s 9種調度器
例子 :
ipvsadmin -E -t 172.17.1.253:80 -s wrr
管理集羣服務中的RS
增:
ipvsadmin -a -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
-r server-address:某RS的地址,在NAT模式中,可以使用IP:PORT實現端口映射;
[-g|i|m]: LVS類型
-g gateway:DR(默認)
-i ipip:tun
-m maqs:NAT
[-w weight]:定義服務器權重
例子:
ipvsadmin -a -t 172.16.1.253:80 -r 172.16.1.101 -g -w 5
ipvsadmin -a -t 172.16.1.253:80 -r 172.16.1.102 -g -w 10
刪除RS
ipvsadmin -d -t|u|f service-address -r server-address
例子:
ipvsadmin -d -t 172.16.1.253:80 -r 172.16.1.101
修改RS
ipvsadmin -e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
例子:
ipvsadmin -e -t 172.16.1.253:80 -r 172.16.1.101 -g -w 3
查看:
ipvsadmin -L|I [options]
-n:數字格式顯示主機地址和端口
--stats:統計數據
--rate:速率
--timeout:顯示
-c:顯示當前的ipvs鏈接情況
保存:
service ipvsadm save 保存到默認配置文件
ipvsadmin -S > /path/to/somefile
載入:
ipvsadmin -R < /path/from/somefile
咱們這裏主要介紹lvs persistence,它的做用是不管ipvs使用何種調度方法,其都能實現未來自於同一個RS的請求始終定向至第一次調度時選出的RS。配置命令很簡單,只要在
管理羣集服務命令後加-p number便可。
lvs persistence的實現方式有如下三種:
每端口持久:PPC,每端口持久,單端口持久調度,(單個端口)
單FWM持久:PFWMC,單FWM持久調度 (一組端口 -j MASK --set-mark 10)
單客戶端持久: PCC,單客戶端持久調度 (全部端口)
配置命令:
PPC:
ipvsadm -A -t 192.168.0.10:80 -s rr -p 300
PFWMC:
經過FWM定義集羣的方式:
(1)在director上netfilter的mangle表的PREROUTING定義用於打標的規則
iptables -t mangle -A PREROUTING -d 192.168.0.10(vip) -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 192.168.0.10(vip)-p tcp --dport 22 -j MARK --set-mark 10
iptables 定義了兩個端口22和80
(2)基於FWM定義集權服務:
ipvsadmin -A -f 10 -s rr -p 360
ipvsadmin -a -f 10 -r 192.168.1.10 -g -w 1
在lvs時定義-f10 便可開放兩種應用
功用:將共享一組RS的集羣服務統一進行定義
PCC:
ipvsadm -A -t 192.168.0.10:0 -s rr -p 3600
關於時間同步:各節點間的時間誤差不大於1s,建議使用統一的ntp服務器進行更新時間;
DR模型中的VIP的MAC廣播問題:
在DR模型中,因爲每一個節點均要配置VIP,所以存在VIP的MAC廣播問題,在如今的linux內核中,都提供了相應kernel 參數對MAC廣播進行管理,具體以下:
arp_ignore: 定義接收到ARP請求時的響應級別;
0:只要本地配置的有相應地址,就給予響應;
1:僅在請求的目標地址配置在到達的接口上的時候,纔給予響應;DR模型使用
arp_announce:定義將本身地址向外通告時的通告級別;
0:將本地任何接口上的任何地址向外通告;
1:試圖僅向目標網絡通告與其網絡匹配的地址;
2:僅向與本地接口上地址匹配的網絡進行通告;DR模型使用