應(yīng)用服務(wù)器應(yīng)該設(shè)計(jì)成無狀態(tài)的,也就是說應(yīng)用服務(wù)器不存儲請求上下文信息嗦玖,如果將部署有相同的應(yīng)用服務(wù)器組成一個集群,每次用戶的請求都可以發(fā)送到集群中任意一臺服務(wù)器上去處理,任何一臺服務(wù)器的處理結(jié)果都是相同的谴麦。這樣只要能將用戶請求按照某種規(guī)則分發(fā)到集群中的不同服務(wù)器上,就可以構(gòu)成一個服務(wù)器集群了伸头,每個用戶的請求都可能落在不同服務(wù)器上匾效。
負(fù)載均衡服務(wù)器:一種 HTTP 請求分發(fā)裝置,可以感知或者可以配置集群的服務(wù)器數(shù)量恤磷,可以及時發(fā)現(xiàn)集群中新上線或者下線的服務(wù)器面哼,并能向新上線的服務(wù)器分發(fā)請求,停止向已下線的服務(wù)器分發(fā)請求扫步,這樣負(fù)載均衡服務(wù)器就實(shí)現(xiàn)了應(yīng)用服務(wù)器集群的伸縮性了魔策。
HTTP 重定向負(fù)載均衡
HTTP 重定向服務(wù)器是一臺普通的應(yīng)用服務(wù)器,其唯一的功能就是根據(jù)用戶的 HTTP 請求計(jì)算一臺真實(shí)的服務(wù)器地址河胎,并將真實(shí)的服務(wù)器地址寫入 HTTP 重定向響應(yīng)中(響應(yīng)狀態(tài)嗎 302)返回給瀏覽器闯袒,然后瀏覽器再自動請求真實(shí)的服務(wù)器。
在圖中仿粹,瀏覽器請求訪問域名www.mysite.com
搁吓,DNS 服務(wù)器解析得到 IP 地址是 114.100.80.10,即 HTTP 重定向服務(wù)器的 IP 地址吭历。然后瀏覽器通過 IP 地址 114.100.80.10 訪問 HTTP 重定向負(fù)載均衡服務(wù)器后堕仔,服務(wù)器根據(jù)某種負(fù)載均衡算法計(jì)算獲得一臺實(shí)際物理服務(wù)器的地址(114.100.80.3),構(gòu)造一個包含該實(shí)際物理服務(wù)器地址的重定向響應(yīng)返回給瀏覽器晌区,瀏覽器自動重新請求實(shí)際物理服務(wù)器的 IP 地址 114.100.80.3摩骨,完成訪問通贞。
這種負(fù)載均衡方案的優(yōu)點(diǎn)是比較簡單,缺點(diǎn)是瀏覽器需要每次請求兩次服務(wù)器才能拿完成一次訪問恼五,性能較差昌罩;重定向服務(wù)器自身的處理能力有可能成為瓶頸,整個集群的伸縮性規(guī)模有限灾馒;使用 HTTP 302 響應(yīng)嗎重定向茎用,可能使搜索引擎判斷為 SEO 作弊,降低搜索排名睬罗。因此這種方案在實(shí)際使用中并不見多轨功。
DNS 域名解析負(fù)載均衡
在 DNS 服務(wù)器中配置多個 A 記錄,如:www.mysite.com
IN A 114.100.80.1容达、www.mysite.com
IN A 114.100.80.2古涧、www.mysite.com
IN A 114.100.80.3。
每次域名解析請求都會根據(jù)負(fù)載均衡算法計(jì)算一個不同的 IP 地址返回花盐,這樣 A 記錄中配置的多個服務(wù)器就構(gòu)成一個集群羡滑,并可以實(shí)現(xiàn)負(fù)載均衡算芯。圖中的瀏覽器請求解析域名www.mysite.com
,DNS 根據(jù) A 記錄和負(fù)載均衡算法計(jì)算得到一個 IP 地址 114.100.80.3熙揍,并返回給瀏覽器;瀏覽器根據(jù)該 IP 地址诈嘿,訪問真實(shí)物理服務(wù)器 114.100.80.3。
- 優(yōu)點(diǎn)
將負(fù)載均衡的工作交給了 DNS削葱,省掉了網(wǎng)站管理維護(hù)負(fù)載均衡服務(wù)器的麻煩,同時許多 DNS 還支持基于地理位置的域名解析析砸,即會將域名解析成距離用戶地理最近的一個服務(wù)器地址,這樣就可以加快用戶訪問速度首繁,改善性能作郭。 - 缺點(diǎn)
目前的 DNS 是多級解析,每一級 DNS 都可能緩存 A 記錄弦疮,但下線某臺服務(wù)器時,即使修改了 DNS 的 A 記錄咏尝,要使其生效也需要較長時間,這段時間编检,DNS 依然會將域名解析到已經(jīng)下線的服務(wù)器,導(dǎo)致用戶訪問失敗厕怜,而且 DNS 負(fù)載均衡的控制權(quán)在域名服務(wù)商那里,網(wǎng)站無法對其做更多的改善和針對于自己網(wǎng)站的一些修改粥航。
事實(shí)上谤专,大型網(wǎng)站總是部分使用 DNS 域名解析,利用域名解析作為第一級負(fù)載均衡手段置侍,即域名解析得到的一組服務(wù)器并不是實(shí)際提供 Web 服務(wù)的物理服務(wù)器蜡坊,而是同樣提供負(fù)載均衡服務(wù)的內(nèi)部服務(wù)器,這組內(nèi)部負(fù)載均衡服務(wù)器再進(jìn)行負(fù)載均衡秕衙,再將請求分發(fā)到真實(shí)的 Web 服務(wù)器上季研。
反向代理負(fù)載均衡
利用反向代理緩存資源匀谣,可以改善網(wǎng)站性能铅匹。實(shí)際上短条,在部署位置上礼殊,反向代理服務(wù)器處于 Web 服務(wù)器前面(這樣才可能緩存 Web 響應(yīng)针史,加速訪問),這個位置也正好是負(fù)載均衡服務(wù)器所在的位置啄枕,所以大多數(shù)的反向代理服務(wù)器同時提供了負(fù)載均衡的功能。Web 服務(wù)器處理完的響應(yīng)也需要通過反向代理服務(wù)器返回給用戶近忙。由于 Web 服務(wù)器不直接對外提供訪問,因此 Web 服務(wù)器不需要使用外部 IP 地址及舍,而反向代理服務(wù)器則需要配置雙網(wǎng)卡和內(nèi)部外部兩套 IP 地址。
圖中咐柜,瀏覽器訪問請求的地址是反向代理服務(wù)器的地址 114.100.80.10攘残,反向代理服務(wù)器收到請求后拙友,根據(jù)負(fù)載均衡算法計(jì)算得到一臺真實(shí)物理服務(wù)器的地址 10.0.0.3歼郭,并將請求轉(zhuǎn)發(fā)給服務(wù)器。10.0.0.3 處理完請求后將響應(yīng)返回給反向代理服務(wù)器牍蜂,反向代理服務(wù)器再將該響應(yīng)返回給用戶泰涂。
- 優(yōu)點(diǎn)
由于反向代理服務(wù)器轉(zhuǎn)發(fā)請求在 HTTP 協(xié)議層面,因此也叫應(yīng)用層負(fù)載均衡逼蒙,其優(yōu)點(diǎn)是和反向代理服務(wù)器功能集成在一起,部署簡單僵井。 - 缺點(diǎn)
反向代理服務(wù)器是所有請求和響應(yīng)的中轉(zhuǎn)站驳棱,其性能可能會成為瓶頸
IP 負(fù)載均衡
在網(wǎng)絡(luò)層通過修改請求目的地址進(jìn)行負(fù)載均衡,如下圖
用戶請求數(shù)據(jù)包到達(dá)負(fù)載均衡服務(wù)器 114.100.80.10 后,負(fù)載均衡服務(wù)器在操作系統(tǒng)內(nèi)核進(jìn)程獲取網(wǎng)絡(luò)數(shù)據(jù)包罚渐,根據(jù)負(fù)載均衡算法計(jì)算得到一臺真實(shí) Web 服務(wù)器 10.0.0.1驯妄,然后將數(shù)據(jù)目的 IP 修改為 10.0.0.1,不需要通過用戶進(jìn)程處理青扔。真實(shí)的 Web 應(yīng)用服務(wù)器處理完成后翩伪,響應(yīng)數(shù)據(jù)包回到負(fù)載均衡服務(wù)器谈息,負(fù)載均衡服務(wù)器再將數(shù)據(jù)包源地址修改為自身的 IP 地址(114.100.80.10)發(fā)送給用戶瀏覽器。
這里關(guān)鍵在于真實(shí)物理 Web 服務(wù)器響應(yīng)數(shù)據(jù)包如何返回給負(fù)載均衡服務(wù)器轻姿。一種方案是負(fù)載均衡服務(wù)器在修改目的 IP 地址的同時修改源地址逻炊,將數(shù)據(jù)包源地址設(shè)為自身 IP,即源地址轉(zhuǎn)換(SNAT)豹休,這樣 Web 服務(wù)器的響應(yīng)會再回到負(fù)載均衡服務(wù)器桨吊;另一種方案就是將負(fù)載均衡服務(wù)器同時作為真實(shí)物理服務(wù)器集群的網(wǎng)關(guān)服務(wù)器,這樣所有響應(yīng)數(shù)據(jù)都會到達(dá)負(fù)載均衡服務(wù)器屏积。
- 優(yōu)點(diǎn)
IP 負(fù)載均衡在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā),較反向代理負(fù)載均衡(在應(yīng)用程序中分發(fā)數(shù)據(jù))有更好的處理性能炊林。 - 缺點(diǎn)
所有請求響應(yīng)都需要經(jīng)過負(fù)載均衡服務(wù)器,集群的最大響應(yīng)數(shù)據(jù)吞吐量不得不受制于負(fù)載均衡服務(wù)器網(wǎng)卡帶寬独榴,對于提供下載服務(wù)或者視頻服務(wù)等需要傳輸大量數(shù)據(jù)的網(wǎng)站而言奕枝,難以滿足需求。(因?yàn)轫憫?yīng)數(shù)據(jù)包的源 IP 地址是內(nèi)網(wǎng)地址不可訪問外網(wǎng)症歇,所以數(shù)據(jù)包必須要經(jīng)過負(fù)載均衡服務(wù)器轉(zhuǎn)發(fā)給外網(wǎng))
能不能讓負(fù)載均衡服務(wù)器只分發(fā)請求谭梗,而使響應(yīng)數(shù)據(jù)從真實(shí)物理服務(wù)器直接返回給用戶呢?
數(shù)據(jù)鏈路層負(fù)載均衡
數(shù)據(jù)鏈路層負(fù)載均衡是指在通信協(xié)議的數(shù)據(jù)鏈路層修改 mac 地址進(jìn)行負(fù)載均衡激捏。
這種數(shù)據(jù)傳輸方式又稱作三角傳輸模式远舅,負(fù)載均衡數(shù)據(jù)分發(fā)過程中不修改 IP 地址痕钢,只修改目的 mac 地址序六,通過配置真實(shí)物理服務(wù)器集群所有機(jī)器 IP 和負(fù)載均衡服務(wù)器 IP 地址一致,從而達(dá)到不修改數(shù)據(jù)包的源地址和目的地址就可以進(jìn)行數(shù)據(jù)分發(fā)的目的课梳,由于實(shí)際處理請求的真實(shí)物理服務(wù)器 IP 和數(shù)據(jù)請求目的 IP 一致余佃,不需要通過負(fù)載均衡服務(wù)器進(jìn)行地址轉(zhuǎn)換,可將響應(yīng)數(shù)據(jù)包直接返回給用戶瀏覽器爆土,避免負(fù)載均衡服務(wù)器網(wǎng)卡帶寬成為瓶頸。這種負(fù)載均衡方式又稱作直接路由方式(DR)氧猬。
在上圖中坏瘩,用戶請求到達(dá)負(fù)載均衡服務(wù)器后,負(fù)載均衡服務(wù)器將請求數(shù)據(jù)的目的 mac 地址修改為 00:0c:29:d2妄均,并不修改數(shù)據(jù)包目標(biāo) IP 地址哪自,由于 Web 服務(wù)器集群所有服務(wù)器的虛擬 IP 地址都和負(fù)載均衡服務(wù)器的 IP 地址相同,因此數(shù)據(jù)可以正常傳輸?shù)?mac 地址 00:0c:29:d2 對應(yīng)的服務(wù)器壤巷,該服務(wù)器處理完成后發(fā)送響應(yīng)數(shù)據(jù)到網(wǎng)站的網(wǎng)關(guān)服務(wù)器,網(wǎng)關(guān)服務(wù)器直接將該數(shù)據(jù)包發(fā)送到用戶瀏覽器(通過互聯(lián)網(wǎng))寄症,響應(yīng)數(shù)據(jù)不需要通過負(fù)載均衡服務(wù)器矩动。
使用三角傳輸模式的鏈路層負(fù)載均衡是目前大型網(wǎng)站所使用的最廣的一種負(fù)載均衡手段。在 linux 平臺上最好的鏈路層負(fù)載均衡開源產(chǎn)品是 LVS(linux virtual server)。
負(fù)載均衡算法
負(fù)載均衡服務(wù)器的實(shí)現(xiàn)分為兩部分:
- 根據(jù)負(fù)載均衡算法和 Web 服務(wù)器列表計(jì)算得到集群中一臺 Web 服務(wù)器的地址檀训;
- 將請求數(shù)據(jù)分發(fā)到該地址對應(yīng)的 Web 服務(wù)器上。
具體的負(fù)載均衡算法有以下幾種:
輪詢
所有請求被依次分發(fā)到每臺應(yīng)用服務(wù)器上峻凫,即每臺服務(wù)器需要處理的請求數(shù)目都相同,適合于所有服務(wù)器硬件都相同的場景譬胎。加權(quán)輪詢
根據(jù)應(yīng)用服務(wù)器硬件性能的情況命锄,在輪詢的基礎(chǔ)上,按照配置的權(quán)重將請求分發(fā)到每個服務(wù)器脐恩,高性能的服務(wù)器能分配更多的請求。隨機(jī)
請求被隨機(jī)分配到各個應(yīng)用服務(wù)器驶冒。可以根據(jù)應(yīng)用服務(wù)器硬件配置不同加權(quán)隨機(jī)算法崇猫。最少連接
記錄每個應(yīng)用服務(wù)器正在處理的連接數(shù)(請求數(shù))需忿,將新的請求分發(fā)到最少連接的服務(wù)器上。同樣可以加權(quán)贴谎。源地址散列
根據(jù)請求來源的 IP 地址進(jìn)行 Hash 計(jì)算擅这,得到應(yīng)用服務(wù)器,這樣來自同一 IP 地址的請求總在同一個服務(wù)器上處理仲翎,該請求的上下文信息可以存儲在這臺服務(wù)器上,在一個會話周期內(nèi)重復(fù)使用鲫构,從而實(shí)現(xiàn)會話黏滯玫坛。