作者:vivo互聯(lián)網(wǎng)團隊-Zhang Peng一、負載均衡簡介
1.1. 大型網(wǎng)站面臨的挑戰(zhàn)
大型網(wǎng)站都要面對龐大的用戶量,高并發(fā),海量數(shù)據(jù)等挑戰(zhàn)。為了提升系統(tǒng)整體的性能,可以采用垂直擴展和水平擴展兩種方式。
垂直擴展:在網(wǎng)站發(fā)展早期,可以從單機的角度通過增加硬件處理能力,比如 CPU 處理能力,內(nèi)存容量,磁盤等方面,實現(xiàn)服務器處理能力的提升。但是,單機是有性能瓶頸的,一旦觸及瓶頸,再想提升,付出的成本和代價會極高。這顯然不能滿足大型分布式系統(tǒng)(網(wǎng)站)所有應對的大流量,高并發(fā),海量數(shù)據(jù)等挑戰(zhàn)。
水平擴展:通過集群來分擔大型網(wǎng)站的流量。集群中的應用服務器(節(jié)點)通常被設計成無狀態(tài),用戶可以請求任何一個節(jié)點,這些節(jié)點共同分擔訪問壓力。水平擴展有兩個要點:
- 應用集群:將同一應用部署到多臺機器上,組成處理集群,接收負載均衡設備分發(fā)的請求,進行處理,并返回相應數(shù)據(jù)。
- 負載均衡:將用戶訪問請求,通過某種算法,分發(fā)到集群中的節(jié)點。
負載均衡(Load Balance,簡稱 LB)是高并發(fā)、高可用系統(tǒng)必不可少的關(guān)鍵組件,目標是 盡力將網(wǎng)絡流量平均分發(fā)到多個服務器上,以提高系統(tǒng)整體的響應速度和可用性。
負載均衡的主要作用如下:
高并發(fā):負載均衡通過算法調(diào)整負載,盡力均勻的分配應用集群中各節(jié)點的工作量,以此提高應用集群的并發(fā)處理能力(吞吐量)。二、負載均衡的分類
伸縮性:添加或減少服務器數(shù)量,然后由負載均衡進行分發(fā)控制。這使得應用集群具備伸縮性。
高可用:負載均衡器可以監(jiān)控候選服務器,當服務器不可用時,自動跳過,將請求分發(fā)給可用的服務器。這使得應用集群具備高可用的特性。
安全防護:有些負載均衡軟件或硬件提供了安全性功能,如:黑白名單處理、防火墻,防 DDos 攻擊等。
支持負載均衡的技術(shù)很多,我們可以通過不同維度去進行分類。
2.1 載體維度分類
從支持負載均衡的載體來看,可以將負載均衡分為兩類:硬件負載均衡、軟件負載均衡
2.1.1硬件負載均衡
硬件負載均衡,一般是在定制處理器上運行的獨立負載均衡服務器,價格昂貴,土豪專屬。硬件負載均衡的主流產(chǎn)品有:F5 和 A10。
硬件負載均衡的 優(yōu)點:
- 功能強大:支持全局負載均衡并提供較全面的、復雜的負載均衡算法。
- 性能強悍:硬件負載均衡由于是在專用處理器上運行,因此吞吐量大,可支持單機百萬以上的并發(fā)。
- 安全性高:往往具備防火墻,防 DDos 攻擊等安全功能。
硬件負載均衡的 缺點:
- 成本昂貴:購買和維護硬件負載均衡的成本都很高。
- 擴展性差:當訪問量突增時,超過限度不能動態(tài)擴容。
軟件負載均衡,應用最廣泛,無論大公司還是小公司都會使用。軟件負載均衡從軟件層面實現(xiàn)負載均衡,一般可以在任何標準物理設備上運行。
軟件負載均衡的 主流產(chǎn)品 有:Nginx、HAProxy、LVS。
- LVS 可以作為四層負載均衡器。其負載均衡的性能要優(yōu)于 Nginx。
- HAProxy 可以作為 HTTP 和 TCP 負載均衡器。
- Nginx、HAProxy 可以作為四層或七層負載均衡器。
- 擴展性好:適應動態(tài)變化,可以通過添加軟件負載均衡實例,動態(tài)擴展到超出初始容量的能力。
- 成本低廉:軟件負載均衡可以在任何標準物理設備上運行,降低了購買和運維的成本。
- 性能略差:相比于硬件負載均衡,軟件負載均衡的性能要略低一些。
軟件負載均衡從通信層面來看,又可以分為四層和七層負載均衡。
1) 七層負載均衡:就是可以根據(jù)訪問用戶的 HTTP 請求頭、URL 信息將請求轉(zhuǎn)發(fā)到特定的主機。
- DNS 重定向
- HTTP 重定向
- 反向代理
- 修改 IP 地址
- 修改 MAC 地址
DNS 負載均衡一般用于互聯(lián)網(wǎng)公司,復雜的業(yè)務系統(tǒng)不適合使用。大型網(wǎng)站一般使用 DNS 負載均衡作為 第一級負載均衡手段,然后在內(nèi)部使用其它方式做第二級負載均衡。DNS 負載均衡屬于七層負載均衡。
DNS 即 域名解析服務,是 OSI 第七層網(wǎng)絡協(xié)議。DNS 被設計為一個樹形結(jié)構(gòu)的分布式應用,自上而下依次為:根域名服務器,一級域名服務器,二級域名服務器,... ,本地域名服務器。顯然,如果所有數(shù)據(jù)都存儲在根域名服務器,那么 DNS 查詢的負載和開銷會非常龐大。
因此,DNS 查詢相對于 DNS 層級結(jié)構(gòu),是一個逆向的遞歸流程,DNS 客戶端依次請求本地 DNS 服務器,上一級 DNS 服務器,上上一級 DNS 服務器,... ,根 DNS 服務器(又叫權(quán)威 DNS 服務器),一旦命中,立即返回。為了減少查詢次數(shù),每一級 DNS 服務器都會設置 DNS 查詢緩存。
DNS 負載均衡的工作原理就是:基于 DNS 查詢緩存,按照負載情況返回不同服務器的 IP 地址。

DNS 重定向的 優(yōu)點:
使用簡單:負載均衡工作,交給 DNS 服務器處理,省掉了負載均衡服務器維護的麻煩DNS 重定向的 缺點:
提高性能:可以支持基于地址的域名解析,解析成距離用戶最近的服務器地址(類似 CDN 的原理),可以加快訪問速度,改善性能;
可用性差:DNS 解析是多級解析,新增/修改 DNS 后,解析時間較長;解析過程中,用戶訪問網(wǎng)站將失敗;2.2.2 HTTP 負載均衡
擴展性低:DNS 負載均衡的控制權(quán)在域名商那里,無法對其做更多的改善和擴展;
維護性差:也不能反映服務器的當前運行狀態(tài);支持的算法少;不能區(qū)分服務器的差異(不能根據(jù)系統(tǒng)與服務的狀態(tài)來判斷負載)。
HTTP 負載均衡是基于 HTTP 重定向?qū)崿F(xiàn)的。HTTP 負載均衡屬于七層負載均衡。
HTTP 重定向原理是:根據(jù)用戶的 HTTP 請求計算出一個真實的服務器地址,將該服務器地址寫入 HTTP 重定向響應中,返回給瀏覽器,由瀏覽器重新進行訪問。

HTTP 重定向的優(yōu)點:方案簡單。
HTTP 重定向的 缺點:
性能較差:每次訪問需要兩次請求服務器,增加了訪問的延遲。由于其缺點比較明顯,所以這種負載均衡策略實際應用較少。
降低搜索排名:使用重定向后,搜索引擎會視為 SEO 作弊。
如果負載均衡器宕機,就無法訪問該站點。
2.2.3 反向代理負載均衡
反向代理(Reverse Proxy)方式是指以 代理服務器 來接受網(wǎng)絡請求,然后 將請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的服務器,并將從內(nèi)網(wǎng)中的服務器上得到的結(jié)果返回給網(wǎng)絡請求的客戶端。反向代理負載均衡屬于七層負載均衡。
反向代理服務的主流產(chǎn)品:Nginx、Apache。
正向代理與反向代理有什么區(qū)別?
正向代理:發(fā)生在 客戶端,是由用戶主動發(fā)起的。翻墻軟件就是典型的正向代理,客戶端通過主動訪問代理服務器,讓代理服務器獲得需要的外網(wǎng)數(shù)據(jù),然后轉(zhuǎn)發(fā)回客戶端。
反向代理:發(fā)生在 服務端,用戶不知道代理的存在。
反向代理是如何實現(xiàn)負載均衡的呢?以 Nginx 為例,如下所示:
首先,在代理服務器上設定好負載均衡規(guī)則。然后,當收到客戶端請求,反向代理服務器攔截指定的域名或 IP 請求,根據(jù)負載均衡算法,將請求分發(fā)到候選服務器上。其次,如果某臺候選服務器宕機,反向代理服務器會有容錯處理,比如分發(fā)請求失敗 3 次以上,將請求分發(fā)到其他候選服務器上。
反向代理的 優(yōu)點:
1) 多種負載均衡算法:支持多種負載均衡算法,以應對不同的場景需求。反向代理的 缺點:
2) 可以監(jiān)控服務器:基于 HTTP 協(xié)議,可以監(jiān)控轉(zhuǎn)發(fā)服務器的狀態(tài),如:系統(tǒng)負載、響應時間、是否可用、連接數(shù)、流量等,從而根據(jù)這些數(shù)據(jù)調(diào)整負載均衡的策略。
1) 額外的轉(zhuǎn)發(fā)開銷:反向代理的轉(zhuǎn)發(fā)操作本身是有性能開銷的,可能會包括創(chuàng)建連接,等待連接響應,分析響應結(jié)果等操作。
2) 增加系統(tǒng)復雜度:反向代理常用于做分布式應用的水平擴展,但反向代理服務存在以下問題,為了解決以下問題會給系統(tǒng)整體增加額外的復雜度和運維成本:
-
反向代理服務如果自身宕機,就無法訪問站點,所以需要有 高可用 方案,常見的方案有:主備模式(一主一備)、雙主模式(互為主備)。
- 反向代理服務自身也存在性能瓶頸,隨著需要轉(zhuǎn)發(fā)的請求量不斷攀升,需要有 可擴展 方案。
IP 負載均衡是在網(wǎng)絡層通過修改請求目的地址進行負載均衡。

如上圖所示,IP 均衡處理流程大致為:
客戶端請求 192.168.137.10,由負載均衡服務器接收到報文。IP 負載均衡在內(nèi)核進程完成數(shù)據(jù)分發(fā),較反向代理負載均衡有更好的從處理性能。但是,由于所有請求響應都要經(jīng)過負載均衡服務器,集群的吞吐量受制于負載均衡服務器的帶寬。
負載均衡服務器根據(jù)算法選出一個服務節(jié)點 192.168.0.1,然后將報文請求地址改為該節(jié)點的 IP。
真實服務節(jié)點收到請求報文,處理后,返回響應數(shù)據(jù)到負載均衡服務器。
負載均衡服務器將響應數(shù)據(jù)的源地址改負載均衡服務器地址,返回給客戶端。
2.2.5 數(shù)據(jù)鏈路層負載均衡
數(shù)據(jù)鏈路層負載均衡是指在通信協(xié)議的數(shù)據(jù)鏈路層修改 mac 地址進行負載均衡。

在 Linux 平臺上最好的鏈路層負載均衡開源產(chǎn)品是 LVS (Linux Virtual Server)。LVS 是基于 Linux 內(nèi)核中 netfilter 框架實現(xiàn)的負載均衡系統(tǒng)。netfilter 是內(nèi)核態(tài)的 Linux 防火墻機制,可以在數(shù)據(jù)包流經(jīng)過程中,根據(jù)規(guī)則設置若干個關(guān)卡(hook 函數(shù))來執(zhí)行相關(guān)的操作。
LVS 的工作流程大致如下:
當用戶訪問 www.sina.com.cn 時,用戶數(shù)據(jù)通過層層網(wǎng)絡,最后通過交換機進入 LVS 服務器網(wǎng)卡,并進入內(nèi)核網(wǎng)絡層。
進入 PREROUTING 后經(jīng)過路由查找,確定訪問的目的 VIP 是本機 IP 地址,所以數(shù)據(jù)包進入到 INPUT 鏈上
IPVS 是工作在 INPUT 鏈上,會根據(jù)訪問的 vip port 判斷請求是否 IPVS 服務,如果是則調(diào)用注冊的 IPVS HOOK 函數(shù),進行 IPVS 相關(guān)主流程,強行修改數(shù)據(jù)包的相關(guān)數(shù)據(jù),并將數(shù)據(jù)包發(fā)往 POSTROUTING 鏈上。
POSTROUTING 上收到數(shù)據(jù)包后,根據(jù)目標 IP 地址(后端服務器),通過路由選路,將數(shù)據(jù)包最終發(fā)往后端的服務器上。開源 LVS 版本有 3 種工作模式,每種模式工作原理截然不同,說各種模式都有自己的優(yōu)缺點,分別適合不同的應用場景,不過最終本質(zhì)的功能都是能實現(xiàn)均衡的流量調(diào)度和良好的擴展性。主要包括三種模式:DR 模式、NAT 模式、Tunnel 模式。
三、負載均衡算法
負載均衡器的實現(xiàn)可以分為兩個部分:
根據(jù)負載均衡算法在候選服務器列表選出一個服務器;負載均衡算法是負載均衡服務核心中的核心。負載均衡產(chǎn)品多種多樣,但是各種負載均衡算法原理是共性的。負載均衡算法有很多種,分別適用于不同的應用場景,本文僅介紹最為常見的負載均衡算法的特性及原理:輪詢、隨機、最小活躍數(shù)、源地址哈希、一致性哈希。
將請求數(shù)據(jù)發(fā)送到該服務器上。