解析nginx負載均衡

2021-08-15 10:03:21 字數 2061 閱讀 4501

摘要:對於乙個大型**來說,負載均衡是永恆的話題。隨著硬體技術的迅猛發展,越來越多的負載均衡硬體裝置湧現出來,如f5 big-ip、citrix netscaler、radware等等,雖然可以解決問題,但其高昂的**卻往往令人望而卻步,因此負載均衡軟體仍然是大部分公司的不二之選。nginx作為webserver的後起之秀,其優秀的反向**功能和靈活的負載均衡策略受到了業界廣泛的關注。本文將以工業生產為背景,從設計實現和具體應用等方面詳細介紹nginx負載均衡策略。

關鍵字:nginx 負載均衡 反向**

1.前言

隨著網際網路資訊的**性增長,負載均衡(load balance)已經不再是乙個很陌生的話題,顧名思義,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應足夠快,給使用者很好的體驗。快速增長的訪問量和資料流量催生了各式各樣的負載均衡產品,很多專業的負載均衡硬體提供了很好的功能,但卻**不菲,這使得負載均衡軟體大受歡迎,nginx就是其中的乙個。

nginx第乙個公開版本發布於2023年,2023年發布了1.0版本。它的特點是穩定性高、功能強大、資源消耗低,從其目前的市場占有而言,nginx大有與apache搶市場的勢頭。其中不得不提到的乙個特性就是其負載均衡功能,這也成了很多公司選擇它的主要原因。本文將從原始碼的角度介紹nginx的內建負載均衡策略和擴充套件負載均衡策略,以實際的工業生產為案例,對比各負載均衡策略,為nginx使用者提供參考。

2. 原始碼剖析

nginx的負載均衡策略可以劃分為兩大類:內建策略和擴充套件策略。內建策略包含加權輪詢和ip hash,在預設情況下這兩種策略會編譯進nginx核心,只需在nginx配置中指明引數即可。擴充套件策略有很多,如fair、通用hash、consistent hash等,預設不編譯進nginx核心。由於在nginx版本公升級中負載均衡的**沒有本質性的變化,因此下面將以nginx1.0.15穩定版為例,從原始碼角度分析各個策略。

2.1. 加權輪詢(weighted round robin)

第一,如果可以把加權輪詢演算法分為先深搜尋和先廣搜尋,那麼nginx採用的是先深搜尋演算法,即將首先將請求都分給高權重的機器,直到該機器的權值降到了比其他機器低,才開始將請求分給下乙個高權重的機器;第二,當所有後端機器都down掉時,nginx會立即將所有機器的標誌位清成初始狀態,以避免造成所有的機器都處在timeout的狀態,從而導致整個前端被夯住。

nginx原始碼的目錄結構很清晰,加權輪詢所在路徑為nginx-1.0.15/src/http/ngx_http_upstream_round_robin.[c|h],在原始碼的基礎上,首先看下ngx_http_upstream_round_robin.h中的重要宣告:

從變數命名中,我們就可以大致猜出其作用。其中,current_weight和weight的區別主要是前者為權重排序的值,隨著處理請求會動態的變化,後者是配置值,用於恢復初始狀態。

這裡有個tried變數需要做些說明。tried中記錄了伺服器當前是否被嘗試連線過。他是乙個位圖。如果伺服器數量小於32,則只需在乙個int中即可記錄下所有伺服器狀態。如果伺服器數量大於32,則需在記憶體池中申請記憶體來儲存。

2.2. ip hash

ip hash是nginx內建的另乙個負載均衡的策略,流程和輪詢很類似,只是其中的演算法和具體的策略有些變化,

ip hash演算法的核心,hash值既與ip有關又與後端機器的數量有關。經過測試,上述演算法可以連續產生1045個互異的value,這是該演算法的硬限制。對此nginx使用了保護機制,當經過20次hash仍然找不到可用的機器時,演算法退化成輪詢。因此,從本質上說,ip hash演算法是一種變相的輪詢演算法,如果兩個ip的初始hash值恰好相同,那麼來自這兩個ip的請求將永遠落在同一臺伺服器上,這為均衡性埋下了很深的隱患。

2.3. fair

fair策略是擴充套件策略,預設不被編譯進nginx核心。其原理是根據後端伺服器的響應時間判斷負載情況,從中選出負載最輕的機器進行分流。這種策略具有很強的自適應性,但是實際的網路環境往往不是那麼簡單,因此要慎用。

2.4. 通用hash、一致性hash

這兩種也是擴充套件策略,在具體的實現上有些差別,通用hash比較簡單,可以以nginx內建的變數為key進行hash,一致性hash採用了nginx內建的一致性hash環,可以支援memcache。

摘要自:

nginx 負載均衡 解析

4,配置例項 如果負載均衡中其中web2發生這樣的情況,nginx首先會去web1請求,但是nginx在配置不當的情況下會繼續分發請求到web2,然後等待web2響應,直到我們的響應時間超時,才會把請求重新分發給web1,server 192.168.62.157 8080 server 192.1...

nginx 負載均衡 Nginx負載均衡策略

nginx提供的負載均衡策略有2種 內建策略和擴充套件策略。內建策略為輪詢 預設 加權輪詢,ip hash,第三方。upstream mysvr1 輪詢 每個請求按照時間順序逐一的分配到每乙個後台伺服器上。如果某台伺服器宕機了,將會自動的剔除宕機的服務。nginx預設就是輪詢其權重都預設為1,伺服器...

nginx負載均衡

nginx 的 upstream目前支援 4 種方式的分配 1 輪詢 預設 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。2 weight 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。3 ip hash 每個請求按訪問ip的hash...