背景
隨著互聯網業務的迅猛發展,大型電商平臺和門戶網站對系統的可用性和可靠性要求越來越高,高可用集群、負載均衡集群成為一種熱門的系統架構解決方案。在眾多的負載均衡集群解決方案中,有基于硬件的負載均衡設備,例如F5、Big-IP等,也有基于軟件的負載均衡產品,例如HAProxy、LVS、Nginx等,在軟件的負載均衡產品中,又分為兩種實現方式,分別是基于操作系統的軟負載實現和基于第三方應用的軟負載實現。LVS就是基于linux操作系統實現的一種軟負載均衡,而Nginx、HAProxy就是基于第三應用實現的軟負載均衡,本文將對比一下HAProxy、Nginx。
Nginx
介紹
Nginx(發音同engine x)是一款由俄羅斯程序員Igor Sysoev所開發輕量級的網頁服務器、反向代理服務器以及電子郵件(IMAP/POP3)代理服務器。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用。
特點
- 輕量級,采用C進行編寫,同樣的web服務,會占用更少的內存及資源。
- 抗并發,nginx以epollandkqueue作為開發模型,處理請求是異步非阻塞的。在高并發下nginx能保持低資源低消耗高性能
- 可以配置nginx的upstream實現nginx的反向代理。
- nginx作為負載均衡服務器,支持7層負載均衡。
- 支持高并發連接,每秒最多的并發連接請求理論可以達到50000個。
- nginx配置簡潔,正則配置讓很多事情變得簡單
- 用線程處理用戶請求,而線程是共享內存的,只需要開啟少量進程,多個線程就可以共享進程的內存,占用內存小。
- nginx的設計高度模塊化,編寫模塊相對簡單。
- 社區活躍,各種高性能模塊出品迅速。
負載均衡
負載均衡是Nginx常用的一個功能,是在服務端通過的負載均衡算法實現的,Nginx也要具有很多不同的負載均衡策略。負載均衡的意思是將請求分攤到不同的服務器上執行,例如:web服務器、企業內部服務器等等,這樣可以提高系統的吞吐量和請求的響應速度。
負載均衡算法
- 輪詢:輪詢方式是Nginx負載默認的方式,顧名思義,所有請求都按照時間順序分配到不同的服務上,如果服務Down掉,可以自動剔除
- 權重:指定每個服務的權重比例,weight和訪問比率成正比,通常用于后端服務機器性能不統一,將性能好的分配權重高來發揮服務器最大性能
- IP地址散列:每個請求都根據訪問ip的hash結果分配,經過這樣的處理,每個訪客固定訪問一個后端服務
- 最少連接:將請求分配到連接數最少的服務上
- fair:按后端服務器的響應時間來分配請求,響應時間短的優先分配
- URL散列:通過管理客戶端請求URL信息的散列,將發送至相同URL的請求轉發至同一服務器的算法
架構
主進程(master)
Nginx 啟動時,會生成兩種類型的 進程 *,一個是 主進程 ( master ), 一個 ( windows版本的目前只有一個)或 多個工作進程 ( worker )。 主進程 并不處理網絡請求,主要負責 調度工作進程 , 加載配置 、 啟動工作進程 及 非停升級 。所以, Nginx 啟動以后,查看操作系統的進程列表,我們就能看到 至少有兩個 Nginx 進程。
工作進程(worker)
服務器實際 處理網絡請求 及 響應 的是 工作進程 ( worker ),在類 unix 系統上, Nginx可以配置 多個 worker ,而每個 worker 進程 都可以同時處理 數以千計 的 網絡請求
HAProxy
介紹
HAProxy是法國人Willy Tarreau 使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基于TCP和HTTP的應用程序代理。HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的并發連接。并且它的運行模式使得它可以很簡單安全地整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
特點
- 可靠性和穩定性非常好,可以與硬件級的F5負載均衡設備相媲美;
- 最高可以同時維護40000-50000個并發連接,單位時間內處理的最大請求數為20000個,最大處理能力可達10Git/s;
- 支持多達8種負載均衡算法,同時也支持會話保持;
- 支持虛擬機主機功能,從而實現web負載均衡更加靈活;
- 支持連接拒絕、全透明代理等獨特的功能;
- 擁有強大的ACL支持,用于訪問控制;
- 其獨特的彈性二義樹數據結構,使數據結構的復雜性上升到了0(1),即數據的查尋速度不會隨著數據條日的增加而速度有所下降;支持客戶端的keepalive功能,減少客戶端與haproxy的多次三次握手導致資源浪費,讓多個請求在一個tcp連接中完成;
- 支持TCP加速,零復制功能,類似于mmap機制;
- 支持響應池(response buffering) ;
- 支持RDP協議;
- 基于源的粘性,類似nginx的ip hash功能,把來自同一客戶端的請求在一定時間內始終調度到上游的同一服務器;·更好統計數據接口,其web接口顯示后端集群中各個服務器的接收、發送、拒絕、錯誤等數據的統計信息;
- 詳細的健康狀態檢測,web接口中有關于對上游服務器的健康檢測狀態,并提供了一定的管理功能;
- 基于流量的健康評估機制;
- 基于http認證;
- 基于命令行的管理接口;
- 日志分析器,可對日志進行分析。
負載均衡
負載均衡算法
- roundrobin:表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
- static-rr:表示根據權重
- leastconn:表示最少連接者先處理
- source:這個跟 Nginx 的 IP_hash 機制類似
- ri:表示根據請求的 URI;
- rl_param:表示根據請求的 URl 參數’balance url_param’ requires an URLparameter name;
- hdr(name):表示根據 HTTP 請求頭來鎖定每一次 HTTP 請求;
- rdp-cookie(name):表示根據據 cookie(name)來鎖定并哈希每一次 TCP 請求。
架構
HAProxy實現的是一種事件驅動、單一進程的架構模型,此類模型的優點在于能夠支撐高并發大規模的連接。反之,多進程或多線程模型受內存和系統調度器的限制以及無處不在的鎖限制,很難應對數以萬計的高并發連接。HAProxy支持連接拒絕,通過拒絕連接,可以限制某些非法或有意的攻擊型連接,從而降低其對網站帶來的危害。的這一功能已成為目前應對小型 DDoS攻擊的主要方法之一,并且其他負載均衡器很難做到這點。此外, HAProxy還支持全透明代理,即可以將客戶端地址或者任何指定地址直接連接到后端服務器,通過全透明代理,可以不用修改某些特殊服務器地址而使其直接接收并處理部分特定流量。
工作模式如下
- tcp模式:該模式下,在客戶端和服務器之間將建立一個全雙工的連接,且不會對7層的報文做任何處理的簡單模式。此模式默認,通常用于SSL、SSH、SMTP應用。
- http模式(一般使用):該模式下,客戶端請求在轉發給后端服務器之前會被深度分析,所有不與RFC格式兼容的請求都會被拒絕。
- health模式 : 僅做健康檢查
總結
從定位上來說,nginx重點是web服務器,替換的是Apache,同時具備lb的作用,haproxy是單純的lb。二者現在都能支持http/tcp/udp的負載均衡,nginx的采用類似編程語言的配置,用文檔結構表示配置關系,看起來比較清晰,haproxy的配置有點像網絡設備,定義和引用,有時候搞清一個邏輯需要上下來回翻看。nginx是master-workers多進程,每個進程單線程,多核CPU能充分利用;haproxy是多線程,單進程就能實現超高性能,雖然haproxy也能多進程,但是網上資料多認為開了多進程也不能提升性能,不建議多進程跑。即使做反向代理nginx性能略低于haproxy,但實際兩者性能都超高,