Nginx負載均衡(上)
1. 什么是負載均衡
負載均衡,其英文簡稱Load Balancing,是一種計算機技術(shù)。用來在多個計算機(計算機集群)、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動器或其他資源中分配負載,以達到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的。宏觀上的意思是將負載(工作任務(wù),訪問請求)進行平衡、分攤到多個操作單元(服務(wù)器,組件)上進行執(zhí)行以解決高性能,單點故障(高可用),擴展性(水平伸縮)等高流量下常見的問題。
2. 負載均衡分類
由于載均衡技術(shù)是要對網(wǎng)絡(luò)傳輸中的報文控制,因此會涉及到網(wǎng)絡(luò)七層模型,因此負載均衡分類可以按照網(wǎng)絡(luò)層次進行分類,比如二層、三層、四層、七層負載均衡。其中最常見的是四層和七層負載均衡。此外,還有其他方面進行分類的,有軟件負載均衡、硬件負載均衡等。
2.1 二層負載均衡
負載均衡服務(wù)器對外依然提供一個VIP(虛IP),集群中不同的機器采用相同IP地址,但是機器的MAC地址不一樣。當負載均衡服務(wù)器接受到請求之后,通過改寫報文的目標MAC地址的方式將請求轉(zhuǎn)發(fā)到目標機器實現(xiàn)負載均衡。
2.2 三層負載均衡
和二層負載均衡類似,負載均衡服務(wù)器對外依然提供一個VIP(虛IP),但是集群中不同的機器采用不同的IP地址。當負載均衡服務(wù)器接受到請求之后,根據(jù)不同的負載均衡算法,通過IP將請求轉(zhuǎn)發(fā)至不同的真實服務(wù)器。
2.3 四層負載均衡
四層負載均衡工作在OSI模型的傳輸層,由于在傳輸層,只有TCP/UDP協(xié)議,這兩種協(xié)議中除了包含源IP、目標IP以外,還包含源端口號及目的端口號。四層負載均衡服務(wù)器在接受到客戶端請求后,以后通過修改數(shù)據(jù)包的地址信息(IP+端口號)將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
2.4 七層負載均衡
七層負載均衡工作在 OSI 模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用 http、dns 等。七層負載就可以基于這些協(xié)議來負載。這些應(yīng)用層協(xié)議中會包含很多有意義的內(nèi)容。比如同一個 Web 服務(wù)器的負載均衡,除了根據(jù) IP 加端口進行負載外,還可根據(jù)七層的 URL、瀏覽器類別、語言來決定是否要進行負載均衡。
業(yè)界已經(jīng)有很多開源的負載均衡工具,大部分是工作在第四層和第七層的。代表的開源工具有
Nginx/LVS/Haproxy。值得一提的是,LVS 是國內(nèi)前淘寶網(wǎng)高級研究員章文嵩博士的作品。LVS 主要用來做四層負載均衡,Nginx 和 Haproxy 主要是做七層的負載均衡,但它們都支持四層的負載均衡,例如在 Nginx 中的 stream 模塊除了支持四層的反向代理功能,也支持四層負載均衡功能。
3. 負載均衡算法
負載均衡算法可以分成兩大類,一類是靜態(tài)的負載均衡算法,常見的有輪詢、權(quán)重等;另一大類動態(tài)的負載均衡算法,常見的有最少的連接、最快響應(yīng)、服務(wù)類型、服務(wù)質(zhì)量等等,還有很多策略,不同的軟件會實現(xiàn)不同的負載均衡算法。
4. Nginx中的負載均衡配置
Nginx 的 stream 模塊和 http 模塊分別支持四層和七層模塊的負載均衡。其用法和支持的負載均衡策略大致相同。首先使用 upstream 指令塊 和 server 指令指定上游的服務(wù),upstream 指令的用法如下:
Syntax: upstream name { ... }
Default: —
Context: http
官網(wǎng)示例如下:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
這里定義了4臺上游服務(wù)器,分別用域名, ip+port、socket 形式指定地址,后面跟上若干配置參數(shù)。默認情況下,upstream 指令塊中采用的是加權(quán) Round-Robin 負載均衡算法。該算法通過加權(quán)輪詢的方式訪問 upstream 中 server 指令指定的上游服務(wù)。此時,在server 指令中我們可以添加一些關(guān)于服務(wù)的靜態(tài)配置,比如指定服務(wù)的權(quán)重(weight)、server 的最大并發(fā)連接數(shù)(max_conns)、max_fails 和 fail_timeout 等。
除了默認的 Round-Robin 算法外,Nginx 中常用的負載均衡策略還有基于客戶端 ip 地址的 Hash 算法。該算法以客戶端的 ip 地址作為 hash 算法的關(guān)鍵字,映射到特定的上游服務(wù)器中,當然也可以根據(jù)客戶段的其他 key 來進行 hash 算法。涉及的配置指令為 ip_hash 和 hash,用法如下:
Syntax: ip_hash;
Default: —
Context: upstream
Syntax: hash key [consistent];
Default: —
Context: upstream
最后 Nginx 中一種常用的動態(tài)負載均衡算法是最少連接數(shù)算法。該算法會從所有的上游服務(wù)器中找到并發(fā)連接數(shù)最少的一個,然后將請求轉(zhuǎn)發(fā)給它,如果出現(xiàn)多個最少連接數(shù)的服務(wù)器,則會在這些最少連接數(shù)的服務(wù)器中繼續(xù)應(yīng)用 Round-Robin 算法。配置該策略的指令為 least_conn,其指令格式如下:
Syntax: least_conn;
Default: —
Context: upstream
當然, Nginx 中的負載均衡策略還有很多,就不在此一一介紹了??梢宰屑氀凶x官方文檔進行進一步學習
5. 小結(jié)
本小節(jié)只是介紹了負載均衡的相關(guān)知識,以及對應(yīng) Nginx 中的配置指令,后面一節(jié)會實戰(zhàn) Nginx 的負載均衡功能,同時測試多種負載均衡算法。