使用LVS實現負載均衡原理及安裝配置詳解

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同在一個網段內)緩存

模型:安全

image

image

如上圖,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
網絡

模型:

image

image

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.

image

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地址。

image

首先負載均衡上須要存在一個localip池,在作SNAT時的源IP就是從localip池中選擇的。當客戶端流量到達負載均衡設備之後,負載均衡會根據調度策略在應用服務器池中選擇一個應用服務器,而後將數據包的目的IP改成應用服務器的IP。同時從localip池中選擇一個localip將數據包的源IP改成localip,這樣應用服務器在應答時,目的IP是localip,而localip是真實存在於負載均衡上的IP地址,所以能夠通過正常的三層路由到達負載均衡。因爲FULLNAT比NAT模式多作了一次SNAT,而且SNAT中有選端口的操做,所以其性能要遜色於NAT模式,可是對網絡環境具有較強的適應性。

原理介紹2

 

image

如上圖。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

HTTPS     詳細 X
基本翻譯
abbr. 超文本傳輸協議安全(Hyper Text Transfer Protocol)
網絡釋義
HTTPS: HTTP Secure
android https: 通訊安全
相關文章
相關標籤/搜索