lvs快速入手

lvs簡介

​ Linux 虛擬服務器(Linux Virtual Servers,LVS) 使用負載均衡技術將多臺服務器組成一個虛擬服務器。它爲適應快速增長的網絡訪問需求提供了一個負載能力易於擴展,而價格低廉的解決方案。

名詞說明

單詞 說明
LB 負載均衡器
VIP 負載均衡器IP地址,作爲訪問入口
CIP 客戶端IP
RIP 真實服務器地址
RS 真實服務器

LVS結構與工作原理

1、LVS的結構

​ 虛擬服務器的體系結構如圖所示,一組服務器通過局域網或廣域網相連接,前端有一個負載調度器(Load Balancer), 負載均衡器將網絡請求調度至真實服務器 (Real Server RS)羣 上,LVS這種結構對用戶來說是透明的,用戶訪問只能看到一臺作爲LB的虛擬服務器 (virtual server VS), 當用戶請求發往RS, LB根據設定的包轉發策略和負載均衡調度算法在轉發給RS, RS最終在將用戶請求的結果返回。

lvs-2

2、LVS內核模型

​ 首先lvs是基於tcp四層傳輸層協議,它根據請求報文的目標IP和PORT將其轉發至後端主機集羣中的某一臺主機(根據挑選算法)

  1. 當客戶端的請求到達 LB 的內核空間時,首先會到達 PREROUTING鏈
  2. 當內核發現請求數據包的 目的地址是本機 時, 將數據包送往 INPUT鏈
  3. LVS由 用戶空間的 ipvsadm內核空間的IPVS 組成, ipvsadm 用來定義規則, IPVS利用ipvsadm定義的規則工作, IPVS工作在INPUT鏈, 當數據包到達INPUT鏈時, 首先會被IPVS檢查, 如果數據包裏的 DIP和端口沒有在規則裏面,那麼這條數據包將會放行至用戶空間
  4. 如果數據包 DIP及端口在規則裏, 那麼該數據報文將被修改目的地址爲事先定義好的後端服務器 ( RS ),並送往POSTROUTING 鏈
  5. 最後經由 POSTROUTING鏈 發往後端服務器

lvs快速入手

3、LVS包轉發模型

3.1、NAT模型

3.1.1、NAT工作原理

  1. client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
  2. LB收到報文後,發現請求的是規則裏面存在的地址,它將客戶端請求報文的目標地址改爲了後端服務器的 RIP 並將報文根據算法發送出去
  3. 報文送到 RS 後, 由於報文地址是自己,所以會響應該請求,並將響應報文還給LVS
  4. 最後LVS 將此報文的源地址修改爲本機(vip) 併發送給客戶端, 注: 在NAT模式中,RS網關必須指向LVS,否則報文無法送到客戶端

lvs快速入手

3.1.2、特性

  1. 請求和響應的報文都得經過 Director ,在高負載場景中, Director 很可能成爲性能瓶頸
  2. RS和DIP應該使用私網地址,且RS的網關必須指向DIP;
  3. RS的RIP和Directory的DIP必須在同一IP網絡;
  4. RS可以使用任意OS;
  5. 支持端口映射

3.2、DR模型

3.2.1、DR工作原理

  1. client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
  2. LB 收到報文後, 發現請求的是規則裏面存在的地址, 那麼它將客戶端請求報文的源MAC地址改成自己DIP的MAC地址, 目標MAC改爲了RIP的MAC地址,並將此包發送給RS
  3. RS 發現請求報文中的目的MAC是自己, 就會將該報文接收下來,處理完請求報文後,將響應請求通過lo接口 送給eth0網卡 直接發送給客戶端, 注: 需要設置lo接口的VIP不能響應本地網絡內的arp請求, 使用最多還是這種, NAT調度器模型會有性能瓶頸

lvs快速入手

3.2.2、特性

  1. RS 可以使用私有地址,還可以使用公網地址,此時可以直接通過互聯網連入 RS ,以實現配置、監控等
  2. RS 的網關一定不能指向 DIP
  3. RS 跟 Dirctory 要在同一物理網絡內(不能有路由器分隔) dip 跟 rip 最好在同一網絡內
  4. 請求報文經過 Directory ,但響應報文一定不經過 Director
  5. 不支持端口映射

3.3、TUN模型

  1. client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
  2. LB 收到報文後, 發現請求的是規則裏面存在的地址,那麼它將在客戶端請求報文的首部再封裝一層IP報文, 將源地址改爲 DIP,目標地址改爲 RIP, 並將此包發送給RS
  3. RS收到請求報文後,會首先拆開第一層封裝,然後發現裏面還有一層IP首部的目標地址是自己lo接口上的vip,所以會處理此次請求報文,並將響應報文通過lo接口送給eth0網卡 直接發送給客戶端。 注: 需要設置lo接口的VIP不能在公網上出現

4、LVS調度算法

LVS的調度算法分爲靜態與動態兩類

4.1、靜態算法(4種)

只根據算法進行調度 而不考慮後端服務器的實際連接情況和負載情況

  1. RR: 輪詢調度(Round Robin)

    ​ 調度器通過 "輪叫" 算法將外部請求按順序輪流分配到集羣中的RS上, 它均等對待每一臺服務器,而不會考慮服務器的實際連接數及系統負載。

  2. WRR: 加權輪詢 (Weight RR)

    ​ 調度器通過 "加權輪叫" 算法根據RS的不同處理能力來調度訪問請求, 調度器可以自動問詢RS的負載情況並動態調整其權值, 注:需要根據服務性能來手動控制其權重。

  3. DH: 目標地址散列調度 (Desination Hash)

    ​ 根據請求的目標IP地址, 作爲散列鍵 從 靜態分配的散列表找出對應服務器, 若該服務器是可用的且未超載, 則將請求發送到該服務器,否則返回空。

  4. SH: 源地址hash

    ​ "源地址散列" 算法根據請求的源IP地址, 作爲散列鍵 從 靜態分配的散列表找出對應服務器, 若該服務器是可用的且未超載, 則將請求發送到該服務器,否則返回空。

4.2、動態算法(6種)

前端的調度器根據後端RS的實際連接情況來進行動態分配請求

  1. LC: 最少連接(Least Connections)

    ​ 調度器通過 "最少連接" 調度算法 將網絡請求調度到已建立鏈接數最少的服務器上,如果集羣系統的RS具有相近的系統性能,採用 "最少連接" 算法可以較好的負載均衡

  2. WLC: 加權最少連接(默認採用的就是這種) (Weighted Least Connections)

    ​ 在集羣系統中的服務器性能差異較大的情況下, 調度器採用 "加權最少連接" 調度算法 優化負載均衡性能,具有較高權值的服務器將隨較大比例的活動連接負載, 調度器可以自動問詢真實服務器的負載情況 並動態地調整其權值

  3. SED:最短延遲調度(Shortest Expected Delay )

    ​ 在WLC基礎上改進, Overhead = (ACTIVE +1) * 256/加權, 不在考慮非活動狀態, 把當前處於活動狀態的數目+1來實現,數目最小的接受下次請求, +1的目的是爲了考慮加權的時候,非活動連接過多缺陷,當權限過大的時候,會倒置空閒服務器一直處於無連接狀態

  4. NQ: 永不排隊/最少隊列調度(Never Queue Scheduling NQ)

  5. LBLC:基於局部性的最少鏈接(locality-Based Least Connections)

  6. LBLCR:帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication)

5、LVS

5.1、LVS組件

# 安裝:  ~]# yum -y install ipvsadm

ipvsadm (定義集羣服務寫規則) /ipvs (工作於內核中INPUT鏈)

ipvsadm: 用戶空間的命令行工具,用於管理集羣服務(增刪查改)

ipvs: 工作於內核中 netfilter INPUT 鉤子上:

5.1.1、ipvsadm用法

  1. 管理集羣服務

    管理集羣服務
    ipvsadm -A|E -t|u|f service-address [-s scheduler]   
    ipvsadm -D -t|u|f service-address
    
    -A: 添加一個集羣服務
     -t : tcp
     -u : udp
     -f : firewall make 通常應用於將兩個或以上的服務綁定爲一個服務進行處理時使用
    
    service-address
    tcp: -t ip:port
    udp:  -u ip:port
    fwm:  -f mark   防火牆標記
    
    -s scheduler
    默認爲wlc
    
    如 添加:  ~]# ipvsadm -A -t VIP地址:端口 -s rr
      刪除: ~]# ipvsadm -D -t VIP地址:端口
  2. 管理集羣服務中的RS

    管理集羣服務中的RS
    ipvsadm -a|e -t|u|f service-address -r server-address
    ipvsadm -d -t|u|f service-address -r server-address
    
    server-address:      ip[:port]   端口一般可省略
    lvs-type:
    -g: gateway, dr
    -i:ipip, tun
    -m: masquerade, net
    
    添加: ~]# ipvsadm -a -t vip地址:端口號 -r 真實地址:端口 -m
    刪除:  ~]# ipvsadm -d -t VIP地址:端口 -r 192.168.9.32:80
  3. 通用查看命令

    ipvsadm -C                           清空所有
    ipvsadm -L|l [options]               查看
    -n: numeric, 基於數字格式顯示地址和端口:
    -c: connection, 顯示連接
    --stats: 統計數據
    --rate: 速率
    --sort: 排序
    --exact:  顯示精確值
    ipvsadm -R                           重載
    ipvsadm -S [-n]                      保存
    ipvsadm -Z [-t|u|f service-address]  置零記數器

5.2、lvs-nat配置

lvs快速入手

LVS配置

echo "1" > /proc/sys/net/ipv4/ip_forward #開啓LVS服務器的IP路由轉發功能

# 添加虛擬地址
 ~]# ifconfig ens160:1 192.168.9.111 netmask 255.255.255.0
 ~]# ip addr 
 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    inet 192.168.9.224/24 brd 192.168.9.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet 192.168.9.111/24 brd 192.168.9.255 scope global secondary ens160:1

~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.31:80 -m
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.32:80 -m

# 查看地址
~]# ipvsadm -L -n 
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.9.111:999 rr
      -> 192.168.9.31:80              Masq    1      0          0         
      -> 192.168.9.32:80              Masq    1      0          0         

RS配置

# 必須將網關地址指向DIP

# 啓動服務即可, systemctl restart nginx

測試

~]# for i in {1..10};do curl http://192.168.9.111:999;sleep 2;done
    192.168.9.32
    192.168.9.31
    192.168.9.32
    192.168.9.31
    ....

~]# ipvsadm
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.9.111:garcon rr
      -> 192.168.9.31:http            Masq    1      0          15        
      -> 192.168.9.32:http            Masq    1      0          15        

5.3、lvs-dr配置

重要參數

兩個內核參數
    /proc/sys/net/ipv4/conf/lo/
    /proc/sys/net/ipv4/conf/all/

arp_annonce (通告)
    0 : 通告所有的地址
    1 : 儘量避免向本網段地址通告
    2 : 總是用最佳本地地址通告

arp_ignore
    0   : 通告所有
    1   : 請求報文是從哪接口進入,從哪個接口響應

lvs快速入手

LVS配置

# 配置虛擬地址,廣播地址設置爲自己
~]# ifconfig ens160:1 192.168.9.111 broadcast 192.168.9.111 netmask 255.255.255.0 up
 ~]# ifconfig ens160:1
ens160:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.9.111  netmask 255.255.255.255  broadcast 192.168.9.111

# 添加路由
~]# ip route add 192.168.9.111 dev ens160:1

~]# ip route show
    192.168.9.111 dev ens160  scope link 

~]# ipvsadm -A -t 192.168.9.111:999 -s rr   # 測試使用輪詢查看效果
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.31 -g  
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.32 -g  
# 需要注意的是 不支持端口映射, 寫了端口也會跟vip端口一樣

 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.9.111:garcon rr
  -> 192.168.9.31:garcon          Route   1      0          0         
  -> 192.168.9.32:garcon          Route   1      0          0         

LVS-DR 後端服務器配置

~]# ifconfig lo:0 192.168.9.111 netmask 255.255.255.255 broadcast  192.168.9.111 up  # 配置迴環地址

~]#  ifconfig  # 查看 
# lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
#         inet 192.168.9.111  netmask 255.255.255.255
#          loop  txqueuelen 1000  (Local Loopback)

~]# route add -host 192.168.9.111 dev lo:0   # 添加路由 
~]# ip route   # 查看路由

# 通告
    echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
    echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

參考文檔:

LVS原理詳解: http://www.178linux.com/13570

Linux服務器集羣系統: http://linux-vs.org/zh/lvs1.html

LVS(NAT和DR)模式詳細配置: https://www.jianshu.com/p/2ed85a5204cc

CentOS 7 網絡配置詳解: https://blog.51cto.com/simonhu/1588971

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章