內容:前端
一、lvs的概念算法
二、lvs的工做過程後端
三、lvs的類型centos
四、lvs的調度方法bash
五、ipvsadm的使用服務器
1、lvs網絡
LVS(Linux Virtual Server)是前阿里巴巴首席科學家章文嵩博士在大學期間的一款開源的負載均衡軟件, 可實現四層的負載均衡。session
首先,lvs工做在傳輸層,lvs的架構和iptables相似,lvs由ipvsadm/ipvs組成,其中ipvsadm工做在用戶空間架構
lvs的術語:app
vs:virtual server,director
rs:real server
CIP:client IP
VIP:virtual server IP
DIP:ditecter IP(connect with rs)
RIP:real server IP
用戶請求的IP必定是VIP,不然vs就失去了負載均衡的調度意義
2、lvs的工做過程
3、lvs的類型
lvs有四種模型,其中前三種是通用的標準:
(1)lvs-nat(DNAT)
(2)lvs-dr
(3)lvs-tun
(4)lvs-fullnat(SANT、DNAT)(淘寶內部研發的模型,並不是lvs標準的模型,要使用該模型要打上專門的補丁)
LVS NAT的特性(實質是多目標的DNAT):
一、RS應該使用私有地址;
二、RS的網關的必須指向DIP;
三、RIP和DIP必須在同一網段內;
四、請求和響應的報文都得通過Director;在高負載場景中,Director極可能成爲系統性能瓶頸;
五、支持端口映射;
六、RS可使用任意支持集羣服務的OS;
lvs-nat:工做流程如圖:
LVS DR類型的特性:
一、RS可使用私有地址;但也可使用公網地址,此時能夠直接經過互聯網連入RS以實現配置、監控等;
二、RS的網關必定不能指向DIP;
三、RS跟Dirctory要在同一物理網絡內(不能由路由器分隔,由於VS經過封裝MAC地址到RS);
四、請求報文通過Directory,但響應報文必定不通過Director
五、不支持端口映射;
六、RS可使用大多數的操做系統;
因爲DR類型中,VS、RS的VIP都是同樣,若是在同一網段內會形成地址衝突,所以要解決地址衝突有一下三種方法:
禁止RS響應對VIP的ARP廣播請求:
一、在前端路由上實現靜態MAC地址VIP的綁定;
前提:得有路由器的配置權限;
缺點:Directory故障轉時,沒法更新此綁定;
二、arptables
前提:在各RS在安裝arptables程序,並編寫arptables規則
缺點:依賴於獨特功能的應用程序
三、修改Linux內核參數
前提:RS必須是Linux;
缺點:適用性差;
兩個參數:
arp_announce:定義通告模式
arp_ignore:定義收到arp請求的時響應模式
配置專用路由,以使得響應報文首先經過vip所配置的lo上的別名接口
lvs-dr:工做流程如圖
lvs-tun:IP隧道
一、RIP、DIP、VIP都得是公網地址;
二、RS的網關不會指向也不可能指向DIP;
三、請求報文通過Directory,但響應報文必定不通過Director;
四、不支持端口映射;
五、RS的OS必須得支持隧道功能;
lvs-tun:工做流程如圖:也是基於lvs-dr的模型,只不過不一樣的是,rs和vs沒必要在同一個物理的網絡(實現物理冗餘),而是經過隧道技術進行vs和rs間的通訊
lvs-fullnat:同時修改源IP和目標IP來進行轉發
特性:
一、VIP是公網IP,DIP和RIP是私網地址,且一般不在同一網絡中,但須要經路由器互通
二、RS收到的請求報文源IP是DIP,所以響應報文直接響應給DIP
三、請求和響應的報文都經由DIP,所以vs須要承受較大的壓力
四、支持端口映射
4、lvs的調度方法
lvs scheduler:lvs調度
LVS的調度方法能夠分爲靜態方法和動態方法:
靜態方法:僅根據算法自己進行調度,並無考慮RS的負載狀況
rr: Round Robin 路由輪詢
wrr: Weighted RR 加權輪詢
sh: source hashing 源地址哈希,主要做用是保持session,使同一個客戶端被調度到以前訪問的同一個RS,因此須要保持會話時才使用該調度方法
dh: destination hashing:目標地址哈希
動態方法:根據算法及RS當前的負載情況
lc: Least Connection最少鏈接
Overhead=Active*256+Inactive
結果中,最小者勝出;
wlc: Weighted LC 加權的最少鏈接
Overhead=(Active*256+Inactive)/weight
結果中,最小者勝出
sed: Shortest Expect Delay 最短時間望延時
Overhead=(Active+1)*256/weight
結果中,最小者勝出
nq: Nerver Queue 永不排隊,sed算法的改進,第一輪時每一個都要響應一次
lblc: Locality-based Least Connection
dh+lc
lblcr: Replicated and Locality-based Least Connection,帶複製的lblc
其中wlc算法最爲通用
既然是負載均衡調度,咱們也知道,http協議是無狀態的,那麼就要考慮一個問題,若是用戶被調到不一樣RS時,其訪問的信息怎麼同步:
負載均衡中Session持久機制:
一、session sticky綁定:始終將同一個請求者的鏈接定向至同一個RS(第一次請求時仍由調度方法選擇);沒有容錯能力,有損均衡效果;SH算法
二、session cluster複製:在RS之間同步session,所以,每一個RS持集羣中全部的session;對於大規模集羣環境不適用;
三、session server服務器:利用單獨部署的服務器來統一管理session;
5、ipvsadm/ipvs的使用:
(1)首先要查看內核是否已經裝有ipvs的模塊或功能,若是沒有須要從新編譯內核
[23:13 root@centos6.8~]# cat /boot/config-2.6.32-642.el6.x86_64 |grep -A 10 -i 'ipvs' # IPVS transport protocol load balancing support #支持的協議 CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y # # IPVS scheduler #支持的調度算法 CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m -- # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IP_VS_PE_SIP=m # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
(2)安裝ipvsadm的客戶端使用包
[23:21 root@centos6.8~]# yum install -y ipvsadm
ipvsadm的命令:
ipvsadm
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
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 [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
(3)能夠講命令安裝必定的功能分類:
集羣服務相關:
-A: 添加一個集羣服務
-t: tcp
-u: udp
-f: firewall mark,一般用於將兩個或以上的服務綁定爲一個服務進行處理時使用;
service-address:
-t VIP:port
-u VIP:port
-f firewall_mark
-s 調度方法,默認爲wlc
-p timeout: persistent connection, 持久鏈接
-E:修改定義過的集羣服務
-D -t|u|f service-address:刪除指定的集羣服務
RS相關:
-a:向指定的CS中添加RS
-t|-u|-f service-address:指明將RS添加至哪一個Cluster Service中
-r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS類型才容許此處使用跟集羣服務中不一樣的端口
LVS類型:
-g: Gateway, DR
-i: ipip, TUN
-m: masquerade, NAT
指定RS權重:
-w
-e: 修改指定的RS屬性
-d -t|u|f service-address -r server-address:從指定的集羣服務中刪除某RS
清空全部的集羣服務:
-C
保存規則:(使用輸出重定向)
ipvsadm-save
ipvsadm -S
載入指定的規則:(使用輸入重定向)
ipvsadm-restore
ipvsadm -R
查看ipvs規則等:
-L [options]
-n: 數字格式顯示IP地址
-c: 顯示鏈接數相關信息
--stats: 顯示統計數據
--rate: 速率
--exact:顯示統計數據的精確值
-Z: 計數器清零;
FWM:FireWall Mark :藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度;
打標記方法(在Director主機):
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
基於標記定義集羣服務:
# ipvsadm -A -f NUMBER [options]
(4)lvs persistence:持久鏈接
持久鏈接模板:實現不管使用任何算法,在一段時間內,實現未來自同一個地址的請求始終發往同一個RS;
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
port Affinity:
每端口持久:每集羣服務單獨定義,並定義其持久性;
每防火牆標記持久:基於防火牆標記定義持久的集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity;
每客戶端持久:基於0端口定義集羣服務,即將客戶端對全部應用的請求通通調度至後端主機,並且可以使用持久鏈接進行綁定;
(5)保存及重載規則:
保存:建議保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
重載:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service