隨着業務和用戶不斷增加,單台服務器無法滿足業務需求,產生服務器集群的場景。為了能充分利用服務器集群,最理想的方式就是整個集群的利用率都很平均且穩定在理想值范圍內。
負載均衡(Load Balance)就是為了滿足能夠均衡的利用整個服務器集群從而產生的一種算法 ,常見的實現策略有:隨機、輪詢、哈希、一致性哈希和加權。
nginx目前比較常用的模塊有:
1. 輪詢
定義:依次把客戶端請求分配到不同的服務器中
配置示例:
upstream zhangQ {
server ip1:port1; server ip2:port2; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://zhangQ; }
}
2. 最少連接
定義:把客戶端請求分配到連接數最少的服務器中
如果每台服務器處理業務的時間都一樣,那么此策略與輪詢差不多。
如果每台服務器處理業務的時間不一樣,那么采用輪詢算法會導致業務邏輯處理較慢的服務器壓力越來越大負載較高,這樣的業務場景,把客戶端請求分配到連接數較少的服務器能達到更好的負載效果。
配置示例:
upstream zhangQ {
least_conn; #實際就是比輪詢多這一行
server ip1:port1; server ip2:port2; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://zhangQ; } }
3. ip_hash
定義:把訪問的客戶端的ip利用hash算法計算為一個數值,同一個數值會落到相同的服務器。
涉及到負載均衡基本上都會設計到session的保持,但使用ip_hash就不需要關注這個問題。
配置示例:
upstream zhangQ { ip_hash; #實際就是比輪詢多這一行 server ip1:port1; server ip2:port2; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://zhangQ; } }
4. weight
定義:權重實際就是加權輪詢,根據加權值會優先分配到權重高的服務器
服務器基本都是配置不一,高配置服務器通常都會比低配置服務器賦予較高的權重值。
配置示例:
upstream zhangQ { server ip1:port1 weight=3; #加上weight server ip2:port2 weight=1; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://zhangQ; } }
如果按照如上配置,就是每4次客戶端請求,會有3次落在ip1上,1次落在ip2上。
附上upstream中常用的幾個屬性配置:
| 名稱 | 定義 | 示例 |
| fail_timeout | 可以理解為熔斷時間,經過這個配置的時間如果服務器沒響應則失敗 | fail_timeout=2s |
| max_fails | 最大失敗數,默認值是1,當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤. | max_fails=2 |
| down | 有此標記的服務器不參與負載 | |
| backup | 當所有非backup服務器忙或者down的時候會請求這台服務器 |
