大型網站性能策略:詳細解析nginx負載均衡

發表于:2014-07-14來源:IT博客大學習作者:不詳點擊數: 標簽:負載均衡
對于一個大型網站來說,負載均衡是永恒的話題。隨著硬件技術的迅猛發展,越來越多的負載均衡硬件設備涌現出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂

  摘要:對于一個大型網站來說,負載均衡是永恒的話題。隨著硬件技術的迅猛發展,越來越多的負載均衡硬件設備涌現出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,因此負載均衡軟件仍然是大部分公司的不二之選。 nginx作為webserver的后起之秀,其優秀的反向代理功能和靈活的負載均衡策略受到了業界廣泛的關注。本文將以工業生產為背景,從設計實現和具體應用等方面詳細介紹nginx負載均衡策略。

  關鍵字:nginx 負載均衡 反向代理

  1.前言

  隨著互聯網信息的爆炸性增長,負載均衡(load balance)已經不再是一個很陌生的話題,顧名思義,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應足夠快,給用戶很好的體驗??焖僭鲩L的訪問量和數據流量催生了各式各樣的負載均衡產品,很多專業的負載均衡硬件提供了很好的功能,但卻價格不菲,這使得負載均衡軟件大受歡迎,nginx就是其中的一個。

  nginx第一個公開版本發布于2004年,2011年發布了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,則需在內存池中申請內存來存儲。對該位圖數組的使用可參考如下代碼:

  最后是實際的策略代碼,邏輯很簡單,代碼實現也只有30行,直接上代碼。

原文轉自:http://blogread.cn/it/article/5608?f=wb2

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97