Nginx負載均衡詳解
下面將介紹Nginx開源版內建的4種負載均衡策略和2種三方負載均衡策略,他們分別是 |
本文只是展示了部分nginx實現負載均衡時可以使用的策略模組,另外在nginx商業版中還存在其他內建的策略模組。負載均衡的三方策略可以在三方模組列表這裡找到。
nginx將所有請求均勻的分給叢集中的每臺伺服器。
upstream test { server 127.0.0.1:7001; # 等同於server 127.0.0.1:7001 weight=1; server 150.109.118.85:7001; # 等同於server 150.109.118.85:7001 weight=1; } server { listen 8081; server_name localhost; location / { proxy_pass } }
upstream:定義一個服務叢集。
proxy_pass: 將匹配的請求代理轉發到proxy_pass後面配置的服務上,這裡因為需要配置負載均衡,所以這裡
http://
後面必須要跟上upstream定義的服務叢集。
注意:upstream定義服務叢集時,配置的服務地址只能是域名+埠或者ip+埠,不能帶有協議和路徑,否則nginx會報
nginx: [emerg] invalid host in upstream
這個錯誤資訊。
upstream test { server 127.0.0.1:7001 weight=2; server 150.109.118.85:7001 weight=1; }
前面兩次請求都會轉發到
127.0.0.1:7001
這個服務,後面一次請求會轉發到
150.109.118.85:7001
這個服務,再後面兩次轉發到
127.0.0.1:7001
,。。。
最少連線數
檔案位置:src/http/modules/ngx_http_upstream_least_conn_module.c
nginx請求分配給active_connection/weight最小的伺服器。
upstream test { least_conn; server 127.0.0.1:7001 weight=1; server 150.109.118.85:7001 weight=1; }
檔案位置:src/http/modules/ngx_http_upstream_ip_hash_module.c
根據使用者的ip,計算出一個hash值,如果負載均衡快取中有這個hash對應的伺服器,那就直接轉發到對應的伺服器上。
upstream test { ip_hash; server 127.0.0.1:7001; server 150.109.118.85:7001; }
nginx使用ip_hash策略後,只要使用者電腦的ip不變化,就會始終請求同一臺業務服務。
應用場景:在實現檔案上傳功能時,要實現一個大檔案上傳,往往會將這個大檔案分成多個片段,然後上傳到伺服器,如果使用前面給的策略,就會出現同一個檔案的分片被上傳到不同伺服器,導致檔案合併失敗,不能達到預期效果。nginx使用ip_hash策略後,客戶端只要上傳了當前檔案的一個片段,後續檔案片段上傳的時候,nginx透過計算ip的hash,自動把請求轉發到hash對應的伺服器。
檔案位置:src/http/modules/ngx_http_upstream_hash_module.c
可以進行hash計算的有remote_addr(客戶端ip)(從測試結果上面看感覺可以直接替換掉ip_hash)、request_uri(請求uri)、args(請求引數),下面主要以request_uri的使用作為展示,其他兩個使用都類似。
根據請求的uri計算出一個hash值,然後將該請求轉發到一臺伺服器上面,後續請求透過hash計算後,如果有相同的hash,那麼就會將該請求轉發到該hash對應的伺服器。
如果叢集中某臺伺服器當機之後會出現什麼情況:假設r1命中a伺服器;r2命中b伺服器。當a伺服器當機,之前透過r1計算出來的hash與a伺服器的對應情況會失效,r1將重新分配給b伺服器。後續a伺服器恢復正常後,r1還是會分配給b伺服器。
upstream test { hash $request_uri; server 127.0.0.1:7001; server 150.109.118.85:7001; }
應用場景:所有請求相同的檔案資源的請求都會被轉發到同一個伺服器,資源更容易命中快取,減少寬頻和資源下載時間。
consistent_hash(一致性hash)這個模組使用方式和nginx內建的hash模組幾乎相同。能夠使用consistent_hash進行計算的內容和前面提到的nginx內建的hash模組一樣,有remote_addr、request_uri、args。這是一個三方模組,可以在ngx_http_consistent_hash這裡下載。
upstream test { consistent_hash $request_uri; server 127.0.0.1:7001; server 150.109.118.85:7001; }
響應時間短的服務優先分配請求。這個是三方模組,可以在 s 這裡下載模組。這個模組上次更新是8年前,可能需要考慮下是否需要使用這個。
upstream test { fair; server 127.0.0.1:7001; server 150.109.118.85:7001; }
測試中得出效果和輪詢預設情況效果一樣,暫時沒有找到問題在哪。。。
標識
down
的伺服器暫時不支援資源請求。
upstream test { server 127.0.0.1:7001 down; server 150.109.118.85:7001; }
上面負載均衡的例子中,因為
127.0.0.1:7001
標識為
down
,所以不會有請求轉發到這個服務,所有的請求都會轉發到
150.109.118.85:7001
這個服務。
叢集中服務的權重值,預設是1。在只有weight這一個影響條件下,且叢集中服務都正常,nginx會將更多的請求轉發到weight更大的服務。
upstream test { server 127.0.0.1:7001 weight=2; server 150.109.118.85:7001 weight=1; }
這個叢集中127服務和150服務各處理的請求比例為2:1。
允許服務處理請求時服務出錯的次數,預設為1。當服務處理請求發生錯誤的次數超過max_fails時,後面的請求暫時不會轉發到這臺發生錯誤的服務。
upstream test { server 127.0.0.1:7001 max_fail=1; server 150.109.118.85:7001; }
當服務處理請求發生錯誤的次數超過max_fails以後,nginx會暫時禁止將請求轉發到這個服務。當過去fail_timeout設定的時間以後,nginx會嘗試將請求轉發到剛才被禁止的服務,如果服務正常,那麼後續的請求可以繼續轉發到這臺服務,如果服務錯誤,那麼繼續等待fail_timeout時間後再來檢測。fail_timeout預設時間是10s。
upstream test { server 127.0.0.1:7001 max_fail=1 fail_timeout=10s; server 150.109.118.85:7001; }
備用伺服器,當所有非backup服務發生錯誤被停用或者設定為down時,nginx會啟用標識為backup的服務。
upstream test { server 127.0.0.1:7001 backup; server 150.109.118.85:7001; }
這個功能存在於nginx商業版。同一服務同時處理請求的個數。防止服務因處理請求過多,伺服器效能不足,發生當機的情況。
upstream test { server 127.0.0.1:7001 max_conns=10000; server 150.109.118.85:7001; }
這個功能存在於nginx商業版。當叢集中錯誤服務等待fail_timeout時間後,nginx檢測到這個服務能夠正常使用後,再等待slow_start時間後,才正式使用這個服務。
upstream test { server 127.0.0.1:7001 slow_start=30s; server 150.109.118.85:7001; }
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2691690/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 負載均衡詳解負載
- nginx負載均衡Nginx負載
- NGINX 負載均衡Nginx負載
- 【Nginx】負載均衡Nginx負載
- Nginx負載均衡模式Nginx負載模式
- 提升網站效能:Nginx五種高效負載均衡策略詳解!網站Nginx負載
- Nginx/LVS/HAProxy負載均衡軟體的優缺點詳解Nginx負載
- Nginx負載均衡高可用Nginx負載
- 012.Nginx負載均衡Nginx負載
- nginx實現負載均衡Nginx負載
- Kubernetes上的負載均衡詳解負載
- 做了反向代理和負載均衡的nginx配置檔案簡單示例(nginx.conf) HTTP負載均衡/TCP負載均衡負載NginxHTTPTCP
- windows第七層負載均衡 基於IIS的ARR負載均衡詳解Windows負載
- F5負載均衡系列教程八【負載均衡演算法詳解】負載演算法
- 負載均衡之--Nginx、LVS、HAProxy負載Nginx
- Nginx/Httpd負載均衡tomcat配置Nginxhttpd負載Tomcat
- Nginx+Tomcat部署負載均衡NginxTomcat負載
- nginx學習之負載均衡Nginx負載
- Nginx服務系列——負載均衡Nginx負載
- 使用Nginx配置TCP負載均衡NginxTCP負載
- 使用nginx進行負載均衡Nginx負載
- windows伺服器第四層負載均衡_基於NLB負載均衡詳解Windows伺服器負載
- nginx配置+uwsgi+負載均衡配置Nginx負載
- Nginx負載均衡之健康檢查Nginx負載
- Nginx 學習系列(二) ————- 負載均衡Nginx負載
- Nginx 學習系列(二) ------------- 負載均衡Nginx負載
- nginx+tomcat實現負載均衡NginxTomcat負載
- Nginx多種負載均衡策略搭建Nginx負載
- nginx安裝及負載均衡配置Nginx負載
- Nginx常用命令、負載均衡Nginx負載
- nginx負載均衡策略你知道多少?Nginx負載
- 常用負載均衡詳解(圖文總結)負載
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- nginx自定義負載均衡及根據cpu執行自定義負載均衡Nginx負載
- nginx負載均衡原理分析到手動編寫簡易負載均衡器Nginx負載
- 理解 Nginx HTTP 代理, 負載均衡, Buffering, CachingNginxHTTP負載
- Nginx實現簡單的負載均衡Nginx負載
- 簡單實踐搭建 nginx 負載均衡Nginx負載