Nginx負載均衡原理


什么是負載均衡

負載均衡(Load Balance),它在網絡現有結構之上可以提供一種廉價、有效、透明的方法來擴展網絡設備和服務器的帶寬,並可以在一定程度上增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性等。用官網的話說,它充當着網絡流中“交通指揮官”的角色,“站在”服務器前處理所有服務器端和客戶端之間的請求,從而最大程度地提高響應速率和容量利用率,同時確保任何服務器都沒有超負荷工作。如果單個服務器出現故障,負載均衡的方法會將流量重定向到其余的集群服務器,以保證服務的穩定性。當新的服務器添加到服務器組后,也可通過負載均衡的方法使其開始自動處理客戶端發來的請求。詳情可參考:What Is Load Balancing? (https://www.Nginx.com/resources/glossary/load-balancing/)

簡言之,負載均衡實際上就是將大量請求進行分布式處理的策略。

什么是 Nginx負載均衡

通過上文簡單的概念介紹,你可能對負載均衡有了一個初步的了解,知道它是一種調度策略。那么問題來了,Nginx 又是什么呢?Nginx 如何實現負載均衡?這就要從正向代理和反向代理說起了。

正向代理

正向代理(Forward Proxy)最大的特點是,客戶端非常明確要訪問的服務器地址,它代理客戶端,替客戶端發出請求。比如:FQ(警告⚠️:FQ操作違反相關法律規定,本文只是為了解釋正向代理向讀者舉個例子,僅供學習參考,切勿盲目FQ)。

 

 

假設客戶端想要訪問 Google,它明確知道待訪問的服務器地址是 https://www.google.com/,但由於條件限制,它找來了一個能夠訪問到 Google 的”朋友”:代理服務器。客戶端把請求發給代理服務器,由代理服務器代替它請求 Google,最終再將響應返回給客戶端。這便是一次正向代理的過程,該過程中服務器並不知道真正發出請求的是誰。

反向代理

那么,隨着請求量的爆發式增長,服務器覺得自己一個人始終是應付不過來,需要兄弟服務器們幫忙,於是它喊來了自己的兄弟以及代理服務器朋友。此時,來自不同客戶端的所有請求實際上都發到了代理服務器處,再由代理服務器按照一定的規則將請求分發給各個服務器。

這就是反向代理(Reverse Proxy),反向代理隱藏了服務器的信息,它代理的是服務器端,代其接收請求。換句話說,反向代理的過程中,客戶端並不知道具體是哪台服務器處理了自己的請求。如此一來,既提高了訪問速度,又為安全性提供了保證。

 


在這之中,反向代理需要考慮的問題是,如何進行均衡分工,控制流量,避免出現局部節點負載過大的問題。通俗的講,就是如何為每台服務器合理的分配請求,使其整體具有更高的工作效率和資源利用率。

 

Nginx 是什么?

Nginx 作為一個基於 C 實現的高性能 Web 服務器,可以通過系列算法解決上述的負載均衡問題。並且由於它具有高並發、高可靠性、高擴展性、開源等特點,成為開發人員常用的反向代理工具。

負載均衡常用算法

1. 輪詢 (round-robin)

輪詢為負載均衡中較為基礎也較為簡單的算法,它不需要配置額外參數。假設配置文件中共有n台服務器,該算法遍歷服務器節點列表,並按節點次序每輪選擇一台服務器處理請求。當所有節點均被調用過一次后,該算法將從第一個節點開始重新一輪遍歷。

特點:由於該算法中每個請求按時間順序逐一分配到不同的服務器處理,因此適用於服務器性能相近的集群情況,其中每個服務器承載相同的負載。但對於服務器性能不同的集群而言,該算法容易引發資源分配不合理等問題。

2、加權輪詢

為了避免普通輪詢帶來的弊端,加權輪詢應運而生。在加權輪詢中,每個服務器會有各自的 weight。一般情況下,weight 的值越大意味着該服務器的性能越好,可以承載更多的請求。該算法中,客戶端的請求按權值比例分配,當一個請求到達時,優先為其分配權值最大的服務器。

特點:加權輪詢可以應用於服務器性能不等的集群中,使資源分配更加合理化。

3. IP 哈希(IP hash)

ip_hash 依據發出請求的客戶端 IP 的 hash 值來分配服務器,該算法可以保證同 IP 發出的請求映射到同一服務器,或者具有相同 hash 值的不同 IP 映射到同一服務器。

特點:該算法在一定程度上解決了集群部署環境下 Session 不共享的問題。

Session 不共享問題是說,假設用戶已經登錄過,此時發出的請求被分配到了 A 服務器,但 A 服務器突然宕機,用戶的請求則會被轉發到 B 服務器。但由於 Session 不共享,B 無法直接讀取用戶的登錄信息來繼續執行其他操作。

實際應用中,我們可以利用 ip_hash,將一部分 IP 下的請求轉發到運行新版本服務的服務器,另一部分轉發到舊版本服務器上,實現灰度發布。再者,如遇到文件過大導致請求超時的情況,也可以利用 ip_hash 進行文件的分片上傳,它可以保證同客戶端發出的文件切片轉發到同一服務器,利於其接收切片以及后續的文件合並操作。

4、其他算法

  • URL hash

    url_hash 是根據請求的 URL 的 hash 值來分配服務器。該算法的特點是,相同 URL 的請求會分配給固定的服務器,當存在緩存的時候,效率一般較高。然而 Nginx 默認不支持這種負載均衡算法,需要依賴第三方庫。

  • 最小連接數(Least Connections)

    假設共有n台服務器,當有新的請求出現時,遍歷服務器節點列表並選取其中連接數最小的一台服務器來響應當前請求。連接數可以理解為當前處理的請求數。

 原文地址:https://mp.weixin.qq.com/s?__biz=Mzg3ODAyNDI0OQ==&mid=2247484047&idx=1&sn=ffce58518ca1e439dad22033a0295f44&chksm=cf1b41d9f86cc8cf97f34f736e7e61c7eae1d5e379abbfde2e074be0c418a2a4302301afdd6d&mpshare=1&scene=23&srcid=&sharer_sharetime=1587997041653&sharer_shareid=6d0541e301a4fa3892dd3e84730e5ada#rd


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM