LVS負載均衡
-----------------------------------------------------------------------------------------------------------------------------------------------
一、cluster
Scale Out:向外擴展,增加設備,調度分配問題,Cluster
2、Cluster:集羣,爲解決某個特定問題將多臺計算機組合起來形成的單個系統
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捐助
6、應用層(專用):針對特定協議,自定義的請求模型分類,通常名稱上叫代理服務器
http:nginx, httpd, haproxy(mode http), ...
(1) session sticky:同一用戶調度固定服務器,依據瀏覽器的cookie進行精確調度
(2) session replication:每臺服務器擁有全部session
(3) session server:專門的session服務器
1、LVS:Linux Virtual Server,負載調度器,集成內核,章文嵩,阿里SLB目前使用
官網:http://www.linuxvirtualserver.org/
2、工作原理: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
1、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易於成爲系統瓶頸
4、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
6、VS/DR體系結構,LVS服務器不用打開路由轉發功能,請求到達RS服務器後憑藉VIP不通過LVS直接返回,當廣播域詢問擁有VIP的主機響應時,RS服務器不宣傳自己的VIP地址,不響應APR廣播,所以也不會造成衝突
arp_ingnore改爲1,arp_announce改爲2,只更改all和lo網卡即可
7、 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頭實現轉發,支持遠距離通信
1、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服務器。一般適合寬帶運營商對緩存服務器使用這種調度算法
3、動態方法:主要根據每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
十、LVS-DR配置,LVS不參加通訊,但是必須加網關,否則會認爲沒有路
1、DR模型中各主機上均需要配置VIP,解決地址衝突的方式有三種:
(1) 在前端網關做靜態綁定
(2) 在各RS使用arptables
(3) 在各RS修改內核參數,來限制arp響應和通告的級別
2、限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1:僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應,可理解爲配置爲1後,別人問不搭理
3、限制通告級別:arp_announce
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:儘量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
十一、FireWall Mark
1、FWM:FireWall Mark
2、MARK target 可用於給特定的報文打標記
--set-mark value
其中:value 可爲0xffff格式,表示十六進制數字
3、藉助於防火牆標記來分類報文,而後基於標記定義集羣服務;可將多個不同的應用使用同一個集羣服務進行調度
4、實現方法:
(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]
十二、持久連接
1、session 綁定:對共享同一組RS的多個集羣服務,需要統一進行綁定,lvs sh算法無法實現
2、持久連接( lvs persistence )模板:實現無論使用任何調度算法,在一段時間內(默認360s ),能夠實現將來自同一個地址的請求始終發往同一個RS,實現加-p 跟秒數即可
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
3、持久連接實現方式:
(1)每端口持久(PPC):每個端口定義爲一個集羣服務,每集羣服務單獨調度
(2)每防火牆標記持久(PFWMC):基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity
(3)每客戶端持久(PCC):基於0端口(表示所有服務)定義集羣服務,即將客戶端對所有應用的請求都調度至後端主機,必須定義爲持久模式
十三、LVS高可用性
1、Director不可用,整個系統將不可用;SPoF Single Point of Failure
解決方案:高可用,keepalived heartbeat/corosync
2、某RS不可用時,Director依然會調度請求至此RS
解決方案: 由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啓用,keepalived heartbeat/corosync ldirectord
檢測方式:
(a) 網絡層檢測,icmp
(b) 傳輸層檢測,端口探測
(c) 應用層檢測,請求某關鍵資源
RS全不用時:backup server, sorry server
十四、ldirectord
1、ldirectord:監控和控制LVS守護進程,可管理LVS規則
2、包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
3、下載:http://download.opensuse.org/repositories/network:/haclustering:/Stable/CentOS_CentOS-7/x86_64/
4、文件:
/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文件
十五、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"