作者:vivo互聯(lián)網(wǎng)團(tuán)隊(duì)-Zhang Peng一、負(fù)載均衡簡介
1.1. 大型網(wǎng)站面臨的挑戰(zhàn)
大型網(wǎng)站都要面對龐大的用戶量,高并發(fā),海量數(shù)據(jù)等挑戰(zhàn)。為了提升系統(tǒng)整體的性能,可以采用垂直擴(kuò)展和水平擴(kuò)展兩種方式。
垂直擴(kuò)展:在網(wǎng)站發(fā)展早期,可以從單機(jī)的角度通過增加硬件處理能力,比如 CPU 處理能力,內(nèi)存容量,磁盤等方面,實(shí)現(xiàn)服務(wù)器處理能力的提升。但是,單機(jī)是有性能瓶頸的,一旦觸及瓶頸,再想提升,付出的成本和代價會極高。這顯然不能滿足大型分布式系統(tǒng)(網(wǎng)站)所有應(yīng)對的大流量,高并發(fā),海量數(shù)據(jù)等挑戰(zhàn)。
水平擴(kuò)展:通過集群來分擔(dān)大型網(wǎng)站的流量。集群中的應(yīng)用服務(wù)器(節(jié)點(diǎn))通常被設(shè)計(jì)成無狀態(tài),用戶可以請求任何一個節(jié)點(diǎn),這些節(jié)點(diǎn)共同分擔(dān)訪問壓力。水平擴(kuò)展有兩個要點(diǎn):
- 應(yīng)用集群:將同一應(yīng)用部署到多臺機(jī)器上,組成處理集群,接收負(fù)載均衡設(shè)備分發(fā)的請求,進(jìn)行處理,并返回相應(yīng)數(shù)據(jù)。
- 負(fù)載均衡:將用戶訪問請求,通過某種算法,分發(fā)到集群中的節(jié)點(diǎn)。
負(fù)載均衡(Load Balance,簡稱 LB)是高并發(fā)、高可用系統(tǒng)必不可少的關(guān)鍵組件,目標(biāo)是 盡力將網(wǎng)絡(luò)流量平均分發(fā)到多個服務(wù)器上,以提高系統(tǒng)整體的響應(yīng)速度和可用性。
負(fù)載均衡的主要作用如下:
高并發(fā):負(fù)載均衡通過算法調(diào)整負(fù)載,盡力均勻的分配應(yīng)用集群中各節(jié)點(diǎn)的工作量,以此提高應(yīng)用集群的并發(fā)處理能力(吞吐量)。二、負(fù)載均衡的分類
伸縮性:添加或減少服務(wù)器數(shù)量,然后由負(fù)載均衡進(jìn)行分發(fā)控制。這使得應(yīng)用集群具備伸縮性。
高可用:負(fù)載均衡器可以監(jiān)控候選服務(wù)器,當(dāng)服務(wù)器不可用時,自動跳過,將請求分發(fā)給可用的服務(wù)器。這使得應(yīng)用集群具備高可用的特性。
安全防護(hù):有些負(fù)載均衡軟件或硬件提供了安全性功能,如:黑白名單處理、防火墻,防 DDos 攻擊等。
支持負(fù)載均衡的技術(shù)很多,我們可以通過不同維度去進(jìn)行分類。
2.1 載體維度分類
從支持負(fù)載均衡的載體來看,可以將負(fù)載均衡分為兩類:硬件負(fù)載均衡、軟件負(fù)載均衡
2.1.1硬件負(fù)載均衡
硬件負(fù)載均衡,一般是在定制處理器上運(yùn)行的獨(dú)立負(fù)載均衡服務(wù)器,價格昂貴,土豪專屬。硬件負(fù)載均衡的主流產(chǎn)品有:F5 和 A10。
硬件負(fù)載均衡的 優(yōu)點(diǎn):
- 功能強(qiáng)大:支持全局負(fù)載均衡并提供較全面的、復(fù)雜的負(fù)載均衡算法。
- 性能強(qiáng)悍:硬件負(fù)載均衡由于是在專用處理器上運(yùn)行,因此吞吐量大,可支持單機(jī)百萬以上的并發(fā)。
- 安全性高:往往具備防火墻,防 DDos 攻擊等安全功能。
硬件負(fù)載均衡的 缺點(diǎn):
- 成本昂貴:購買和維護(hù)硬件負(fù)載均衡的成本都很高。
- 擴(kuò)展性差:當(dāng)訪問量突增時,超過限度不能動態(tài)擴(kuò)容。
軟件負(fù)載均衡,應(yīng)用最廣泛,無論大公司還是小公司都會使用。軟件負(fù)載均衡從軟件層面實(shí)現(xiàn)負(fù)載均衡,一般可以在任何標(biāo)準(zhǔn)物理設(shè)備上運(yùn)行。
軟件負(fù)載均衡的 主流產(chǎn)品 有:Nginx、HAProxy、LVS。
- LVS 可以作為四層負(fù)載均衡器。其負(fù)載均衡的性能要優(yōu)于 Nginx。
- HAProxy 可以作為 HTTP 和 TCP 負(fù)載均衡器。
- Nginx、HAProxy 可以作為四層或七層負(fù)載均衡器。
- 擴(kuò)展性好:適應(yīng)動態(tài)變化,可以通過添加軟件負(fù)載均衡實(shí)例,動態(tài)擴(kuò)展到超出初始容量的能力。
- 成本低廉:軟件負(fù)載均衡可以在任何標(biāo)準(zhǔn)物理設(shè)備上運(yùn)行,降低了購買和運(yùn)維的成本。
- 性能略差:相比于硬件負(fù)載均衡,軟件負(fù)載均衡的性能要略低一些。
軟件負(fù)載均衡從通信層面來看,又可以分為四層和七層負(fù)載均衡。
1) 七層負(fù)載均衡:就是可以根據(jù)訪問用戶的 HTTP 請求頭、URL 信息將請求轉(zhuǎn)發(fā)到特定的主機(jī)。
- DNS 重定向
- HTTP 重定向
- 反向代理
- 修改 IP 地址
- 修改 MAC 地址
DNS 負(fù)載均衡一般用于互聯(lián)網(wǎng)公司,復(fù)雜的業(yè)務(wù)系統(tǒng)不適合使用。大型網(wǎng)站一般使用 DNS 負(fù)載均衡作為 第一級負(fù)載均衡手段,然后在內(nèi)部使用其它方式做第二級負(fù)載均衡。DNS 負(fù)載均衡屬于七層負(fù)載均衡。
DNS 即 域名解析服務(wù),是 OSI 第七層網(wǎng)絡(luò)協(xié)議。DNS 被設(shè)計(jì)為一個樹形結(jié)構(gòu)的分布式應(yīng)用,自上而下依次為:根域名服務(wù)器,一級域名服務(wù)器,二級域名服務(wù)器,... ,本地域名服務(wù)器。顯然,如果所有數(shù)據(jù)都存儲在根域名服務(wù)器,那么 DNS 查詢的負(fù)載和開銷會非常龐大。
因此,DNS 查詢相對于 DNS 層級結(jié)構(gòu),是一個逆向的遞歸流程,DNS 客戶端依次請求本地 DNS 服務(wù)器,上一級 DNS 服務(wù)器,上上一級 DNS 服務(wù)器,... ,根 DNS 服務(wù)器(又叫權(quán)威 DNS 服務(wù)器),一旦命中,立即返回。為了減少查詢次數(shù),每一級 DNS 服務(wù)器都會設(shè)置 DNS 查詢緩存。
DNS 負(fù)載均衡的工作原理就是:基于 DNS 查詢緩存,按照負(fù)載情況返回不同服務(wù)器的 IP 地址。
DNS 重定向的 優(yōu)點(diǎn):
使用簡單:負(fù)載均衡工作,交給 DNS 服務(wù)器處理,省掉了負(fù)載均衡服務(wù)器維護(hù)的麻煩DNS 重定向的 缺點(diǎn):
提高性能:可以支持基于地址的域名解析,解析成距離用戶最近的服務(wù)器地址(類似 CDN 的原理),可以加快訪問速度,改善性能;
可用性差:DNS 解析是多級解析,新增/修改 DNS 后,解析時間較長;解析過程中,用戶訪問網(wǎng)站將失?。?/span>2.2.2 HTTP 負(fù)載均衡
擴(kuò)展性低:DNS 負(fù)載均衡的控制權(quán)在域名商那里,無法對其做更多的改善和擴(kuò)展;
維護(hù)性差:也不能反映服務(wù)器的當(dāng)前運(yùn)行狀態(tài);支持的算法少;不能區(qū)分服務(wù)器的差異(不能根據(jù)系統(tǒng)與服務(wù)的狀態(tài)來判斷負(fù)載)。
HTTP 負(fù)載均衡是基于 HTTP 重定向?qū)崿F(xiàn)的。HTTP 負(fù)載均衡屬于七層負(fù)載均衡。
HTTP 重定向原理是:根據(jù)用戶的 HTTP 請求計(jì)算出一個真實(shí)的服務(wù)器地址,將該服務(wù)器地址寫入 HTTP 重定向響應(yīng)中,返回給瀏覽器,由瀏覽器重新進(jìn)行訪問。
HTTP 重定向的優(yōu)點(diǎn):方案簡單。
HTTP 重定向的 缺點(diǎn):
性能較差:每次訪問需要兩次請求服務(wù)器,增加了訪問的延遲。由于其缺點(diǎn)比較明顯,所以這種負(fù)載均衡策略實(shí)際應(yīng)用較少。
降低搜索排名:使用重定向后,搜索引擎會視為 SEO 作弊。
如果負(fù)載均衡器宕機(jī),就無法訪問該站點(diǎn)。
2.2.3 反向代理負(fù)載均衡
反向代理(Reverse Proxy)方式是指以 代理服務(wù)器 來接受網(wǎng)絡(luò)請求,然后 將請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的服務(wù)器,并將從內(nèi)網(wǎng)中的服務(wù)器上得到的結(jié)果返回給網(wǎng)絡(luò)請求的客戶端。反向代理負(fù)載均衡屬于七層負(fù)載均衡。
反向代理服務(wù)的主流產(chǎn)品:Nginx、Apache。
正向代理與反向代理有什么區(qū)別?
正向代理:發(fā)生在 客戶端,是由用戶主動發(fā)起的。翻墻軟件就是典型的正向代理,客戶端通過主動訪問代理服務(wù)器,讓代理服務(wù)器獲得需要的外網(wǎng)數(shù)據(jù),然后轉(zhuǎn)發(fā)回客戶端。
反向代理:發(fā)生在 服務(wù)端,用戶不知道代理的存在。
反向代理是如何實(shí)現(xiàn)負(fù)載均衡的呢?以 Nginx 為例,如下所示:
首先,在代理服務(wù)器上設(shè)定好負(fù)載均衡規(guī)則。然后,當(dāng)收到客戶端請求,反向代理服務(wù)器攔截指定的域名或 IP 請求,根據(jù)負(fù)載均衡算法,將請求分發(fā)到候選服務(wù)器上。其次,如果某臺候選服務(wù)器宕機(jī),反向代理服務(wù)器會有容錯處理,比如分發(fā)請求失敗 3 次以上,將請求分發(fā)到其他候選服務(wù)器上。
反向代理的 優(yōu)點(diǎn):
1) 多種負(fù)載均衡算法:支持多種負(fù)載均衡算法,以應(yīng)對不同的場景需求。反向代理的 缺點(diǎn):
2) 可以監(jiān)控服務(wù)器:基于 HTTP 協(xié)議,可以監(jiān)控轉(zhuǎn)發(fā)服務(wù)器的狀態(tài),如:系統(tǒng)負(fù)載、響應(yīng)時間、是否可用、連接數(shù)、流量等,從而根據(jù)這些數(shù)據(jù)調(diào)整負(fù)載均衡的策略。
1) 額外的轉(zhuǎn)發(fā)開銷:反向代理的轉(zhuǎn)發(fā)操作本身是有性能開銷的,可能會包括創(chuàng)建連接,等待連接響應(yīng),分析響應(yīng)結(jié)果等操作。
2) 增加系統(tǒng)復(fù)雜度:反向代理常用于做分布式應(yīng)用的水平擴(kuò)展,但反向代理服務(wù)存在以下問題,為了解決以下問題會給系統(tǒng)整體增加額外的復(fù)雜度和運(yùn)維成本:
-
反向代理服務(wù)如果自身宕機(jī),就無法訪問站點(diǎn),所以需要有 高可用 方案,常見的方案有:主備模式(一主一備)、雙主模式(互為主備)。
- 反向代理服務(wù)自身也存在性能瓶頸,隨著需要轉(zhuǎn)發(fā)的請求量不斷攀升,需要有 可擴(kuò)展 方案。
IP 負(fù)載均衡是在網(wǎng)絡(luò)層通過修改請求目的地址進(jìn)行負(fù)載均衡。
如上圖所示,IP 均衡處理流程大致為:
客戶端請求 192.168.137.10,由負(fù)載均衡服務(wù)器接收到報(bào)文。IP 負(fù)載均衡在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā),較反向代理負(fù)載均衡有更好的從處理性能。但是,由于所有請求響應(yīng)都要經(jīng)過負(fù)載均衡服務(wù)器,集群的吞吐量受制于負(fù)載均衡服務(wù)器的帶寬。
負(fù)載均衡服務(wù)器根據(jù)算法選出一個服務(wù)節(jié)點(diǎn) 192.168.0.1,然后將報(bào)文請求地址改為該節(jié)點(diǎn)的 IP。
真實(shí)服務(wù)節(jié)點(diǎn)收到請求報(bào)文,處理后,返回響應(yīng)數(shù)據(jù)到負(fù)載均衡服務(wù)器。
負(fù)載均衡服務(wù)器將響應(yīng)數(shù)據(jù)的源地址改負(fù)載均衡服務(wù)器地址,返回給客戶端。
2.2.5 數(shù)據(jù)鏈路層負(fù)載均衡
數(shù)據(jù)鏈路層負(fù)載均衡是指在通信協(xié)議的數(shù)據(jù)鏈路層修改 mac 地址進(jìn)行負(fù)載均衡。
在 Linux 平臺上最好的鏈路層負(fù)載均衡開源產(chǎn)品是 LVS (Linux Virtual Server)。LVS 是基于 Linux 內(nèi)核中 netfilter 框架實(shí)現(xiàn)的負(fù)載均衡系統(tǒng)。netfilter 是內(nèi)核態(tài)的 Linux 防火墻機(jī)制,可以在數(shù)據(jù)包流經(jīng)過程中,根據(jù)規(guī)則設(shè)置若干個關(guān)卡(hook 函數(shù))來執(zhí)行相關(guān)的操作。
LVS 的工作流程大致如下:
當(dāng)用戶訪問 www.sina.com.cn 時,用戶數(shù)據(jù)通過層層網(wǎng)絡(luò),最后通過交換機(jī)進(jìn)入 LVS 服務(wù)器網(wǎng)卡,并進(jìn)入內(nèi)核網(wǎng)絡(luò)層。
進(jìn)入 PREROUTING 后經(jīng)過路由查找,確定訪問的目的 VIP 是本機(jī) IP 地址,所以數(shù)據(jù)包進(jìn)入到 INPUT 鏈上
IPVS 是工作在 INPUT 鏈上,會根據(jù)訪問的 vip port 判斷請求是否 IPVS 服務(wù),如果是則調(diào)用注冊的 IPVS HOOK 函數(shù),進(jìn)行 IPVS 相關(guān)主流程,強(qiáng)行修改數(shù)據(jù)包的相關(guān)數(shù)據(jù),并將數(shù)據(jù)包發(fā)往 POSTROUTING 鏈上。
POSTROUTING 上收到數(shù)據(jù)包后,根據(jù)目標(biāo) IP 地址(后端服務(wù)器),通過路由選路,將數(shù)據(jù)包最終發(fā)往后端的服務(wù)器上。開源 LVS 版本有 3 種工作模式,每種模式工作原理截然不同,說各種模式都有自己的優(yōu)缺點(diǎn),分別適合不同的應(yīng)用場景,不過最終本質(zhì)的功能都是能實(shí)現(xiàn)均衡的流量調(diào)度和良好的擴(kuò)展性。主要包括三種模式:DR 模式、NAT 模式、Tunnel 模式。
三、負(fù)載均衡算法
負(fù)載均衡器的實(shí)現(xiàn)可以分為兩個部分:
根據(jù)負(fù)載均衡算法在候選服務(wù)器列表選出一個服務(wù)器;負(fù)載均衡算法是負(fù)載均衡服務(wù)核心中的核心。負(fù)載均衡產(chǎn)品多種多樣,但是各種負(fù)載均衡算法原理是共性的。負(fù)載均衡算法有很多種,分別適用于不同的應(yīng)用場景,本文僅介紹最為常見的負(fù)載均衡算法的特性及原理:輪詢、隨機(jī)、最小活躍數(shù)、源地址哈希、一致性哈希。
將請求數(shù)據(jù)發(fā)送到該服務(wù)器上。