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

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

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

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

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





