千萬級流量架構下的負載均衡解析

本人免費整理了Java高級資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G,需要自己領取。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q


一、負載均衡

  • 負載均衡算法

  • 轉發實現

  • 二、集羣下的 Session 管理

  • Sticky Session

  • Session Replication

  • Session Server

一、負載均衡

集羣中的應用服務器(節點)通常被設計成無狀態,用戶可以請求任何一個節點。

負載均衡器會根據集羣中每個節點的負載情況,將用戶請求轉發到合適的節點上。

負載均衡器可以用來實現高可用以及伸縮性:

  • 高可用:當某個節點故障時,負載均衡器會將用戶請求轉發到另外的節點上,從而保證所有服務持續可用;

  • 伸縮性:根據系統整體負載情況,可以很容易地添加或移除節點。

負載均衡器運行過程包含兩個部分:

  1. 根據負載均衡算法得到轉發的節點;

  2. 進行轉發。

負載均衡算法

1. 輪詢(Round Robin)

輪詢算法把每個請求輪流發送到每個服務器上。

下圖中,一共有 6 個客戶端產生了 6 個請求,這 6 個請求按 (1, 2, 3, 4, 5, 6) 的順序發送。(1, 3, 5) 的請求會被髮送到服務器 1,(2, 4, 6) 的請求會被髮送到服務器 2。


v2-2f862b91c4512171653a95b7707e838a_hd.jpg



該算法比較適合每個服務器的性能差不多的場景,如果有性能存在差異的情況下,那麼性能較差的服務器可能無法承擔過大的負載(下圖的 Server 2)。


v2-ba9f9fc4b23a9174ef3d99837cd7afb0_hd.jpg



2. 加權輪詢(Weighted Round Robbin)

加權輪詢是在輪詢的基礎上,根據服務器的性能差異,爲服務器賦予一定的權值,性能高的服務器分配更高的權值。

例如下圖中,服務器 1 被賦予的權值爲 5,服務器 2 被賦予的權值爲 1,那麼 (1, 2, 3, 4, 5) 請求會被髮送到服務器 1,(6) 請求會被髮送到服務器 2。


v2-2ddaa4eb66eaa6f439e10d87eb2ce29c_hd.jpg



3. 最少連接(least Connections)

由於每個請求的連接時間不一樣,使用輪詢或者加權輪詢算法的話,可能會讓一臺服務器當前連接數過大,而另一臺服務器的連接過小,造成負載不均衡。

例如下圖中,(1, 3, 5) 請求會被髮送到服務器 1,但是 (1, 3) 很快就斷開連接,此時只有 (5) 請求連接服務器 1;(2, 4, 6) 請求被髮送到服務器 2,只有 (2) 的連接斷開,此時 (6, 4) 請求連接服務器 2。該系統繼續運行時,服務器 2 會承擔過大的負載。


v2-a3e9655ba8fae1e7dd42cba5204a8e9e_hd.jpg



最少連接算法就是將請求發送給當前最少連接數的服務器上。

例如下圖中,服務器 1 當前連接數最小,那麼新到來的請求 6 就會被髮送到服務器 1 上。


v2-ecf53e6a50fe8cf788f363ed99feb202_hd.jpg



4. 加權最少連接(Weighted Least Connection)

在最少連接的基礎上,根據服務器的性能爲每臺服務器分配權重,再根據權重計算出每臺服務器能處理的連接數。

5. 隨機算法(Random)

把請求隨機發送到服務器上。

和輪詢算法類似,該算法比較適合服務器性能差不多的場景。


v2-21615afca09929e3d04d3570aea736ae_hd.jpg



6. 源地址哈希法 (IP Hash)

源地址哈希通過對客戶端 IP 計算哈希值之後,再對服務器數量取模得到目標服務器的序號。

可以保證同一 IP 的客戶端的請求會轉發到同一臺服務器上,用來實現會話粘滯(Sticky Session)


v2-625323ed977e431fa022c06d34484593_hd.jpg



轉發實現

1. HTTP 重定向

HTTP 重定向負載均衡服務器使用某種負載均衡算法計算得到服務器的 IP 地址之後,將該地址寫入 HTTP 重定向報文中,狀態碼爲 302。客戶端收到重定向報文之後,需要重新向服務器發起請求。

缺點:

  • 需要兩次請求,因此訪問延遲比較高;

  • HTTP 負載均衡器處理能力有限,會限制集羣的規模。

該負載均衡轉發的缺點比較明顯,實際場景中很少使用它。


v2-f4511e161bdfb650d1dd0fc6362c7319_hd.jpg



2. DNS 域名解析

在 DNS 解析域名的同時使用負載均衡算法計算服務器 IP 地址。

優點:

  • DNS 能夠根據地理位置進行域名解析,返回離用戶最近的服務器 IP 地址。

缺點:

  • 由於 DNS 具有多級結構,每一級的域名記錄都可能被緩存,當下線一臺服務器需要修改 DNS 記錄時,需要過很長一段時間才能生效。

大型網站基本使用了 DNS 做爲第一級負載均衡手段,然後在內部使用其它方式做第二級負載均衡。也就是說,域名解析的結果爲內部的負載均衡服務器 IP 地址。


v2-3dac4d9639eb1388249c37af16b795f2_hd.jpg



3. 反向代理服務器

反向代理服務器位於源服務器前面,用戶的請求需要先經過反向代理服務器才能到達源服務器。反向代理可以用來進行緩存、日誌記錄等,同時也可以用來做爲負載均衡服務器。

在這種負載均衡轉發方式下,客戶端不直接請求源服務器,因此源服務器不需要外部 IP 地址,而反向代理需要配置內部和外部兩套 IP 地址。

優點:

  • 與其它功能集成在一起,部署簡單。

缺點:

  • 所有請求和響應都需要經過反向代理服務器,它可能會成爲性能瓶頸。

4. 網絡層

在操作系統內核進程獲取網絡數據包,根據負載均衡算法計算源服務器的 IP 地址,並修改請求數據包的目的 IP 地址,最後進行轉發。

源服務器返回的響應也需要經過負載均衡服務器,通常是讓負載均衡服務器同時作爲集羣的網關服務器來實現。

優點:

  • 在內核進程中進行處理,性能比較高。

缺點:

  • 和反向代理一樣,所有的請求和響應都經過負載均衡服務器,會成爲性能瓶頸。

5. 鏈路層

在鏈路層根據負載均衡算法計算源服務器的 MAC 地址,並修改請求數據包的目的 MAC 地址,並進行轉發。

通過配置源服務器的虛擬 IP 地址和負載均衡服務器的 IP 地址一致,從而不需要修改 IP 地址就可以進行轉發。也正因爲 IP 地址一樣,所以源服務器的響應不需要轉發回負載均衡服務器,可以直接轉發給客戶端,避免了負載均衡服務器的成爲瓶頸。

這是一種三角傳輸模式,被稱爲直接路由。對於提供下載和視頻服務的網站來說,直接路由避免了大量的網絡傳輸數據經過負載均衡服務器。

這是目前大型網站使用最廣負載均衡轉發方式,在 Linux 平臺可以使用的負載均衡服務器爲 LVS(Linux Virtual Server)。

參考:

二、集羣下的 Session 管理

一個用戶的 Session 信息如果存儲在一個服務器上,那麼當負載均衡器把用戶的下一個請求轉發到另一個服務器,由於服務器沒有用戶的 Session 信息,那麼該用戶就需要重新進行登錄等操作。

Sticky Session

需要配置負載均衡器,使得一個用戶的所有請求都路由到同一個服務器,這樣就可以把用戶的 Session 存放在該服務器中。

缺點:

  • 當服務器宕機時,將丟失該服務器上的所有 Session。


v2-08f5d5c6e71edabadb5557937bb118c3_hd.jpg



Session Replication

在服務器之間進行 Session 同步操作,每個服務器都有所有用戶的 Session 信息,因此用戶可以向任何一個服務器進行請求。

缺點:

  • 佔用過多內存;

  • 同步過程佔用網絡帶寬以及服務器處理器時間。


v2-3d343d94f466681e46883a206455d71f_hd.jpg



Session Server

使用一個單獨的服務器存儲 Session 數據,可以使用傳統的 MySQL,也使用 Redis 或者 Memcached 這種內存型數據庫。

優點:

  • 爲了使得大型網站具有伸縮性,集羣中的應用服務器通常需要保持無狀態,那麼應用服務器不能存儲用戶的會話信息。Session Server 將用戶的會話信息單獨進行存儲,從而保證了應用服務器的無狀態。

缺點:

  • 需要去實現存取 Session 的代碼。


v2-032f9b77075faa28ea0a37f4428566dd_hd.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章