1、LVS概念
LVS( Linux Virtual Server)是一種負載均衡(LB,Laod Balance)技術,採用IP負載均衡技術和基於內容請求分發技術。具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行。LVS是一套組件(ipvs與ipvsadm),相似與iptables,ipvs至關於netfilter,是能將用戶請求轉發的框架,須要依賴以規則完成轉發,工做於內核中的INPUT鏈上,並依賴於規則進行轉發,而ipvsadm是用來定義規則的工具。LVS工做在TCP/UDP協議的四層,能根據用戶請求的IP與PROT進行轉發,即LVS能實現四層交換、四層路由。html
ipvsadm:用戶空間的命令行工具,規則管理器,用於管理集羣服務及RealServer
ipvs:工做於內核空間的netfilter的INPUT鉤子之上的框架前端
LVS集羣類型中的術語android
Director:負載均衡器,也稱VS(Virtual Server)
RS:真實服務器(RealServer)
CIP:客戶端IP(Client IP)
VIP: Client所請求的,提供虛擬服務的IP,能夠用Keepalive作高可用
DIP:在Director實現與RS通訊的IP
RIP:RealServer IP
2、LVS集羣的類型算法
LVS轉發模式有四種:
lvs-nat: 修改請求報文的目標IP
lvs-dr: 操縱封閉新的MAC地址
lvs-tun: 在原請求IP報文以外新加一個IP首部
lvs-fullnat: 修改請求報文的源和目標IPchrome
2.1 LVS-NAT(Network Address Translation)
多目標IP的DNAT,經過將請求報文中的目標地址和目標端口改成某挑出的RS的RIP和PORT實現轉發(NAT模式修改的是dst IP,直接走switch或pub不須要修改MAC,因此不須要VIP和realserver同在一個網段內)緩存
模型:安全
如上圖,NAT模式對請求報文作了DNAT,即將報文的目的地址改成RS的地址,但源地址不變;RS上配置路由策略(如網關),應答報文到了LVS設備上後作SNAT,即將報文的源地址改成LVS設備上的地址,目的地址不變。bash
lvs-nat的特性服務器
1.RS應該使用私有地址 2.RS的網關必須指向DIP 3.RIP和DIP必須在同一網段內 4.請求和響應的報文都得通過Director,在高負載場景中,Director極可能成爲性能瓶頸(由於既要處理請求報文也要處理響應服方的轉發,請求報文通常很小,但響應報文通常都比較大) 5.支持端口映射,便可修改請求報文的目標端口 6.Director必須是Linux系統(必須支持nat),RS能夠是任意支持集羣服務的操做系統
2.2 LVS/DR(Direct Routing直接路由)
經過爲請求報文從新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變,請求報文通過Dirctor但響應報文再也不通過Dirctor
網絡
模型:
DR類型工做流程
如上圖所示:當客戶端請求VIP時,經過互聯網到達前端路由Route1,再經過交換機到達Dirctor上;而Dirctor在收到請求報文後,經過定義在ipvs規則中的各rip去得到各RS的MAC地址,並在此報文外再封裝一個MAC地址,源MAC爲Dirctor的DIP端口的MAC而目標MAC改成其中被調度算法選中一個RS的MAC,但該報文的目標ip(VIP)不變,最後經過DIP接口發送給RS;爲了RS能接收Dirctor發來的報文,須要在各RS上也配置VIP,但RS上的VIP是須要隔離前端arp廣播的,因此須要將各RS上的VIP隱藏(RS上的VIP一般配置到lo網卡接口的別名上,並配合修改Linux內核參數來實現隔離arp廣播);而RS封裝響應報文時,源IP爲VIP,目標ip爲CIP,並經過RIP的網絡接口直接向外發送響應,再也不通過Dirctor。
須要注意的是:由於Route1的A點的IP和Dirctor的VIP在同一網段內,VIP一般是公網IP;而DIP、RIP一般是私有IP,且這兩個IP一般也應在同一物理網絡內;假設RIP與Route1的A接口(同Director 的VIP DIP)在同一網段,則這時可將RS的網關指向Route1,不然,Route2只能其它路由器(如Route2)接口訪問互聯網,且Route2的C點的IP須要與RIP在同一網段內,此時RIP響應的報文就經過Route2發送。
上文黑色斜體部分的實現及確保前端路由器將目標IP爲VIP的請求報文發往Director後的各RS,方法c是最佳的選擇:
(a) 在前端網關即Dirctor作靜態綁定:不利於高可用
(b) 在RS上使用arptables:須要額外配置,複雜且學習成本高昂
(c) 在RS上修改內核參數以限制arp通告及應答級別:
arp_announce 定義arp通告級別 默認0,應設爲2 --> echo 2 > /proc/sys/net/ipv4/conf/enoXXX/arp_announce
arp_ignore 定義arp應答級別 默認0,應設爲1 --> echo 1 > /proc/sys/net/ipv4/conf/enoXXX/arp_ignore
Linux kernel從2.4.26與2.6.4之後引入了兩個設備標識,即上面提到的arp_announce arp_ignore來調整arp模式
arp_announce: 向外通告 0:默認的,通告時告之本機所使用的全部地址、配置、接口 1: 儘可能只通告接入的網絡一端的接口地址(不絕對保證) 2: 必需避免向非本機網絡通告 # DR模式須要 內核地址/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore: 應答請求 0: 默認的,響應本機接口上配置的全部的目標IP地址 1: 只響應入棧報文的那個接口 # DR模式須要 地址同上
詳細arp_ignore與arp_announce說明查看 http://www.cnblogs.com/zyd112/p/8797188.html
LVS DR模型的特性
1.LVS的VIP和realserver必須在同一個網段,否則廣播後全部的包都會丟掉(提早確認LVS/硬件LB 是什麼模式,是否須要在同一個網段中)
2.全部的realserver 都必須綁定VIP的IP地址,不然realserver 收到package後發現dst不是本身的ip,全部包都會丟掉
3.RS的網關必定不能指向DIP
4.請求報文必須通過Director,但響應報文不能通過Director而是由RS直接發往Client以釋放Directory的壓力
5.不支持端口映射(由於響應報文不通過Director)
6.Director的VIP對外可見,RS的VIP對外不可見
7.RS可使用大多數的操做系統
2.3 LVS/TUN
模型:在原請求IP報文以外新加一個IP首部(這個新添加的IP首部其源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS.
TUN類型工做流程(主要是爲了容災,由於Director與各RS是在不一樣網段中,因此能夠存在於不一樣的物理空間)
LVS TUN類型特性
1.RIP,DIP,VIP都得是公網地址 2.RS的網關不會指向也不可能指向DIP 3.請求報文通過Directory,但響應報文必定不通過Director 4.不支持端口映射 5.RS的OS必須得支持隧道功能 ??
2.4 LVS/FULLNAT (LVS默認不支持此類型)
經過同時修改請求報文的源IP地址和目標IP地址進行轉發
原理介紹1
FULLNAT模式是在NAT模式的基礎上作一次源地址轉換(即SNAT),作SNAT的好處是可讓應答流量通過正常的三層路由回到負載均衡上,這樣負載均衡就不須要以網關的形式存在於網絡中了,對網絡環境要求比較低,缺點是因爲作了SNAT,應用服務器會丟失客戶端的真實IP地址。
首先負載均衡上須要存在一個localip池,在作SNAT時的源IP就是從localip池中選擇的。當客戶端流量到達負載均衡設備之後,負載均衡會根據調度策略在應用服務器池中選擇一個應用服務器,而後將數據包的目的IP改成應用服務器的IP。同時從localip池中選擇一個localip將數據包的源IP改成localip,這樣應用服務器在應答時,目的IP是localip,而localip是真實存在於負載均衡上的IP地址,所以能夠通過正常的三層路由到達負載均衡。因爲FULLNAT比NAT模式多作了一次SNAT,而且SNAT中有選端口的操做,所以其性能要遜色於NAT模式,可是對網絡環境具有較強的適應性。
原理介紹2
如上圖。FULLNAT模式對入報文作了DNAT+SNAT,即將報文的目的地址改成RS的地址,源地址改成LVS設備地址;RS上不須要配置路由策略,出報文到了LVS設備上後作SNAT+DNAT,即將報文的源地址改成LVS設備上的地址,目的地址改成真實的用戶地址。
LVS FULLNAT類型特性
1.VIP是公網地址,RIP和DIP是私網地址,且一般不在同一IP網絡,所以,RIP的網關通常不會指向DIP 2.RS收到的請求報文源地址是DIP,所以只需響應給DIP, Dirctor收到RS的回覆報文後將其發往Client 3.請求和響應報文都經由Dirctor 4.支持端口映射
美團點評高性能四層負載均衡-MGW選擇了FULLNAT做爲MGW的轉發模式,MGW介紹地址:https://tech.meituan.com/MGW.html
若是要讓你的服務器支持fullnat,能夠查看如下鏈接方法:https://ieevee.com/tech/2015/12/09/fullnat-2.html
3、LVS調度方法(Scheduler)
LVS的調度方法分爲兩類(靜態算法、動態算法),共10種。
在轉發方式選定的狀況下,採用哪一種調度算法將決定整個負載均衡的性能表現。不一樣的算法適用於不一樣的生產環境,有時可能須要針對特殊需求自行設計調度算法。
靜態方法:僅根據算法自己進行調度(注重起點公平)
① rr:Round Robin 輪詢或輪叫,算法將外部請求按順序輪流分配到集羣中的RS(真實)服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。不支持權重。 ② wrr:Weighted RR 權重輪詢或加權輪叫,此算法根據RS(真實)服務器的不一樣處理能力來調度訪問請求。這樣可保證處理能力強的服務器能處理更多的訪問請求。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。 ③ sh:source hashing 源地址hash,對請求的客戶端IP進行hash計算,可實現session綁定,但可能會破壞負載均衡。Director在本地維護一張hash表,此表保存有每個源IP地址及其第一次調度哪個Server,每一條記錄都有默認時長。 ④ dh:destination hashing 目標地址hash,請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。Director在本地維護一張散列表,此表保存有每一次請求的目標IP及其對應調度的目標服務器(RS) 。將發往同一個目標地址的請求始終轉發至第一次挑中的RS服務器。使用場景多數爲緩存服務器代理。
動態方法:根據算法及RS當前的負載狀態(注重結果公平)
⑤ lc:Least Connection 最少鏈接,此算法動態地將網絡請求調度到已創建的鏈接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用「最小鏈接「算法能夠較好地均衡負載。Overhead=Active*256+Inactive來實現,採用計算值最小的RS,不支持權重。 **⑥ wlc: ** Weighted LC 權重最少鏈接,在集羣系統中服務器性能差別較大的狀況下,調度器採用」加權最少鏈接「優化負載均衡性能,具備較高權值的服務器將承受較大比例的活動鏈接負載。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。是LVS默認的調度算法。權重公式:Overhead=(Active*256+Inactive)/weight ⑦ sed:Shortest Expect Delay 最短時間望延遲,wlc的改進算法,簡單地說就是調度器會選擇響應速度快的RS(真實)服務器,先選擇權重(weight)較大的服務器計算方法:Overhead=(Active+1)*256/weight 這種方式可能會鏈接多個請求都發送給一臺性能較強(即weight值較大)的RS,而別的RS卻連一個請求都不會接收到。 ⑧ nq:Nerver Queus: sed算法的改進,永不排隊,每一個RS至少先處理一個請求,而後再按sed算法來。 ⑨ lblc:Locality-based least connection 基於局部性的最少鏈接,能夠理解爲動態的dh算法。目前主要用於cache集羣系統,該算法根據請求的目標ip地址找出該目標ip地址最近使用的服務器,若該服務器是可用的且沒有超載,則將請求發送的該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用「最少鏈接」的原則選出一個可用的服務器,將請求發送到該服務器。 ⑩ lblcr:Replicated and Locality-based least connection帶複製的基於 的最少鏈接。各緩存RS各自勻一勻緩存項,及達到負載均衡)。上面說了dh不利於負載均衡,這個算法算是彌補了這個缺陷。
4、ipvsadm命令(yum -y install ipvsadm)
grep -i -C 10 "ipvs" grep -i -C 10 "ipvs" /boot/config-2.6.32-504.el6.x86_64 查看ipvs支持的協議與調度方法
支持的協議有:TCP UDP AH ESP AH_ESP SCTP
① 對集羣的操做
首先要肯定好須要使用哪一種拓撲類型(NAT DR TUN)的集羣
ipvsadm -A|E|D -t|u|f director_addr:port [-s scheduler] [-p [timeout]] #director_addr指的就是VIP -A:添加一個集羣服務 # Add -E:修改一個集羣服務 # Edit -D:刪除集羣服務 # Delete 示例: ipvsadm -D -t 10.1.0.5:80 -t:tcp協議服務 -u:udp協議服務 -f:firewall make一般應用於將兩個或以上的服務綁定爲一個服務進行處理時使用,它是一個數字。 示例:ipvsadm -A -f 11 -s wrr # 這個11爲經過iptables xxxx -j MARK --set-mark 11 獲得.又例如將80與443打包成一塊用ipvsadm進行統一調度. service-address # 即LVS服務器的IP地址加以前選項指明的協議類型端口 -t IP:port # tcp協議 -u ip:port # udp協議 -f firewall_mark # 後接一個標記數字,將多個端口組織成一個集羣進行統一調度 firewall_mark示例:`iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11` `ipvsadm -A -f 11 -s wrr` -s 調度算法,這項沒有聲明時默認爲wlc [rr wrr sh dh lc wlc sed nq lblc lblcr] -p: persistence # LVS的持久鏈接功能,沒有接數字則默認爲300秒
② 對RS的操做(LVS的類型是在對RS的操做時定義的)
ipvsadm -a -t|u|f director_addr:port -r RS_addr -[g|i|m] [-w weight] # LVS的類型在這裏定義 -a:添加RS -e:修改 -d:刪除 -r: 後接 RS的ip[:port] -g:gateway, DR,沒有聲明時默認爲DR模型 -m:masquerade, NAT模型 -i:ipip, TUN模型 -w: 定義權重,僅使用在支持權重的算法上。如rr lc等不支持權重的算法加上-w選項則沒有意義。
③ 查看、清空、保存、導入規則
-L|l:顯示規則 -n, --numeric: 不反解析IP地址和端口,數值格式顯示主機地址和端口號 --exact: 顯示精確值 --stats: 統計數據 --rate: 速率 --timeout: 顯示tcp、tcpfin和udp的會話超時時長 --sort: 顯示當前的ipvs鏈接情況 -c, --connection: 查看鏈接數 清空規則 ipvsadm -C # Clear 保存規則(通常都保存在/etc/sysconfig/ipvsadm) * ipvsadm -S 默認標準輸出,可重定向至指定文件 * ipvsadm-save 默認標準輸出,可重定向到指定文件 * systemctl stop ipvsadm.service # 中止時會自動保存 導入規則(2種) 1.ipvsadm -R < /saved_file 2.ipvsadm-restore < /saved_file
5、LVS實際配置
5.1 配置一個NAT類型(2臺RS)的集羣
LVS: if1=172.16.53.128/24(VIP) if2=10.1.1.77/16(DIP)
RS1: 10.1.1.78/16(RIP1)
RS2: 10.1.1.79/16(RIP2)
RS配置:
將RS1 RS2的默認網關指向Director的DIP
route add default gw 10.1.1.77/16
LVS配置:
ipvsadm -A -t 10.1.1.77:80 -s rr # 添加LVS集羣與調度算法
ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.78 -m -w 1 # 添加LVS集羣主機與LVS調度模式及RS權重
ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.79 -m -w 1 # 同上
echo 1 > /proc/sys/net/ipv4/ip_forward # 打開Director的轉發功能
iptables -t nat -A POSTROUTINT -o if1 -j SNAT --to-source 172.16.53.128 #對Director if1網卡發出的源地址進行nat裝換
至此,一個簡單的根據LVS rr算法調度的負載均衡集羣完成了
5.2 配置一個DR類型(2臺RS)的集羣
Directory: VIP: 192.168.31.100/24 調度主機只須要一個網卡接口 VIP用DIP的別名生成
RS1: 192.168.31.194/24
RS2: 192.168.31.220/24
編寫如下腳本文件並分別在各RS上執行.(setparam.sh)
#!/bin/bash # vip=192.168.31.100 mask='255.255.255.255' case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce /sbin/ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;; stop) /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce route del -host $vip dev lo:0 ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $vip` isrothere=`netstat -rn | grep "lo:0" | grep $vip` if [ ! "$islothere" -o ! "isrothere" ]; then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
編寫如下腳本在Director(調度器)上添加VIP 添加LVS規則等操做 (ipvs.sh)
#!/bin/bash # vip=192.168.31.100 iface='eno16777736:0' mask='255.255.255.255' port='80' rs1='192.168.31.194' rs2='192.168.31.220' scheduler='wrr' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t ${vip}:${port} -s $scheduler ipvsadm -a -t ${vip}:${port} -r $rs1 -g -w 1 ipvsadm -a -t ${vip}:${port} -r $rs2 -g -w 2 ;; stop) ifvsadm -C ifconfig $iface down ;; *) echo ''Usage: $(basename $0) {start|stop|status}" exit 1 ;; esac
至此,一個簡單的根據LVS dr算法調度的負載均衡集羣完成了.
5.3 FWM(FireWall Mark)藉助於防火牆標記來分類報文,然後基於標記定義集羣服務,可將多個不一樣的應用使用同一個集羣服務進行調度。
配置示例:
iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 11
ipvsadm -A -f 11 -s rr
ipvsadm -a -t 192.168.31.100 -r 192.168.31.194 -g -w 1
ipvsadm -a -t 192.168.31.100 -r 192.168.31.220 -g -w 1