1. 程式人生 > >lvs之排程演算法和叢集型別

lvs之排程演算法和叢集型別

LVS

LVS:Linux Virtual Server,是以“軟體”、通過“四層”排程、實現“負載均衡”。

  • 軟體方式實現叢集: lvs軟體是Linux核心中的一個框架,以模組方式載入。

  • 四層排程: lvs工作於通訊子網(核心中),即可檢測“請求報文”中各層“首部”獲取“目標實體地址”、“目標邏輯地址”、“目標傳輸層協議型別及埠”。但對於“應用層”無能為力。

  • 負載均衡: lvs實現的是負載均衡叢集,即將收到的“請求報文”使用“排程演算法”計算,再發送至後端的RS伺服器。

排程演算法

一共10中,又根據是否考慮後端RS的“負載情況”,分為“靜態方法”和“動態方法”。

  • 靜態演算法:僅根據演算法本身和請求報文特徵進行排程,起點公平
  • 動態演算法:需要額外考慮後端各RS的當前的負載狀態,結果公平

靜態方法

  • rr :round-robin,輪替,輪詢。

    排程器將RS列個表(陣列),依次將收到的請求報文傳送至RS。

    舉個栗子吧:一個老師(lvs),12顆糖(請求報文),3個孩子(RS),每個孩子一個碗(陣列元素)。老師怎發糖呢?RS1的碗發一顆,RS2的碗發一顆,RS3的碗發一顆。還有糖,繼續按照上面的順序發。

  • wrr :weighted rr,加權輪詢。

    方法同rr,並根據RS的效能賦予不同的權重。依據權重,RS在列表(陣列)中出現不同的次數。

    還是舉個栗子:還是老師發糖,還是發到碗。但是有個孩子有3個碗,所以他就到了3顆糖。

  • SH :Source Hashing,源地址雜湊。

    將源地址進行雜湊運算後取模,以確定傳送至哪個RS。實現了session sticky,將來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話繫結。

  • DH :Destination Hashing,目標地址雜湊。

    將目標地址進行雜湊運算後取模,以確定傳送至哪個RS。將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理快取場景中的負載均衡。

動態方法

  • LC :least connections,最少連結

    根據連線數計算負載。

      Overhead=activeconns*256+inactiveconns
    

    活動連結非活動連線的負載肯定不同。預設活動連結的負載是非活動連線的256倍。

  • WLC :Weighted LC,加權的最少連結

    同LC,並根據RS伺服器效能賦予權重。

      Overhead=(activeconns*256+inactiveconns)/weight
    

    問題:雖然加權,但還是會出現負載一樣的情況,導致排程時將請求傳送至權重小的RS。例如:剛開啟服務,連線數均為0,計算結果為0。

  • SED :Shortest Expection Delay,最短期望延遲

    為了克服WLC的缺點。不考慮非活動連結數,活動連結數+1。避免了連線數為0時,負載一樣。

      Overhead=(activeconns+1)*256/weight
    

    新的bug:當各RS權重差距非常大時,請求報文會一直被排程至權重大的RS,因為計算得到的負載小。例如:2臺RS權重比1:9,

      RS1的負載:(0+1)*256/1 = 1/256
      RS2的負載:(8+1)*256/9 = 1/256
    

    當RS2被分得8個請求後,2個RS的負載才一樣,此前RS1一直處於空閒。

  • NQ :Never Queue,永不排隊

    先每個RS分一個請求,再SED。改進的sed。

  • LBLC :Locality-Based LC,基於區域性性的最少連線

    動態的DH演算法,DH+LC

    此演算法是根據請求報文的目標ip地址的負載均衡排程,將相同的目標ip地址的請求排程到同一個伺服器。若該rs可用,將傳送請求;若該伺服器不可用,則用最少連線的原則選出一臺可用伺服器來進行匹配。

  • LBLCR :LBLC with Replication,帶複製功能的LBLC

    此種演算法是針對目標ip地址的負載均衡,該演算法根據請求的目標地址ip找出該地址對應的服務組,按最少連線的原則從服務組中選出一臺伺服器。

    若伺服器沒有超載,則傳送請求到該伺服器;若該伺服器超載或者不可用,則按照最小連線的原則從這個叢集中選出一臺伺服器。

    將該伺服器新增到服務組中,在將請求傳送到該伺服器,同時當該伺服器組中有一段時間沒有被修改,將最忙的伺服器從組中剔除,以降低複製的程度。

排程演算法生產環境選型

未完待續... ...

lvs叢集型別中的術語:

LVS叢集術語 說明
vs Virtual Server、Director、Dispatcher、Balancer
rs Real Server、upstream server、backend server
CIP Client IP
VIP Virtual serve IP
RIP Real server IP
DIP Director IP

CIP ←-> VIP == DIP ←-> RIP

graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS(RIP - Real Server) C --- D D --- RS

LVS叢集的型別

工作拓撲、轉發機制

LVS叢集的型別

LVS叢集的型別 說明
lvs-nat 多目標DNAT。通過修改請求的目標IP和(或)Port為經由排程演算法挑選出的某後端RS的RIP和PORT。
lvs-dr 封裝新的MAC地址。通過在原IP報文外封裝幀首部(源MAC、目標MAC),目標MAC是由排程演算法挑選出的某後端RS的MAC地址。
lvs-tun IP隧道。通過在源IP報文(CIP VIP)外再封裝一個新IP首部(DIP RIP)完成排程。
lvs-fullnat 修改請求報文的源和目標IP。通過修改請求的源IP(CIP --> DIP)目標IP(VIP --> RIP)完成排程。

lvs-nat

多目標IP的DNAT,通過將請求報文中的目標地址和目標埠修改為某挑出的RS的RIP和PORT實現轉發;

特性

  1. RIP和DIP必須在同一個IP網路,且應該使用私網地址;RS的閘道器要指向DIP;

  2. 請求報文和響應報文都必須經由Director轉發;Director易於成為系統瓶頸;

  3. 支援埠對映,可修改請求報文的目標PORT;

  4. vs必須是Linux系統,rs可以是任意系統;

graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1) RS2(RIP - Real Server 2) R((Router)) C -- 請求報文 源CIP目的VIP --> R R -- 請求報文 --> D D -- 排程轉發 源DIP目的RIP --> RS1 D -- 排程轉發 源DIP目的RIP --> RS2 graph RL C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1) RS2(RIP - Real Server 2) R((Router)) RS1 -- 響應報文 源RIP目的DIP --> D RS2 -- 響應報文 源RIP目的DIP --> D D -- 響應報文 源VIP目的CIP--> R R -- 響應報文 --> C

lvs-dr

Direct Routing,直接路由;

通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

Director和各RS都得配置使用VIP;

特性

  1. 確保前端路由器將目標IP為VIP的請求報文發往Director:

    • (a) 在前端閘道器做靜態繫結;

    • (b) 在RS上使用arptables;

    • (c) 在RS上修改核心引數以限制arp通告及應答級別;

         arp_announce
         arp_ignore
      
  2. RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網路;RIP的閘道器不能指向DIP,以確保響應報文不會經由Director;

  3. RS跟Director要在同一個物理網路;

  4. 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;

  5. 不支援埠對映;

graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP on lo) RS2(RIP - Real Server 2 - VIP on lo) R((Router)) SW[Switch] C -- 請求報文 源CIP目的VIP --> R R -- 請求報文 --> SW SW -- 請求報文 --> D D -- 排程轉發 IP首部不變 源DIPMAC目的RIPMAC --> SW SW -- 排程轉發 --> RS1 SW -- 排程轉發 --> RS2 graph RL C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP on lo) RS2(RIP - Real Server 2 - VIP on lo) R((Router)) SW[Switch] D --- SW RS1 -- 響應報文 源VIPMAC目的Router's MAC --> SW RS2 -- 響應報文 源VIPMAC目的Router's MAC --> SW SW -- 響應報文 --> R R -- 響應報文 --> C

lvs-tun

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

特性

  1. DIP, VIP, RIP都應該是公網地址;

  2. RS的閘道器不能,也不可能指向DIP;

  3. 請求報文要經由Director,但響應不能經由Director;

  4. 不支援埠對映;

  5. RS的OS得支援隧道功能;

graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP on lo) RS2(RIP - Real Server 2 - VIP on lo) R((本地Router)) BR1((異地Router)) BR2((異地Router)) W((廣域網WAN)) C -- 請求報文 源CIP目的VIP --> W W -- 請求報文 --> R R -- 請求報文 --> D D -- 排程轉發 內層源CIP目的VIP 外層源DIP目的RIP --> R R -- 排程轉發 --> W W -- 排程轉發 --> BR1 W -- 排程轉發 --> BR2 BR1 -- 排程轉發 --> RS1 BR2 -- 排程轉發 --> RS2 graph RL C(Client - CIP) D(VIP - Dispatcher - DIP) R((本地Router)) RS1(RIP - Real Server 1 - VIP on lo) RS2(RIP - Real Server 2 - VIP on lo) BR1((異地Router)) BR2((異地Router)) W((廣域網WAN)) D --- R R --- W RS1 -. 相應報文 源VIP目的CIP .-> BR1 RS2 -. 相應報文 源VIP目的CIP .-> BR2 BR1 -. 相應報文 .-> W BR2 -. 相應報文 .-> W W -. 相應報文 .-> C

問題:因在IP報文外面再封裝IP頭,會造成幀大於MTU,導致分片。

lvs-fullnat

通過同時修改請求報文的源IP地址和目標IP地址進行轉發;

CIP <--> DIP 
VIP <--> RIP 

特性

  1. VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網路;因此,RIP的閘道器一般不會指向DIP;

  2. RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client;

  3. 請求和響應報文都經由Director;

  4. 支援埠對映;

注意:此型別預設不支援;

graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP) RS2(RIP - Real Server 2 - VIP) R((Router)) C -- 請求報文 源CIP目的VIP --> R R -- 請求報文 --> D D -- 排程轉發 源DIP目的RIP --> RS1 D -- 排程轉發 源DIP目的RIP --> RS2 graph RL C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP) RS2(RIP - Real Server 2 - VIP) R((Router)) RS1 -- 響應報文 源RIP目的DIP --> D RS2 -- 響應報文 源RIP目的DIP --> D D -- 響應轉發 源VIP目的CIP --> R R -- 響應轉發 --> C

總結:

  • 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首部實現轉發,支援遠距離通訊;