octavia的實現與分析(一)·openstack負載均衡的現狀與發展以及lvs,Nginx,Haproxy三種負載均衡機制的基本架構和對比

流年的夏天發表於2019-07-06

【負載均衡】

大量使用者發起請求的情況下,伺服器負載過高,導致部分請求無法被響應或者及時響應。

負載均衡根據一定的演算法將請求分發到不同的後端,保證所有的請求都可以被正常的下發並返回。

 

 

   

【主流實現-LVS】

LVS 是 Linux Virtual Server 的簡稱,也就是 Linux 虛擬伺服器,已經是 Linux 標準核心的一部分。

採用IP負載均衡技術基於內容請求分發

   

排程器具有很好的吞吐率,將請求均衡得轉移到不同的伺服器上執行,且排程器可以自動遮蔽掉故障的伺服器,從而將一組伺服器構成一個高可用,高效能的伺服器叢集。

 

 

  *負載均衡機制

1. LVS是四層負載均衡,也就是說在傳輸層上,LVS支援TCP/UDP。由於是四層負載均衡,所以相對於其他的高層負載均衡而言,對於DNS域名輪流解析應用層負載的排程客戶端的排程等,它的效率是相對較高的。

2. 四層負載均衡,主要通過報文的目標地址和埠。(七層負載均衡又稱為"內容交換",主要是通過報文中真正有意義的應用層內容)

3. LVS的轉發主要通過修改IP地址(NAT模式,包括SNAT和DNAT),修改目標MAC(DR模式)來實現。

   

  *負載均衡模式-NAT模式

NAT(Network Address Translation)是一種外網和內網地址對映的技術。

NAT模式下,網路資料包的進出都要經過LVS的處理。LVS需要作為RS(真實伺服器的閘道器。

   

當包從Client到達LVS時,LVS做DNAT(目標地址轉換),將D-IP(目的地址)改變為RS的IP。

RS處理完成,將包返回的時候,S-IP(源地址)是RS,D-IP是Client的IP。

到達LVS做閘道器中轉時,LVS會做SNAT(源地址轉換),將包的S-IP改為VIP。

   

  *負載均衡模式-DR模式

DR(直接路由)模式下需要LVS和RS繫結同一個叢集(RS通過將VIP繫結在loopback實現)。

請求由LVS接受,返回的時候由RS直接返回給Client

   

當包到LVS的時候,LVS將網路幀的MAC地址修改為某臺RS的MAC,此包會被轉發到對應的RS上面進行處理。

此時S-IP和D-IP都沒有發生改變

RS收到LVS轉發的包時,鏈路層發現MAC地址是自己的,網路層發現IP地址也是自己的,於是包被合法接受,RS不感知LVS。

當包返回時,RS直接返回給Client,不再經過LVS。

 

 

   

由於RS響應的資料包是直接返回給Client的,所以有效得避免了負載均衡伺服器的頻寬成為瓶頸

   

  *負載均衡模式-IP隧道模式

隧道模式有點類似與VPN,使用網路分層的原理,在從客戶端發來的資料包的基礎上,封裝一個新的IP頭標記不完整,只有目的IP)傳送給RS。

RS收到後,先把DR發過來的資料包的頭解開,還原資料包。處理完成後,直接返回給Client。

   

  *負載均衡模式-總結

綜上所述,DR模式具有更好的效能,也是目前大型網站比較通用的一種模式。

   

  *LVS排程演算法

限於篇幅,只介紹部分演算法。

1. 輪詢排程

2. 加權輪詢排程

3. 最小連線數排程

4. 加權最小連線數排程

5. 基於區域性性的最少連線(LBLC

該演算法主要用於Cache叢集系統

該演算法根據請求的D-IP找出該D-IP地址最近使用的伺服器地址,如果此伺服器可用,則傳送給此伺服器。如果不可用,則使用最小連線數演算法選擇一個伺服器傳送報文。

6. 帶複製的基於區域性性的最少連線(LCLBR

它與LBLC演算法的不同之處是它要維護從一個目標IP地址到一組伺服器的對映,而LBLC演算法維護從一個目標IP地址到一臺伺服器的對映。

在LBLC演算法裡面,某些熱門站點報文較多,可能伺服器很快會達到飽和,然後切換到第二臺又會很快達到飽和,然後後端伺服器就一直在切換,造成資源不必要的浪費。

LCLBR裡面,單個伺服器變成了一組伺服器,就會有效避免這種情況。

7. 目標地址雜湊

8. 源地址雜湊

   

  *LVS的優點

1. 抗負載能力強,由於工作在傳輸層上,只做分發,無流量產生,所以它在所有的負載均衡裡面效能是最強的,對記憶體和CPU的消耗也比較低。

2. 配置性較低,減少人為出錯的概率,但是也相應減少了人為自主性。

3. 工作穩定,自身有完整的雙機熱備方案,如:LVS + Keepalived

4. 無流量,保證IO不會受到影響。

   

  *LVS的缺點

1. 軟體本身不支援正規表示式處理,不能做動靜分離。

2. 網站應用比較龐大的時候,LVS/DR+Keepalive實施較為複雜。

   

【主流實現-Nginx】

Nginx是一個很強大的高效能Web和反向代理伺服器。

最大的優勢在於高負載情況下對記憶體和CPU的低消耗。

在高併發的情況下,Nginx是Apache伺服器不錯的替代品。

 

  *傳統基於程式或執行緒的模型

傳統基於程式或執行緒的模型(如Apache)在處理併發時會為每一個連線建立一個單獨的程式或執行緒。這種方法會在網路傳輸或者I/O操作上阻塞。

對於應用來講,在記憶體和CPU的使用上效率都是非常低的。

而且,生成一個單獨的程式/執行緒還需要為其準備新的執行環境(主要包括分配堆疊記憶體),以及上下文執行環境

建立這些都消耗額外的CPU時間,這最終也會因為執行緒上下文來回切換導致效能非常差。

   

  *Nginx架構設計

Nginx的架構設計是採用模組化的,基於事件驅動非同步單執行緒且非阻塞

Nginx大量使用多路複用事件通知,nginx啟動之後,會在系統中以 daemon(守護程式) 的方式在後臺執行,包括一個master程式和多個worker程式。

   

所有的程式都是單執行緒的,程式間通訊主要通過共享記憶體的方式。

多個連線,是通過worker程式中高效迴環(run-loop)機制來處理的。對於每個worker程式來說,每秒鐘可以處理上千個請求和連線。

 

  *Nginx負載均衡

Nginx 負載均衡主要針對七層的http和https,當然,四層Nginx後來也支援了(1.9.0版本增加stream模組,用來實現四層協議)。

Nginx主要是通過反向代理的方式進行負載均衡的,所謂反向代理(Reverse Proxy),指的是以代理伺服器來接收 Client 請求,然後將請求轉發到內部伺服器,並將內部伺服器處理完成的結果返回給 Client ,對外,代理伺服器就是真正的伺服器,內部伺服器外部不感知

   

Nginx支援以下幾種策略:

輪詢·default

weight (權重)

ip_hash (可用於解決會話保持的問題)

fair·第三方 (按後端伺服器的響應時間來分配請求,響應時間短的優先分配)

url_hash·第三方 (相同的url定位到相同的伺服器)

   

  *Nginx的優勢

1. 跨平臺,配置簡單

2. 非阻塞,高併發(官方測試可以支撐5萬併發數)

3. 事件驅動,通訊機制採用 epoll 模型,支援更大的併發連線

4. 記憶體消耗小。(3萬併發數下,10個Nginx程式只需要150M記憶體)

5. 內建的健康檢查功能。 (一臺後端伺服器當機了,不會影響前端訪問)

6. 節省頻寬。 (支援GZIP壓縮,可以新增瀏覽器快取的header)

7. 穩定性高。 (反向代理,當機的概率很小)

   

  *Nginx的缺點

1. 對後端伺服器的健康檢查,只支援通過埠檢測,不支援url檢測

2. 不支援Session的直接保持。(通過ip_hash可解決)

   

【主流實現-Haproxy】

Haproxy提供高可用性,負載均衡以及基於TCP和HTTP的代理。

特別適用於那些負載特大的Web站點,這些站點通常需要會話保持或七層處理。

   

Haproxy支援四層和七層兩種負載模式。

Haproxy有一些Nginx不具有的優點,比如支援Session的保持Cookie的引導;同時支援通過獲取指定的URL來檢測後端伺服器的狀態

   

Haproxy和LVS類似,本身就只是一款負載均衡軟體;單純從效率上來講,比Nginx有更好的負載均衡速度,在併發處理上也優於Nginx

   

Haproxy支援的負載均衡策略也比較多:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)。

   

【三種負載均衡的比較】

比較

HAProxy

Nginx

LVS

   

   

   

優點

支援session保持,Cookie引導

   

可通過url檢測後端伺服器健康狀態。

   

也可做MySQL、Email等負載均衡。

   

支援通過指定的URL對後端伺服器健康檢查。

http、https、Emai協議功能較好,處理相應請求快。

   

Web能力強,配置簡單,支援快取功能、適用動靜分離,低記憶體消耗。

   

支援WebSocket協議

   

支援強大的正則匹配規則

通過vrrp轉發(僅分發)效率高,流量通過核心處理,沒有流量產生。(理論)

   

相當穩定可靠

  

缺點

一般不做Web伺服器的Cache。

不支援session直接保持,但可通過ip_hash解決。

只能通過埠對後端伺服器健康檢查。

不支援正則,不能做動靜分離,配置略複雜,需要IP略多。

沒有後端主機健康狀態檢查。

   

支援演算法

目標uri hash(uri)

url引數 (url_params)

請求頭資訊排程(hdr(name))

cookie (rdp-cookie)

最小響應時間

自定義hash內容(hash key [consistent])

url hash

最短時間和最少連線

最短期望延遲(Shortest Expected Delay)

不排隊(Never Queue)

基於區域性性的最少連線(LBLC)

帶複製的基於區域性性最少連結(LCLBR)

官網

www.haproxy.com

nginx.org

www.linuxvirtualserver.org

  

虛擬主機

支援

支援

不支援 

適用性

四層,七層(常用)

四層,七層(常用)

四層

量級

七層重量級,四層輕量級

七層重量級,四層輕量級

四層重量級

常用熱備

Keepalived+其它

Keepalived+其它

Keepalived+其它

   

  *補充區別

HAProxy對於後端伺服器會一直做健康檢測(就算請求沒過來的時候也會做健康檢查)

後端機器故障發生在請求還沒到來的時候,haproxy會將這臺故障機切掉,但如果後端機器故障發生在請求到達期間,那麼前端訪問會有異常。

也就是說HAProxy會把請求轉到後端的這臺故障機上,並經過多次探測後才會把這臺機器切掉,並把請求發給其他正常的後端機,這勢必會造成一小段時間內前端訪問失敗

   

Nginx對於後端的伺服器不會一直做健康檢測

後端機器發生故障,在請求過來的時候,分發還是會正常進行分發,只是請求不到資料的時候,它會再轉向好的後端機器進行請求,直到請求正常為止。

也就是說Nginx請求轉到後端一臺不成功的機器的話,還會再轉向另外一臺伺服器,這對前端訪問沒有什麼影響

   

因此,如果有用HAProxy做為前端負載均衡的話 ,如果後端伺服器要維護,在高併發的情況,肯定是會影響使用者的。

但如果是Nginx做為前端負載均衡的話,只要併發撐得住,後端切掉幾臺不會影響到使用者

   

【Openstack LBaaS的現狀】

Neutron中的loadbalance服務lbaas,可以將來自公網或內部網路的訪問流量,分發到雲資源中的雲主機上,可以隨時新增或者減少後端雲主機的數量,而不影響業務。

   

lbaas在Grizzly版本整合到Neutron中。

 

現在社群最新的API版本為V2,在Kilo中釋出,包含以下概念:

 

Lbaas V1與V2的區別如下:

功能

lbaas

lbaasV2

最大連線數

Y

Y

TCP負載均衡

Y

Y

HTTP負載均衡

Y

Y

HTTPS負載均衡

Y

Y

TERMINATED_HTTPS負載均衡

X

Y

基於hostname的url轉發

X

Y

基於path的url轉發

X

Y

基於filename的url轉發

X

Y

基於header的url轉發

X

Y

基於cookie的url轉發

X

Y

一個vip支援多種協議和埠

X

Y

   

【Octavia 介紹】

Octavia當前作為lbaasV2的一個driver存在,完全相容lbaasV2的介面,最終的發展趨勢會作為一個獨立的專案代替lbaasV2。

架構圖如下:

 

網路結構如下:

 

   

【參考】

octavia相關:https://docs.openstack.org/octavia/latest/

nginx相關:nginx.org

lvs相關:https://www.jianshu.com/p/16e9c84fdb3c

相關文章