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

  • 1、負載均衡
  • 負載均衡算法
  • 轉發實現
  • 2、集羣下的 Session 管理
  • Sticky Session
  • Session Replication
  • Session Server

1、負載均衡

集羣中的應用服務器(節點)一般被設計成無狀態,用戶能夠請求任何一個節點。算法

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

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

  • 高可用:當某個節點故障時,負載均衡器會將用戶請求轉發到另外的節點上,從而保證全部服務持續可用;
  • 伸縮性:根據系統總體負載狀況,能夠很容易地添加或移除節點。

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

  1. 根據負載均衡算法獲得轉發的節點;
  2. 進行轉發。

負載均衡算法

1. 輪詢(Round Robin)

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

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

 

 

 

該算法比較適合每一個服務器的性能差很少的場景,若是有性能存在差別的狀況下,那麼性能較差的服務器可能沒法承擔過大的負載(下圖的 Server 2)。負載均衡

 

 

 

2. 加權輪詢(Weighted Round Robbin)

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

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

 

 

 

3. 最少鏈接(least Connections)

因爲每一個請求的鏈接時間不同,使用輪詢或者加權輪詢算法的話,可能會讓一臺服務器當前鏈接數過大,而另外一臺服務器的鏈接太小,形成負載不均衡。ide

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

 

 

 

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

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

 

 

 

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

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

5. 隨機算法(Random)

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

和輪詢算法相似,該算法比較適合服務器性能差很少的場景。

 

 

 

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

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

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

 

 

 

轉發實現

1. HTTP 重定向

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

缺點:

  • 須要兩次請求,所以訪問延遲比較高;
  • HTTP 負載均衡器處理能力有限,會限制集羣的規模。

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

 

 

 

2. DNS 域名解析

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

優勢:

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

缺點:

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

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

 

 

 

3. 反向代理服務器

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

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

優勢:

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

缺點:

  • 全部請求和響應都須要通過反向代理服務器,它可能會成爲性能瓶頸。

4. 網絡層

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

源服務器返回的響應也須要通過負載均衡服務器,一般是讓負載均衡服務器同時做爲集羣的網關服務器來實現。

優勢:

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

缺點:

  • 和反向代理同樣,全部的請求和響應都通過負載均衡服務器,會成爲性能瓶頸。

5. 鏈路層

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

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

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

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

參考:

2、集羣下的 Session 管理

一個用戶的 Session 信息若是存儲在一個服務器上,那麼當負載均衡器把用戶的下一個請求轉發到另外一個服務器,因爲服務器沒有用戶的 Session 信息,那麼該用戶就須要從新進行登陸等操做。

Sticky Session

須要配置負載均衡器,使得一個用戶的全部請求都路由到同一個服務器,這樣就能夠把用戶的 Session 存放在該服務器中。

缺點:

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

 

 

 

Session Replication

在服務器之間進行 Session 同步操做,每一個服務器都有全部用戶的 Session 信息,所以用戶能夠向任何一個服務器進行請求。

缺點:

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

 

 

 

Session Server

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

優勢:

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

缺點:

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

 

 

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

相關文章
相關標籤/搜索