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。
3. 對比測試
本測試主要為了對比各個策略的均衡性、一致性、容災性等,從而分析出其中的差異性,并據此給出各自的適用場景。為了能夠全面、客觀的測試 nginx的負載均衡策略,我們采用了兩個測試工具、在不同場景下做測試,以此來降低環境對測試結果造成的影響。首先簡單介紹測試工具、測試網絡拓撲和基本的測試流程。
3.1. 測試工具
3.1.1 easyABC
easyABC是公司內部開發的性能測試工具,采用epool模型實現,簡單易上手,可以模擬GET/POST請求,極限情況下可以提供上萬的壓力,在公司內部得到了廣泛的使用。由于被測試對象為反向代理服務器,因此需要在其后端搭建樁服務器,這里用nginx作為樁webserver,提供最基本的靜態文件服務。
3.1.2 polygraph
polygraph是一款免費的性能測試工具,以對緩存服務、代理、交換機等方面的測試見長。它有規范的配置語言PGL(Polygraph Language),為軟件提供了強大的靈活性。其工作原理如下圖所示:
polygraph提供client端和server端,將測試目標nginx放在二者之間,三者之間的網絡交互均走http協議,只需配置ip+port即可。client端可以配置虛擬robot的個數以及每個robot發請求的速率,并向代理服務器發起隨機的靜態文件請求,server端將按照請求的url生成隨機大小的靜態文件做響應。這也是選用這個測試軟件的一個主要原因:可以產生隨機的url作為nginx各種hash策略的key。
另外,polygraph還提供了日志分析工具,功能比較豐富,感興趣的同學可以參考附錄中的相關材料。
3.2. 測試環境
本測試運行在5臺物理機上,其中被測對象單獨搭在一臺8核機器上,另外四臺4核機器分別搭建了easyABC、webserver樁和polygraph,如下圖所示:
3.3. 測試方案
首先介紹下關鍵的測試指標:
均衡性:是否能夠將請求均勻的發送給后端
一致性:同一個key的請求,是否能落到同一臺機器
容災性:當部分后端機器掛掉時,是否能夠正常工作
以上述指標為指導,我們針對如下四個測試場景分別用easyABC和polygraph進行測試:
場景1 server_*均正常提供服務;
原文轉自:http://blogread.cn/it/article/5608?f=wb2