淺談Linux Virtual Server服務

❎ 集羣的概念

1️⃣ 系統性能擴展方式:

  • Scale UP:垂直擴展,向上擴展,增強,性能更強的計算機運行同樣的服務
  • Scale Out:水平擴展,向外擴展,增加設備,並行地運行多個服務調度分配問題,
  • 集羣(Cluster)即是向外擴展思路的體現
  • 垂直擴展不再提及:
    隨着計算機性能的增長,其價格會成倍增長
    單臺計算機的性能是有上限的,不可能無限制地垂直擴展

2️⃣ 集羣的概念和分類

  • Cluster:集羣,爲解決某個特定問題將多臺計算機組合起來形成的單個系統

▶1 Linux Cluster類型

  • LB(Load Balancing):負載均衡

  • HA(High Availiablity):高可用

    • SPOF(Single Point Of Failure):單點失敗,必須儘可能消滅出現單點失敗的環節
    • MTBF(MeanTime Between Failure):平均無故障時間
    • MTTR(MeanTime To Restoration/Repair):平均恢復前時間,即故障修復時間
    • A=MTBF/(MTBF+MTTR)
      取值範圍(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%,生產環境要求99.999%以上,即一年內故障時間不超過0.001%(約5分鐘)
  • HPC(High-performance computing):高性能,超級計算機

▶2 Cluster按照實現分類

  • 硬件
    F5 Big-IP
    Citrix Netscaler
    A10 A10

  • 軟件
    lvs:Linux Virtual Server
    nginx:支持四層調度
    haproxy:支持四層調度

▶3 Cluster基於工作協議層次分類

  • 傳輸層(通用):基於IP地址與端口DPORT
    LVS:
    nginx:stream
    haproxy:mode tcp

  • 應用層(專用):針對特定協議,自定義的請求模型分類
    也稱作代理服務器(proxy server)
    http:nginx, httpd, haproxy(mode http), …
    fastcgi:nginx, httpd, …
    mysql:mysql-proxy, …

3️⃣ 負載均衡下實現會話保持

  • http協議是無狀態的,cookie和session機制實現會話保持

  • 在負載均衡模式下,相同客戶端的前後連接可能被分配給不同的服務器提供服務,需要有相關技術解決會話保持問題

  • 三種解決技術:

    • session sticky:同一用戶調度固定服務器
      Source IP:LVS sh算法(對某一特定服務而言)
      Cookie
    • session replication:每臺服務器擁有全部session
      session multicast cluster
    • session server:專門的session服務器
      Memcached, Redis

❎ Linux Virtual Server簡介

1️⃣ LVS介紹

  • LVS(Linux Virtual Server):負載調度器,集成內核

  • 工作原理:VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根據調度算法來挑選RS

  • LVS集羣類型中的術語

VS:Virtual Server,又稱Director, Dispatcher(調度器), Load Balancer
RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)
CIP:Client IP
VIP:Virtual server IP,LVS外網的IP
DIP:Director IP,LVS內網的IP
RIP:Real server IP
  • 訪問流程:CIP <–> VIP == DIP <–> RIP
    在這裏插入圖片描述
  • LVS集羣類型
    • lvs-nat:修改請求報文的目標IP,即多目標IP的DNAT
    • lvs-dr:操縱封裝新的MAC地址
    • lvs-tun:在原請求IP報文之外新加一個IP首部
    • lvs-fullnat:修改請求報文的源和目標IP

2️⃣ LVS-NAT模式

實現原理
本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改爲VS調度的RS的RIP和PORT實現轉發

特點

  • RIP和DIP建議在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP
  • 請求報文和響應報文都必須經由Director轉發,Director易於成爲系統瓶頸
  • 支持端口映射,可修改請求報文的目標PORT
  • VS必須是Linux系統,RS可以是任意OS系統
    在這裏插入圖片描述
    在這裏插入圖片描述

3️⃣ LVS-DR(Direct Routing)模式

▶1 LVS-DR實現原理

  • 通過爲請求報文重新封裝一個MAC首部進行轉發
  • 源MAC是DIP所在的接口的MAC,目標MAC是VS調度的RS的RIP所在接口的MAC地址
  • 源IP/PORT,以及目標IP/PORT均保持不變

▶2 LVS-DR模式特點

  • 直接路由,LVS默認模式,應用最廣泛
  • Director和各RS都配置有VIP
  • 源IP/PORT以及目標IP/PORT均保持不變
  • RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director
  • RS和Director要在同一個物理網絡
  • 請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client
  • 不支持端口映射(端口不能修改)
  • RS可使用大多數OS系統

▶3 LVS-DR調度條件

  • 通過RS目標MAC實現調度的條件:防止IP地址衝突

  • 有以下三種方法

    • Director上靜態綁定VIP和RS的MAC地址
    • 在RS上使用arptables工具
      arptables -A IN -d $VIP -j DROP
      arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    • 在RS上修改內核參數以限制arp通告及應答級別,推薦此種方法
    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
    
  • 流程原理圖
    在這裏插入圖片描述
    在這裏插入圖片描述

4️⃣ LVS-TUN模式

▶ 實現原理

  • 不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP)
  • 而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;
  • RS直接響應給客戶端(源IP是VIP,目標IP是CIP)

▶ LVS-TUN模式特點

  • DIP, VIP, RIP都應該是公網地址
  • RS的網關不能,也不可能指向DIP
  • 請求報文要經由Director,但響應不能經由Director
  • 不支持端口映射
  • RS的OS須支持隧道功能
  • 流程原理
    在這裏插入圖片描述

5️⃣ LVS-FULLNAT模式

▶ 實現原理

  • 通過同時修改請求報文的源IP地址和目標IP地址進行轉發
    CIP --> DIP
    VIP --> RIP

▶ LVS-FULLNAT模式特點

  • VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP
  • RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client
  • 請求和響應報文都經由Director
  • 支持端口映射;
  • 注意:此類型kernel默認不支持
  • 流程原理圖
    在這裏插入圖片描述

6️⃣ LVS四種模式異同

在這裏插入圖片描述

  • lvs-nat與lvs-fullnat:請求和響應報文都經由Director
    lvs-nat:RIP的網關要指向DIP
    lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信

  • lvs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client
    lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發
    lvs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信

7️⃣ LVS 調度算法

  • 根據調度時是否考慮各RS當前的負載狀態,分爲靜態方法和動態方法

🌐 靜態算法(四種)

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

▶ RR:輪叫調度(Round Robin)

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

▶ WRR:加權輪叫(Weight RR)

調度器通過“加權輪叫”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

▶ DH:目標地址散列調度(Destination Hash )

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

▶ SH:源地址 hash(Source Hash)

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

🌐 動態算法(六種)

前端的調度器會根據後端真實服務器的實際連接情況來分配請求

▶ LC:最少鏈接(Least Connections)

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

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

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

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

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

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

無需隊列。如果有臺 realserver的連接數=0就直接分配過去,不需要再進行sed運算,保證不會有一個主機很空間。在SED基礎上無論+幾,第二次一定給下一個,保證不會有一個主機不會很空閒着,不考慮非活動連接,才用NQ,SED要考慮活動狀態連接,對於DNS的UDP不需要考慮非活動連接,而httpd的處於保持狀態的服務就需要考慮非活動連接給服務器的壓力。

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

基於局部性的最少鏈接”調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。

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

帶複製的基於局部性最少鏈接”調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按”最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按“最小連接”原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的程度。

❎ LVS 相關軟件

1️⃣ 程序包:ipvsadm

  • ipvsadm:集羣服務管理和集羣服務的RS管理工具
  • Unit File: ipvsadm.service
    在這裏插入圖片描述
  • 主程序:/usr/sbin/ipvsadm
  • 規則保存工具:/usr/sbin/ipvsadm-save
  • 規則重載工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config

2️⃣ ipvsadm管理集羣服務

ipvsadm命令

  • 增、改
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

  • 刪除
    ipvsadm -D -t|u|f service-address

  • -t|u|f service-address

    • service-address:VIP:PORT
      -t:TCP協議的端口,VIP:TCP_PORT
      -u:UDP協議的端口,VIP:UDP_PORT
      -f:firewall MARK,標記,一個數字
      [-s scheduler]:指定集羣的調度算法,默認爲wlc
  • ipvsadm工具示例用法

# 管理集羣服務
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 –C #清空
ipvsadm –R #重載
ipvsadm -S [-n] #保存

3️⃣ ipvsadm管理集羣上的RS

ipvsadm命令

  • 增、改
    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

  • 刪除
    ipvsadm -d -t|u|f service-address -r server-address

  • -t| u | f VIP:PORT -r RIP:PORT,省略PORT則爲不做端口映射

  • lvs類型:
    -g:gateway,dr類型,默認
    -i:ipip,tun類型
    -m:masquerade,nat類型

  • -w weight:權重

4️⃣ FWM(FireWall Mark)

  • FWM的功能:分類報文並基於標記定義集羣服務;實現多個不同的應用使用同一個集羣服務進行調度
    • 基於iptables的mangle表來實現
    • MARK target 可用於給特定的報文打標記
      --set-mark value
    • 其中:value 可爲0xffff格式,表示十六進制數
  • 實現方法:
    • 在Director主機打標記
      iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
    • 在Director主機基於標記定義集羣服務
      ipvsadm -A -f NUMBER [options]
    • –set-mark NUMBER:NUMBER爲16進制數
  • 示例
[root@lvs ~]#ipvsadm -A -f 10
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.17 -g
[root@lvs ~]#ipvsadm -a -f 10 -r 192.168.39.7 -g
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc
-> 192.168.39.7:0 Route 1 0 0
-> 192.168.39.17:0 Route 1 0 0

在這裏插入圖片描述
在這裏插入圖片描述

5️⃣ LVS 持久連接

  • session 綁定:對共享同一組RS的多個集羣服務,需要統一進行綁定,lvs sh算法無法實現

  • 持久連接(lvs persistence)模板:實現無論使用任何調度算法,在一段時間內(默認360s),能夠實現將來自同一個地址的請求始終發往同一個RS
    ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]

  • 持久連接實現方式:

    • 每端口持久(PPC):每個端口對應定義爲一個集羣服務,每集羣服務單獨調度
    • 每防火牆標記持久(PFWMC):基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity
    • 每客戶端持久(PCC):基於0端口(表示所有服務)定義集羣服務,即將客戶端對所有應用的請求都調度至後端主機,必須定義爲持久模式(基本不用,會開放主機全部端口)
  • 示例

[root@lvs ~]#ipvsadm -E -f 10 -p
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc persistent 360
-> 192.168.39.7:0 Route 1 0 15
-> 192.168.39.17:0 Route 1 0 7
[root@lvs ~]#ipvsadm -E -f 10 -p 3600
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 wlc persistent 3600
-> 192.168.39.7:0 Route 1 0 79
-> 192.168.39.17:0 Route 1 0 7

6️⃣ 其他ipvsadm命令

清空定義的所有內容:ipvsadm -C
清空計數器:ipvsadm -Z [-t|u|f service-address]
查看:ipvsadm -L|l [options]
--numeric, -n:以數字形式輸出地址和端口號
--exact:擴展信息,精確值
--connection,-c:當前IPVS連接輸出
--stats:統計信息
--rate :輸出速率信息
查看當前內存中ipvs規則:/proc/net/ip_vs
查看當前內存中ipvs連接:/proc/net/ip_vs_conn

7️⃣ 保存及重載規則

  • 保存:建議保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
  • 重載:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE      
/ 上述兩條命令一個意思
systemctl restart ipvsadm.service

發佈了107 篇原創文章 · 獲贊 20 · 訪問量 6357
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章