- 分布式系統架構:技術棧詳解與快速進階
- 張程
- 866字
- 2020-08-13 13:45:36
4.4.4 負載均衡策略
upstream機制提供了負載均衡的功能,可以將請求負載分擔到集群服務器的某個服務器上面。它的工作流程如下:
1)分析客戶端請求報文,構建發往上游服務器的請求報文;
2)調用ngx_http_upstream_init開始與上游服務器建立TCP連接;
3)發送在第一步中組建的請求報文;
4)接收來自上游服務器的響應頭并進行解析,之后往下游轉發;
5)接收來自上游服務器的相應體,并進行轉發。
注意
upstream機制允許開發人員自己設定相應的處理方式,來達到自己的目的。
upstream支持6種負載分配方式,前三種為Nginx原生支持的分配方式,后三種為第三方支持的分配方式。
1. Nginx輪詢
輪詢是upstream的默認分配方式,即每個請求按照時間順序輪流分配到不同的后端服務器,如果某個后端服務器宕掉后,則能自動將其剔除,剩下的繼續輪詢。Niginx輪詢實現如代碼清單4-7所示。
代碼清單4-7 Nginx輪詢
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx輪詢代理示意如圖4-7所示。

圖4-7 Nginx/upstream輪詢代理圖
2. Nginx權重
權重是輪詢的加強版,即在輪詢的基礎上還可以指定輪詢比率,weight和訪問概率成正比,主要應用于應用服務器性能不均的情況。Nginx權重實現如代碼清單4-8所示,這里192.168.1.11的訪問比例是192.168.1.10的兩倍。
代碼清單4-8 Nginx權重
upstream zachary.sh.cn { server 192.168.1.10:8081 weight=1; server 192.168.1.11:8081 weight=2; }
Nginx權重代理示意如圖4-8所示。

圖4-8 Nginx/upstream權重代理圖
3. Nginx ip_hash
ip_hash即每個請求會按照訪問IP的hash值分配,這樣同一客戶端連續的Web請求都會被分發到同一服務器進行處理,可以解決session的問題。如果服務器宕掉,則能自動將其剔除,如代碼清單4-9所示。
代碼清單4-9 Nginx ip_hash
upstream zachary.sh.cn { ip_hash server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx ip_hash的代理示意如圖4-9所示。

圖4-9 Nginx/upstream ip_hash代理圖
4. Nginx fair
fair即按后端服務器的響應時間來分配請求,響應時間短的優先分配,如代碼清單4-10所示。
代碼清單4-10 Nginx fair
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; fair; }
Nginx fair的代理示意如圖4-10所示。

圖4-10 Nginx/upstream fair代理圖
5. Nginx url_hash
url_hash與ip_hash類似,但是其按照訪問URL的hash結果來分配請求,使得每個URL定向到同一個后端服務器,主要應用于后端服務器為緩存時的場景中,如代碼清單4-11所示。
代碼清單4-11 Nginx url_hash
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; hash $request_uri; hash_method crc32; }
6. Nginx least_conn
least_conn把請求轉發給連接數較少的后端服務器,如代碼清單4-12所示。
代碼清單4-12 Nginx least_conn
upstream zachary.sh.cn { least_conn; #把請求轉發給連接數較少的后端服務器 server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx least_conn的代理示意如圖4-11所示。

圖4-11 Nginx/upstream ip_hash代理圖