集羣---負載均衡---lvs篇

簡介前端

The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system. The architecture of the server cluster is fully transparent to end users, and the users interact as if it were a single high-performance virtual server. For more information, click here.
 
層次
 
lvs須要有ipvs模塊進行支持,通常Linux內核2.4以後都會存在此模塊,可經過lsmod查看。ipvs實現了負載調度的功能,工做在內核層次
[root@salt-node01 ~]# lsmod | grep ip_vs
ip_vs_rr               12600  0 
ip_vs                 141092  2 ip_vs_rr
nf_conntrack          111302  7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  2 xfs,ip_vs
You have new mail in /var/spool/mail/root

 

管理工具(都可經過yum來安裝):node

ipvsadm、keepalived、 Piranha(RedHat提供的)python

 

術語:算法

CIP、VIP、DIP、RIP後端

 

集羣組成:緩存

利用LVS搭建的集羣系統由3部分組成:最前端的是負載均衡層,中間層是服務器集羣層,最後層是共享存儲層。共字存儲層是爲全部Real Server提供共亨存儲空問和內容一致性的存儲區域,通常由磁盤陣列設備組成。爲了提俱內容的一致性,通常能夠經過NFS網絡義件系統共 亨數據,可是NFS在繁忙的業務系統中,性能並非很好,此時能夠採用集羣文件 系統,例如Red Hat的GFS文件系統,Oracle提供的OS2文件系統等。此文章不對共享存儲層作詳細介紹,詳情可參照後邊的文章。以下圖所示
服務器

 

模式:網絡

A.NAT 做用於4層,傳輸層併發

流程:初始是CIP:VIP  通過LB時,LB根據調度算法選擇合適的後端RealServer,並將數據包的vip修改成realserver的ip地址,並寫到hash記錄表中;此時數據包變爲了CIP:RIP。將數據包發送給RIP,RIP進行處理後將數據包(RIP:CIP)發送給LB,LB根據hash記錄表,將RIP修改成VIP,而後將數據包發送給CIP。來訪問是DNAT的過程,返回是SNAT的過程。負載均衡

LB:須要在指定網卡綁定vip

RS:須要將網關設置爲LB的IP地址

優勢:可對指定後端rs的端口,便可以更改端口

缺點:進出數據包都會通過LB,LB的網卡流量會是瓶頸

適用場景:非高併發請求場景,10個RS之內;可隱藏內部的DIP和RIP地址;

B.DR 做用於二層,數據鏈路層

流程:初始數據包目標MAC地址是LB的MAC,通過LB時,LB根據調度算法選擇合適的後端RealServer,並將數據包的目標MAC地址修改成realserver的MAC地址,此時數據包的目標地址是RS的MAC,數據包在LB通過泛洪,發送到RS,RS處理時,發現數據IP是本身Lo的IP地址,因此能夠進行處理不會丟棄;RS處理數據包後,將數據包VIP:CIP直接發送給CIP

LB:須要在指定網卡綁定VIP

RS:須要抑制ARP,且LB和RS要在一個廣播域

缺點:不能更改端口,LB和RS必須在一個廣播域,須要關閉RS的arp解析,綁定vip

優勢:負載能力比NAT強,LB流量不會是瓶頸

場景:由於響應報文不通過Director,極大的減輕了Director的負載壓力,故Director能夠支持更大的併發訪問,通常RS在100臺之內;

C.IP TUN

D.FULLNAT

 調度算法:

--scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
                                      the default scheduler is wlc.
 靜態算法:
rr:Round Robin # 即輪詢
wrr:Weighted RR # 即加權輪詢
sh:Source Hashing # 即來源IP地址hash
dh:Destination Hashing # 即目標地址hash(不經常使用,僅用於前端多防火牆的場景,保證防火牆的鏈接追蹤功能有效)

 動態算法:

lc:Least Connection
# 評判標準:Overhead=Active*256+Inactive
# Overhead最小者勝出
wlc:Weighted LC
# 評判標準:Overhead=(Active*256+Inactive)/weight
# Overhead最小者勝出
sed:Shortest Expect Delay
# 評判標準:Overhead=(Active+1)*256/weight
# Overhead最小者勝出
nq:Never Queue # 集羣開始時工做時,每臺服務器都至少分配一個鏈接請求,而後再根據sed算法調度;
lblc:Locality-based Least Connection # 相似於dh+lc
lblcr:Relicated and Locality-based Least Connection # 主要用於後端服務器是緩存服務器時

IPVSADM命令參數詳解:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
命令選項解釋:
有兩種命令選項格式,長的和短的,具備相同的意思。在實際使用時,兩種均可以。
-A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增長一臺新的虛擬服務器。
-E --edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。  修改定義過的集羣服務
-D --delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。
-C --clear 清除內核虛擬服務器表中的全部記錄。
-R --restore 恢復虛擬服務器規則
-S --save 保存虛擬服務器規則,輸出爲-R 選項可讀的格式
-a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增長一臺新的真實服務器
-e --edit-server 編輯一條虛擬服務器記錄中的某條真實服務器記錄
-d --delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L|-l --list 顯示內核虛擬服務器表 userver 列表;
-Z --zero 虛擬服務表計數器清零(清空當前的鏈接數量等)
--set tcp tcpfin udp 設置鏈接超時值
--start-daemon 啓動同步守護進程。他後面能夠是master 或backup,用來講明LVS Router 是master 或是backup。在這個功能上也能夠採用keepalived 的VRRP 功能。
--stop-daemon 中止同步守護進程
-h --help 顯示幫助信息
其餘的選項:
-t --tcp-service service-address 說明虛擬服務器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-u --udp-service service-address 說明虛擬服務器提供的是udp 的服務[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 說明是通過iptables 標記過的服務類型。一般用於將兩個或兩個以上的服務綁定爲一個服務進行處理時使用;
-s --scheduler scheduler 使用的調度算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc.
-p --persistent [timeout] 持久穩固的服務。這個選項的意思是來自同一個客戶的屢次請求,將被同一臺真實的服務器處理。timeout 的默認值爲300 秒。 持久鏈接;
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真實的服務器[Real-Server:port]
-g --gatewaying 指定LVS 的工做模式爲直接路由模式(也是LVS 默認的模式) DR模型
-i --ipip 指定LVS 的工做模式爲隧道模式
-m --masquerading 指定LVS 的工做模式爲NAT 模式
-w --weight weight 真實服務器的權值
--mcast-interface interface 指定組播的同步接口
-c --connection 顯示LVS 目前的鏈接 如:ipvsadm -L -c
--timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 顯示同步守護進程狀態
--stats 顯示統計信息 ipvsadm –Ln  --state 總共的數量
--rate 顯示速率信息 ipvsadm –Ln  --rete 平均值
--sort 對虛擬服務器和真實服務器排序輸出
--numeric -n 輸出IP 地址和端口的數字形式

集羣相關參數:

-A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增長一臺新的虛擬服務器。
-t --tcp-service service-address 說明虛擬服務器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-u --udp-service service-address 說明虛擬服務器提供的是udp 的服務[vip:port] or [real-server-ip:port]
-s --scheduler scheduler 使用的調度算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc.
-p --persistent [timeout] 持久穩固的服務。這個選項的意思是來自同一個客戶的屢次請求,將被同一臺真實的服務器處理。timeout 的默認值爲300 秒。 持久鏈接;
-E --edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。  修改定義過的集羣服務
-D :刪除指定集羣服務

RS相關參數:

-a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增長一臺新的真實服務器         向指定的CS中添加RS
-r --real-server server-address 真實的服務器[Real-Server:port],只有支持端口映射的LVS類型才容許此處使用跟集羣服務中不一樣的端口
LVS 類型:
-g : gateway,DR # 指定集羣類型爲LVS/DR
-i ipip,TUN  # 指定集羣類型爲LVS/TUN
-m:masquerade,NAT # 指定集羣類型爲 NAT
-w:指定RS權重:
-e:修改指定的RS屬性
-d :從指定的集羣服務中刪除某RS

  

DR模式配置實例:

LB:lvs服務端啓停腳本

[root@salt-node01 sbin]# cat ipvs

##CONSTANT
VIP=192.168.142.140
INTERFACE=ens33
SUBINTERFACE=$INTERFACE:`echo ${VIP} | awk -F "." '{print $4}'`
PORT=80
METHOD=rr
RETVAR=0

RIPS=(
192.168.68.150
192.168.68.152
)


##COMMAND OF ABS PATH
IP=/usr/sbin/ip
IPVSADM=/usr/sbin/ipvsadm

. /etc/init.d/functions

function Usage(){


  echo "Usage: $0 {start|stop|status|restart}"
  return 1

}

function ipvsStart(){

  $IP addr add $VIP/24 dev ${INTERFACE}  label $SUBINTERFACE
  $IPVSADM -C
  #add vip instance
  $IPVSADM -A -t $VIP:$PORT -s $METHOD
  #echo ${#RIPS[*]}
  for((i=0;i<`echo ${#RIPS[*]}`;i++))
        do
      $IPVSADM -a -t $VIP:$PORT -r ${RIPS[$i]}:$PORT -g
    done
  RETVAR=$?

  if [ $RETVAR -eq 0 ]
    then
      action "Ipvsadm started sucessed"  /bin/true
  else
    action "Ipvsadm started failed"   /bin/false
  fi
}

function ipvsStop(){

        #clear virtual server
        $IPVSADM -C
        #clear number of connection
        $IPVSADM -Z
        $IP addr del $VIP/24 dev ${INTERFACE}  label $SUBINTERFACE &>/dev/null

        RETVAR=$?

        if [ $RETVAR -eq 0 ]
                then
                        action "Ipvsadm stopped" /bin/true
        else
                action "Ipvsadm stopped" /bin/false
        fi

        return $RETVAR
}


main(){

#Judge argv num
if [ $# -ne 1 ];
     then
       Usage $0
fi
echo $1
case "$1" in
    start)
    ipvsStart
    ;;
    restart)
    ipvsStop
    ipvsStart
    ;;
    *)
    Usage $0
    ;;
esac
}


main  $*

  

 健康檢查:

自己無健康檢查功能,須要本身寫自定義腳本(nmap實現)
 
配合keepalived使用
 
案例彙總:
Q:lvs rr算法,可是請求不均,
調整會話保持時間:lvs會話保持時間和後端RS的會話保持時間Q: 更換防火牆IP,形成舊節點沒法訪問IDC機房刷新arp緩存表時間較長Q:LVS RS下架,用做其餘服務用;lo口綁定vip完善下線機制
相關文章
相關標籤/搜索