想實(shí)現(xiàn)高可用?先搞定負(fù)載均衡原理

2021-02-07    分類: 網(wǎng)站建設(shè)

在互聯(lián)網(wǎng)大行其道的今天,隨著業(yè)務(wù)的迅猛增長(zhǎng),技術(shù)上我們常常要面對(duì)高并發(fā),大流量。

接入層,代理層,應(yīng)服務(wù)器示意圖

我們知道了負(fù)載均衡分為“硬件負(fù)載均衡”和“軟件負(fù)載均衡”,那么來(lái)逐一看看他們是如何工作的吧。

硬件負(fù)載均衡

既然前面提到了負(fù)載均衡器的分類,那么我們就來(lái)聊聊他們的特點(diǎn)。硬件負(fù)載均衡技術(shù)只專注網(wǎng)絡(luò)判斷,不考慮業(yè)務(wù)系統(tǒng)與應(yīng)用使用的情況。

看上去它對(duì)處理網(wǎng)絡(luò)請(qǐng)求是非常專業(yè)的,但有趣的是,如果應(yīng)用服務(wù)出現(xiàn)了流量瓶頸,而“接入層”的硬件負(fù)載均衡沒(méi)有發(fā)現(xiàn)異常,還是讓流量繼續(xù)進(jìn)入到應(yīng)用服務(wù)器,并沒(méi)有阻止,就會(huì)造成應(yīng)用服務(wù)器流量過(guò)大。

所以,為了保證高可用,可以在“接入層”和“代理層”同時(shí)考慮限流的問(wèn)題。

作為硬件負(fù)載均衡器,常在大企業(yè)使用。下面我們以 F5 公司的“F5 BIG-IP”產(chǎn)品為藍(lán)本給大家介紹(下面簡(jiǎn)稱 F5)。

實(shí)際上它是一個(gè)集成的解決方案,對(duì)于研發(fā)的同學(xué)來(lái)說(shuō),主要理解其原理。

硬件負(fù)載均衡器三大功能

上面談到硬件負(fù)載均衡器的作用和特點(diǎn),它具備哪三大功能?實(shí)現(xiàn)原理又是怎樣的?

①多鏈路負(fù)載均衡

關(guān)鍵業(yè)務(wù)都需要安排和配置多條 ISP(網(wǎng)絡(luò)服務(wù)供應(yīng)商)接入鏈路來(lái)保證網(wǎng)絡(luò)服務(wù)的可靠性。

如果某個(gè) ISP 停止服務(wù)或者服務(wù)異常了,那么可以利用另一個(gè) ISP 替代服務(wù),提高了網(wǎng)絡(luò)的可用性。

不同的 ISP 有不同自治域,因此需要考慮兩種情況:

  • INBOUND
  • OUTBOUND

INBOUND,來(lái)自網(wǎng)絡(luò)的請(qǐng)求信息。F5 分別綁定兩個(gè) ISP 服務(wù)商的公網(wǎng)地址,解析來(lái)自兩個(gè) ISP 服務(wù)商的 DNS 解析請(qǐng)求。

F5 可以根據(jù)服務(wù)器狀況和響應(yīng)情況對(duì) DNS 進(jìn)行發(fā)送,也可以通過(guò)多條鏈路分別建立 DNS 連接。

OUTBOUND,返回給請(qǐng)求者的應(yīng)答信息。F5 可以將流量分配到不同的網(wǎng)絡(luò)接口,并做源地址的 NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換),即通過(guò) IP 地址轉(zhuǎn)換為源請(qǐng)求地址。

也可以用接口地址自動(dòng)映射,保證數(shù)據(jù)包返回時(shí)能夠被源頭正確接收。

多路負(fù)載的方式增強(qiáng)了網(wǎng)絡(luò)接入層的可靠性

②防火墻負(fù)載均衡

針對(duì)大量網(wǎng)絡(luò)請(qǐng)求的情況,單一防火墻的能力就有限了,而且防火墻本身要求數(shù)據(jù)同進(jìn)同出,為了解決多防火墻負(fù)載均衡的問(wèn)題,F(xiàn)5 提出了防火墻負(fù)載均衡的“防火墻三明治"方案。

防火墻會(huì)對(duì)用戶會(huì)話的雙向數(shù)據(jù)流進(jìn)行監(jiān)控,從而確定數(shù)據(jù)的合法性。如果采取多臺(tái)防火墻進(jìn)行負(fù)載均衡,有可能會(huì)造成同一個(gè)用戶會(huì)話的雙向數(shù)據(jù)在多臺(tái)防火墻上都進(jìn)行處理。

而單個(gè)防火墻上看不到完成用戶會(huì)話的信息,就會(huì)認(rèn)為數(shù)據(jù)非法因此拋棄數(shù)據(jù)。

所以在每個(gè)防火墻的兩端要架設(shè)四層交換機(jī),可以在作流量分發(fā)的同時(shí),維持用戶會(huì)話的完整性,使同一用戶的會(huì)話由一個(gè)防火墻來(lái)處理。而這種場(chǎng)景就需要 F5 負(fù)載均衡器協(xié)助才能完成轉(zhuǎn)發(fā)。

有趣的是,F(xiàn)5 協(xié)調(diào)上述方案的配置和實(shí)現(xiàn)后,會(huì)把“交換機(jī)”,“防火墻”,“交換機(jī)”夾在了一起好像三明治一樣。

防火墻“三明治”

③服務(wù)器負(fù)載均衡

在硬件負(fù)載均衡器掛接多個(gè)應(yīng)用服務(wù)器時(shí),需要為這些服務(wù)做負(fù)載均衡,根據(jù)規(guī)則,讓請(qǐng)求發(fā)送到服務(wù)器上去:

  • 對(duì)于服務(wù)器的負(fù)載均衡的前提是,服務(wù)器都提供同樣的服務(wù),也就是同樣的業(yè)務(wù)同時(shí)部署在多個(gè)服務(wù)器上。
  • 對(duì)于應(yīng)用服務(wù)器可以在 F5 上配置并且實(shí)現(xiàn)負(fù)載均衡,F(xiàn)5 可以檢查服務(wù)器的健康狀態(tài),如果發(fā)現(xiàn)故障,將其從負(fù)載均衡組中移除。
  • F5 對(duì)于外網(wǎng)而言有一個(gè)真實(shí)的 IP,對(duì)于內(nèi)網(wǎng)的每個(gè)服務(wù)器都生成一個(gè)虛擬 IP,進(jìn)行負(fù)載均衡和管理工作。因此,它能夠?yàn)榇罅康幕?TCP/IP 的網(wǎng)絡(luò)應(yīng)用提供服務(wù)器負(fù)載均衡服務(wù)。
  • 根據(jù)服務(wù)類型不同定義不同的服務(wù)器群組。
  • 根據(jù)不同服務(wù)端口將流量導(dǎo)向?qū)?yīng)的服務(wù)器。甚至可以對(duì) VIP 用戶的請(qǐng)求進(jìn)行特殊的處理,把這類請(qǐng)求導(dǎo)入到高性能的服務(wù)器使 VIP 客戶得到最好的服務(wù)響應(yīng)。
  • 根據(jù)用戶訪問(wèn)內(nèi)容的不同將流量導(dǎo)向指定服務(wù)器。

優(yōu)缺點(diǎn)總結(jié)

聊完了硬件負(fù)載均衡器的特點(diǎn)和功能以后,讓我們來(lái)總結(jié)一下它的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):直接連接交換機(jī),處理網(wǎng)絡(luò)請(qǐng)求能力強(qiáng),與系統(tǒng)無(wú)關(guān),負(fù)載性能強(qiáng)??梢詰?yīng)用于大量設(shè)施,適應(yīng)大訪問(wèn)量、使用簡(jiǎn)單。
  • 缺點(diǎn):成本高,配置冗余。即使網(wǎng)絡(luò)請(qǐng)求分發(fā)到服務(wù)器集群,負(fù)載均衡設(shè)施卻是單點(diǎn)配置;無(wú)法有效掌握服務(wù)器及應(yīng)使用狀態(tài)。

軟件負(fù)載均衡

說(shuō)完硬件負(fù)載均衡,再來(lái)談?wù)勡浖?fù)載均衡。軟件負(fù)載均衡是指在一臺(tái)或多臺(tái)服務(wù)器的操作系統(tǒng)上安裝一個(gè)或多個(gè)軟件來(lái)實(shí)現(xiàn)負(fù)載均衡。

它的優(yōu)點(diǎn)是基于特定環(huán)境,配置簡(jiǎn)單,使用靈活,成本低廉,可以滿足一般的負(fù)載均衡需求。

代理層通常起到承上啟下的作用,上連“接入層”,下接應(yīng)用服務(wù)器(上游服務(wù)器),可以做反向代理,緩存,數(shù)據(jù)驗(yàn)證,限流。本文會(huì)一一為各位介紹。

目前市面上比較流行的軟件負(fù)載均衡有 LVS,HAProxy,Ngnix。由于篇幅有限我們通過(guò)應(yīng)用廣泛的 Nginx 為切入點(diǎn),給大家講解,之后會(huì)把上面三類軟件進(jìn)行一個(gè)對(duì)比。

功能描述和原理分析

對(duì)于程序員來(lái)說(shuō),接觸最多的就是軟件負(fù)載均衡。不僅要知道如何使用,同時(shí)也要了解背后的原理,下面列舉了其最常用到的 4 大功能。

①反向代理與負(fù)載均衡

第一個(gè)功能是反向代理與負(fù)載均衡,如下圖:

客戶端是如何把請(qǐng)求發(fā)送到應(yīng)用服務(wù)器的

客戶端把請(qǐng)求發(fā)送到應(yīng)用服務(wù)器有如下幾個(gè)步驟:

  • 客戶端請(qǐng)求 URL 給 DNS。
  • DNS 將 URL 轉(zhuǎn)化成對(duì)應(yīng)的 IP。
  • 通過(guò) IP 找到服務(wù)器。
  • 服務(wù)器接受到請(qǐng)求的報(bào)文,轉(zhuǎn)交給接入層處理,接入層由于采用了硬件負(fù)載均衡器,所以能夠扛住大數(shù)據(jù)量。
  • 接入層把報(bào)文再次轉(zhuǎn)交給代理層(并發(fā) 5W),代理層的 Nginx 收到報(bào)文再根據(jù)反向代理的策略發(fā)送給上游服務(wù)器(應(yīng)用服務(wù)器)。

負(fù)載均衡的算法/策略

實(shí)際上負(fù)載均衡的算法是很多的,這里以 Nginx 為例,介紹五種算法:

  • Round-Robin:輪詢算法,默認(rèn)算法。對(duì)上游的服務(wù)器進(jìn)行挨個(gè)輪詢,這個(gè)算法是可以配合 Weight(權(quán)重)來(lái)實(shí)現(xiàn)的。
  • Weight:權(quán)重算法,給應(yīng)用服務(wù)器設(shè)置 Weight 的值。Weight 默認(rèn)值為 1,Weight 參數(shù)越大被訪問(wèn)的幾率越大??梢愿鶕?jù)服務(wù)器的配置和資源情況配置 Weight 值,讓資源情況樂(lè)觀的服務(wù)器承擔(dān)更多的訪問(wèn)量。
  • IP-Hash:這個(gè)算法可以根據(jù)用戶 IP 進(jìn)行負(fù)載均衡,同一 IP 的用戶端請(qǐng)求報(bào)文是會(huì)被同一臺(tái)上游服務(wù)器響應(yīng)的。也就是讓同一客戶端的回話(Session)保持一致。
  • Least_conn:把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。輪詢算法是把請(qǐng)求平均的轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同;但是,有些請(qǐng)求占用的時(shí)間很長(zhǎng),會(huì)導(dǎo)致其所在的后端負(fù)載較高。這種情況下,Least_conn 這種方式就可以達(dá)到更好的負(fù)載均衡效果。
  • Hash Key:這個(gè)算法是對(duì) Hash 算法的補(bǔ)充,主要是考慮當(dāng)出現(xiàn)上游服務(wù)器增加/刪除的情況,請(qǐng)求無(wú)法正確的被同一服務(wù)器處理。

所以對(duì)每個(gè)請(qǐng)求都設(shè)置 Hash Key,這樣就算服務(wù)器發(fā)生了變化,Key 的值沒(méi)有變,也可以找到對(duì)應(yīng)的服務(wù)器。

②動(dòng)態(tài)負(fù)載均衡

一般上游服務(wù)器都采用微服務(wù)的架構(gòu),那么負(fù)載均衡會(huì)把數(shù)據(jù)報(bào)發(fā)給哪個(gè)服務(wù)呢?如果服務(wù)出現(xiàn)了問(wèn)題如何通知負(fù)載均衡器呢?有新的服務(wù)注冊(cè)怎么辦呢?

動(dòng)態(tài)負(fù)載均衡流程

微服務(wù)首先會(huì)注冊(cè)到“服務(wù)注冊(cè)發(fā)現(xiàn)”中心(Consul,Eureka)。注冊(cè)中心包含微服務(wù)的信息,Nginx 會(huì)定期從這里拉取服務(wù)信息(Lua)。

獲取微服務(wù)信息以后,Nginx 收到數(shù)據(jù)報(bào)的時(shí)候,就可以從注冊(cè)中心獲取的服務(wù)地址,把信息傳遞給服務(wù)了。

③限流

限流的工作可以在接入層用硬件負(fù)載均衡器來(lái)完成,也可以在代理層來(lái)完成。

限流實(shí)際上就是限制流入請(qǐng)求的數(shù)量,其算法不少,有令牌桶算法,漏桶算法,連接數(shù)限制等等。這里我們就介紹三個(gè)常用的。一般通過(guò) Nignx+Lua 來(lái)實(shí)現(xiàn)。

連接數(shù)限流:通過(guò) ngx_http_limit_conn_module 模塊實(shí)現(xiàn)。設(shè)置大的連接數(shù)以及共享內(nèi)存的區(qū)域大小,請(qǐng)求的時(shí)候判斷是否超過(guò)了大連接數(shù)。

如果超過(guò)大連接數(shù)就被限流,否則針對(duì)連接數(shù)就 +1,請(qǐng)求結(jié)束以后會(huì)將連接數(shù) -1。

漏桶算法:通過(guò) ngx_http_limit_req_module 模塊實(shí)現(xiàn)。一個(gè)固定容量的桶,數(shù)據(jù)報(bào)按照固定的速度流出。

數(shù)據(jù)報(bào)可以按照任意的速度流入桶中,如果數(shù)據(jù)報(bào)的容量超過(guò)了桶的容量,再流入的數(shù)據(jù)報(bào)將會(huì)被丟棄。

按照這個(gè)規(guī)則,需要設(shè)置限流的區(qū)域以及桶的容量,以及是否延遲。

漏桶策略

令牌桶算法,桶的大小是固定的,以固定的速度往桶里丟令牌。桶滿了后,后面添加的令牌無(wú)法添加。

數(shù)據(jù)報(bào)到來(lái)時(shí)從桶中取令牌,如果桶中有令牌,憑借令牌處理請(qǐng)求,處理完畢令牌銷毀;數(shù)據(jù)報(bào)到來(lái)時(shí)發(fā)現(xiàn)桶中沒(méi)令牌,該請(qǐng)求將被拒絕。

請(qǐng)求在發(fā)往令牌桶之前需要經(jīng)過(guò)過(guò)濾/分類器,可以對(duì)報(bào)文進(jìn)行分類,例如:某類報(bào)文可以直接發(fā)往應(yīng)用服務(wù)器,某類報(bào)文需要經(jīng)過(guò)令牌桶獲取令牌以后才能發(fā)。

又例如:VIP 就可以直接把請(qǐng)求發(fā)往服務(wù)器,用不著經(jīng)過(guò)令牌桶。

令牌桶示意圖

④緩存

Nginx 本地緩存機(jī)制

接入層發(fā)送請(qǐng)求,如果能夠在 Nginx 本地緩存命中,直接返回緩存數(shù)據(jù),如果沒(méi)有命中回源到應(yīng)用服務(wù)器。

緩存更新服務(wù)器定時(shí)更新 Nginx 本地緩存信息。這些需要考慮數(shù)據(jù)的一致性,何時(shí)更新以及何時(shí)失效等情況。

Nginx 緩存可以大大提高請(qǐng)求響應(yīng)時(shí)間,可以把不經(jīng)常更改的信息,例如:用戶信息,提前放入緩存中,每次請(qǐng)求就不用再去請(qǐng)求應(yīng)用服務(wù)器了。一旦用戶信息更新,可以按照一定時(shí)鐘頻率寫(xiě)入緩存中。

另外,一般 HTTPHEAD 中都帶有一些信息更新的信息。Nginx 也可以通過(guò) expires,etag,if-modified-since 來(lái)實(shí)現(xiàn)瀏覽器緩存的控制。

其他的幾個(gè)功能如下:

  • 客戶端超時(shí)重試
  • DNS 超時(shí)重試
  • 代理超時(shí)重試
  • 失敗重試
  • 心跳檢測(cè)
  • 配置上有服務(wù)器

流行的軟件負(fù)載均衡器

目前比較流行的有 LVS,Nginx 和 HAProxy,逐個(gè)看看他們的特點(diǎn)。

LVS

LVS(Linux Virtual Server) 是使用 Linux 內(nèi)核集群實(shí)現(xiàn)的一個(gè)高性能、高可用的負(fù)載均衡服務(wù)器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS 特點(diǎn)是:

  • 僅作分發(fā)之用,即把請(qǐng)求直接分發(fā)給應(yīng)用服務(wù)器,因此沒(méi)有流量的產(chǎn)生,對(duì)資源的消耗低。
  • 配置簡(jiǎn)單,能夠配置的項(xiàng)目少。
  • 工作在第四層(傳輸層),支持 TCP/UDP,對(duì)應(yīng)用的支持廣泛。

HAProxy

HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動(dòng),單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。

多進(jìn)程或多線程模型受內(nèi)存限制 、系統(tǒng)調(diào)度器限制以及無(wú)處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。

HAProxy 特點(diǎn)是:

  • 支持虛擬主機(jī)。
  • 支持 Session 保持,Cookie 引導(dǎo)。
  • 通過(guò)指定的 URL 來(lái)檢測(cè)應(yīng)用服務(wù)器的狀態(tài)。
  • 支持 TCP/HTTP 協(xié)議轉(zhuǎn)發(fā)。

Nginx

Nginx 是一款輕量級(jí)的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè) BSD-like 協(xié)議下發(fā)行。

Nginx 特點(diǎn)是:

  • 工作在網(wǎng)絡(luò)的 4/7 層,對(duì) HTTP 應(yīng)用做負(fù)載均衡策略,如:域名、目錄結(jié)構(gòu)。
  • 對(duì)網(wǎng)絡(luò)的穩(wěn)定性依賴小,可以區(qū)分內(nèi)網(wǎng)和外網(wǎng)的訪問(wèn)。
  • 安裝和配置相對(duì)簡(jiǎn)單。
  • 能承受很高負(fù)載且穩(wěn)定,處理的流量依賴于按照 Nginx 服務(wù)器的配置。
  • 可以檢測(cè)服務(wù)器的問(wèn)題,可以對(duì)服務(wù)器返回的信息進(jìn)行處理和過(guò)濾,避免讓無(wú)法工作的服務(wù)器響應(yīng)請(qǐng)求。
  • 對(duì)請(qǐng)求可以進(jìn)行異步處理。
  • 支持 HTTP、HTTPS 和 EMAIL。

網(wǎng)絡(luò)負(fù)載均衡的技術(shù)選型

既然上面對(duì)軟/硬件負(fù)載均衡有了總體的了解,那么按照“技術(shù)服務(wù)業(yè)務(wù)”的原則,在業(yè)務(wù)發(fā)展的不同階段,如何使用這兩類負(fù)載均衡技術(shù)呢?

發(fā)展階段

企業(yè)業(yè)務(wù)從 0 到 1,從無(wú)到有,數(shù)據(jù)量和訪問(wèn)量都不大。Nginx 或 HAProxy 進(jìn)行單點(diǎn)的負(fù)載均衡就已經(jīng)足夠了。

這階段剛剛采用多臺(tái)應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù),需要一定的負(fù)載均衡做支撐。由于業(yè)務(wù)量不大,所以沒(méi)有專業(yè)的維護(hù)團(tuán)隊(duì)來(lái)維護(hù),也沒(méi)有大規(guī)模的網(wǎng)站部署的需求。

因此 Nginx 或 HAproxy 是第一選擇,因?yàn)槠渖鲜挚欤?配置容易,在七層之上利用 HTTP 協(xié)議就能滿足要求了。

擴(kuò)張階段

隨著業(yè)務(wù)量增大,用戶訪問(wèn)和交易量也在逐步增加,這時(shí)單點(diǎn)的 Nginx 或 HAProxy 已經(jīng)無(wú)法滿足之前的需求了。

使用 LVS 或者硬件負(fù)載均衡(F5/Array)就是架構(gòu)師需要考慮的問(wèn)題了,Nginx 此時(shí)就作為 LVS 或者硬件負(fù)載均衡(F5/Array)的節(jié)點(diǎn)來(lái)處理。

軟件負(fù)載均衡+硬件負(fù)載均衡的架構(gòu)配置在這個(gè)階段就需要考慮了,也是對(duì)架構(gòu)設(shè)計(jì)者的挑戰(zhàn)。

成熟階段

隨著公司業(yè)務(wù)擴(kuò)張到達(dá)頂峰,之前的網(wǎng)絡(luò)服務(wù)已經(jīng)升級(jí)成主流服務(wù)產(chǎn)品,需要考慮在開(kāi)源產(chǎn)品上進(jìn)行業(yè)務(wù)定制,所以開(kāi)源的 LVS,已經(jīng)成為選。其在深度定制之后依舊會(huì)和硬件負(fù)載均衡器配合完成業(yè)務(wù)服務(wù)。

總結(jié)

今天內(nèi)容比較多,總結(jié)下來(lái),三句話:

  • 硬件和軟件負(fù)載均衡,分別工作在“接入層”和“代理層”。
  • 一個(gè)專注于網(wǎng)絡(luò),負(fù)責(zé)多鏈路,防火墻以及服務(wù)器的負(fù)載均衡,例如:F5 BIG-IP。
  • 另一個(gè)偏向于業(yè)務(wù),主要功能是反向代理,動(dòng)態(tài)代理,緩存,限流,例如:LVS,Nginx,HAProxy。

網(wǎng)站題目:想實(shí)現(xiàn)高可用?先搞定負(fù)載均衡原理
URL標(biāo)題:http://www.bm7419.com/news20/99570.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站排名搜索引擎優(yōu)化、商城網(wǎng)站、用戶體驗(yàn)定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)