LVS負載均衡
html
-----------------------------------------------------------------------------------------------------------------------------------------------
前端
1、cluster
mysql
Scale Out:向外擴展,增長設備,調度分配問題,Cluster算法
二、Cluster:集羣,爲解決某個特定問題將多臺計算機組合起來造成的單個系統sql
LB:Load Balancing,負載均衡,用戶請求按照必定比例,均勻分配到各服務器後端
HA:High Availiablity,高可用,SPOF(single Point Of failure,單點失敗)瀏覽器
MTBF:Mean Time Between Failure 平均無端障時間
MTTR:Mean Time To Restoration( repair)平均恢復前時間
A=MTBF/(MTBF+MTTR) (0,1):99%(停機約3天), 99.5%, 99.9%(停機約7小時), 99.99%(停機40多分鐘), 99.999%(停機約4分鐘,企業級應用比較合理)
HPC:High-performance computing,高性能 www.top500.org
lvs:Linux Virtual Server,基於內核級別實現
nginx:支持七層調度,阿里七層SLB使用Tengine(阿里基於Nginx作的改版)
ats:apache traffic server,yahoo捐助
六、應用層(專用):針對特定協議,自定義的請求模型分類,一般名稱上叫代理服務器
http:nginx, httpd, haproxy(mode http), ...
(1) session sticky:同一用戶調度固定服務器,依據瀏覽器的cookie進行精確調度
(2) session replication:每臺服務器擁有所有session
(3) session server:專門的session服務器
一、LVS:Linux Virtual Server,負載調度器,集成內核,章文嵩,阿里SLB目前使用
官網:http://www.linuxvirtualserver.org/
二、工做原理:VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根據調度
轉發:PREROUTING --> FORWARD --> POSTROUTING
VS:Virtual Server,Director Server(DS),Dispatcher(調度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx),backend server(haproxy)
訪問流程:CIP <--> VIP == DIP <--> RIP,RIP返回時能夠直接回到CIP
一、lvs: ipvsadm/ipvs,LVS位置位於iptables的INPUT表以前
ipvs:工做於內核空間netfilter的INPUT鉤子上的框架
lvs-nat:修改請求報文的目標IP,多目標IP的DNAT,當目標服務器有故障時將依然調度
本質是多目標IP的DNAT,經過將請求報文中的目標地址和目標端口修改成某挑出的RS的RIP和PORT實現轉發
(1)RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP
(2)請求報文和響應報文都必須經由Director轉發,Director易於成爲系統瓶頸
四、VS/NAT的體系結構,原路返回,LVS服務器須要打開路由轉發功能
源地址VIP,目標地址CIP,進入LVS服務器路由路過PREROUTING,看到是VIP向INPUT方向走,不過LVS處於INPUT以前,經過轉發規則將其改變爲源地址是CIP,目標地址是RIP,此時出路由POSTROUTING口,到達Real Server後,原路返回,此時源地址是RIP,目標地址是CIP,通過LVS服務器的時候,將源地址改爲RIP,目標地址改爲CIP
LVS-DR:Direct Routing,直接路由,LVS默認模式,應用最普遍,經過爲請求報文從新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
(2)確保前端路由器將目標IP爲VIP的請求報文發往Director
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP可使用私網地址,也能夠是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director
(5)請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client
六、VS/DR體系結構,LVS服務器不用打開路由轉發功能,請求到達RS服務器後憑藉VIP不經過LVS直接返回,當廣播域詢問擁有VIP的主機響應時,RS服務器不宣傳本身的VIP地址,不響應APR廣播,因此也不會形成衝突
arp_ingnore改成1,arp_announce改成2,只更改all和lo網卡便可
七、 lvs-tun:能夠實現跨地區訪問,相似於DR模型,只不過LVS和RS之間有路由器,經過IP隧道方式進行傳輸,實現了跨網段,傳輸時的報文再加了一層IP頭部。因爲LVS和RS之間有路由器分隔網段,所以不用考慮IP相同形成衝突的問題
轉發方式:不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而在原IP報文以外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP)
(3) 請求報文要經由Director,但響應不經由Director
kernel內核默認不支持,若是用此模型,須要從新源碼編譯內核
VS/NAT |
VS/TUN |
VS/DR |
|
後端服務器類型 |
任何 |
支持Tunneling隧道 |
調節arp開關,關閉arp響應和ip應答 |
服務器網絡類型 |
公網和私網 |
廣域網或局域網 |
局域網 |
後端服務器數量 |
低(10~20) |
高(100) |
高(100) |
服務器網關 |
負載服務器或者上一個路由器 |
自身的路由 |
自身的路由 |
(1)lvs-nat與lvs-fullnat:請求和響應報文都經由Director
lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通訊
(2)lvs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client
lvs-dr:經過封裝新的MAC首部實現,經過MAC網絡轉發
lvs-tun:經過在原IP報文外封裝新IP頭實現轉發,支持遠距離通訊
一、ipvs scheduler:根據其調度時是否考慮各RS當前的負載狀態
(2)WRR:Weighted RR,加權輪詢,須要定義權重
(3)SH:Source Hashing,實現session sticky,源IP地址hash;未來自於同一個IP地址的請求始終發往第一次挑中的RS,即同一個IP地址請求始終調度給同一臺機器,從而實現會話綁定
(4)DH:Destination Hashing;目標地址哈希,第一次輪詢調度至RS,後續將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,根據用戶請求到目標地址到轉發到緩存服務器,好比說一個小區用戶世界盃期間觀看球賽,用戶網站觀看球賽的請求會輪詢調度到RS服務器,以後該小區其餘用戶若是也觀看同一網站球賽的請求也將會調度到同一個緩存服務器,可理解爲一區域內全部IP請求相同的都調度到一個RS服務器。通常適合寬帶運營商對緩存服務器使用這種調度算法
三、動態方法:主要根據每RS當前的負載狀態及調度算法進行調度Overhead=value較小的RS將被調度
(1)LC:least connections 適用於長鏈接應用
Overhead=activeconns*256+inactiveconns
inactiveconns:非活動鏈接,三次握手創建後沒有數據傳輸
(2)WLC:Weighted LC,默認調度方法,加上了權重,overhead越小,優先級越高
Overhead=(activeconns*256+inactiveconns)/weight
此算法初始值都是0,性能差的服務器可能在剛開始時會分配到壓力高的任務
(3)SED:Shortest Expection Delay,初始鏈接高權重優先
Overhead=(activeconns+1)*256/weight
可能會形成權重高的服務器一直工做,權重低的服務器一直沒有任務
(4)NQ:Never Queue,第一輪均勻分配,後續SED
(5)LBLC:Locality-Based LC,動態的DH算法,使用場景:根據負載狀態實現正向代理,壓力多少分配,壓力少多分配
(6)LBLCR:LBLC with Replication,帶複製功能的LBLC,解決LBLC負載不均衡問題,從負載重的複製到負載輕的RS
grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64
支持的協議:TCP, UDP, AH, ESP, AH_ESP, SCTP
規則重載工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe
persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address 刪除
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -Z [-t|u|f service-address]
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
ipvsadm -D -t|u|f service-address
(4)[-s scheduler]:指定集羣的調度算法,默認爲wlc
(1)增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
(2)刪:ipvsadm -d -t|u|f service-address -r server-address
(3)server-address:rip[:port] 如省略port,不做端口映射
(6)清空計數器:ipvsadm -Z [-t|u|f service-address]
(9)ipvs鏈接:/proc/net/ip_vs_conn
10、LVS-DR配置,LVS不參加通信,可是必須加網關,不然會認爲沒有路
一、DR模型中各主機上均須要配置VIP,解決地址衝突的方式有三種:
(1) 在前端網關作靜態綁定
(2) 在各RS使用arptables
(3) 在各RS修改內核參數,來限制arp響應和通告的級別
二、限制響應級別:arp_ignore
0:默認值,表示可以使用本地任意接口上配置的任意地址進行響應
1:僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應,可理解爲配置爲1後,別人問不搭理
三、限制通告級別:arp_announce
0:默認值,把本機全部接口的全部信息向每一個接口的網絡進行通告
1:儘可能避免將接口信息向非直接鏈接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
11、FireWall Mark
一、FWM:FireWall Mark
二、MARK target 可用於給特定的報文打標記
--set-mark value
其中:value 可爲0xffff格式,表示十六進制數字
三、藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度
四、實現方法:
(1)在Director主機打標記:iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
(2)在Director主機基於標記定義集羣服務:ipvsadm -A -f NUMBER [options]
12、持久鏈接
一、session 綁定:對共享同一組RS的多個集羣服務,須要統一進行綁定,lvs sh算法沒法實現
二、持久鏈接( lvs persistence )模板:實現不管使用任何調度算法,在一段時間內(默認360s ),可以實現未來自同一個地址的請求始終發往同一個RS,實現加-p 跟秒數便可
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
三、持久鏈接實現方式:
(1)每端口持久(PPC):每一個端口定義爲一個集羣服務,每集羣服務單獨調度
(2)每防火牆標記持久(PFWMC):基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity
(3)每客戶端持久(PCC):基於0端口(表示全部服務)定義集羣服務,即將客戶端對全部應用的請求都調度至後端主機,必須定義爲持久模式
十3、LVS高可用性
一、Director不可用,整個系統將不可用;SPoF Single Point of Failure
解決方案:高可用,keepalived heartbeat/corosync
二、某RS不可用時,Director依然會調度請求至此RS
解決方案: 由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啓用,keepalived heartbeat/corosync ldirectord
檢測方式:
(a) 網絡層檢測,icmp
(b) 傳輸層檢測,端口探測
(c) 應用層檢測,請求某關鍵資源
RS全不用時:backup server, sorry server
十4、ldirectord
一、ldirectord:監控和控制LVS守護進程,可管理LVS規則
二、包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
三、下載:http://download.opensuse.org/repositories/network:/haclustering:/Stable/CentOS_CentOS-7/x86_64/
四、文件:
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服務
/usr/sbin/ldirectord 主程序,Perl實現
/var/log/ldirectord.log 日誌
/var/run/ldirectord.ldirectord.pid pid文件
十5、Ldirectord配置文件示例
checktimeout=3
checkinterval=1
autoreload=yes
logfile=「/var/log/ldirectord.log「 #日誌文件
quiescent=no #down時yes權重爲0,no爲刪除
virtual=5 #指定VS的FWM或IP:port
real=172.16.0.7:80 gate 2 #2爲權重
real=172.16.0.8:80 gate 1 #1爲權重
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
protocol=tcp #定義標籤後該項須要註釋或刪除
checktype=negotiate
checkport=80
request="index.html"
receive=「Test Ldirectord"