天天看點

NGINX UPSTREAM和負載均衡政策nginx upstream和輪詢政策

nginx upstream和輪詢政策

注:提供基礎講解示例,生産環境請根據自身情況并參照nginx官方配置

一、nginx upstream

  • nginx upstream文法配置

#upstream 後面跟服務名

# server 後面跟域名、端口、權重等配置,可以看到他既支援http協定也支援socket協定的類型,backup意味着該域名是備用的位址

upstream service {
        server domain.com    max_fails=3 fail_timeout=20s;
        server localhost:8080 weight=5;
        server localhost:8081 backup;
        server localhost:8082 down;
        server localhost:8083 max_conns=2;
    }
           

 在upstream子產品配置完成後,要讓指定的通路反向代理到伺服器清單:

location ~ .*$ {
            index index index.html;
            proxy_pass http://service;
}
           
  • 後端伺服器排程參數
NGINX UPSTREAM和負載均衡政策nginx upstream和輪詢政策

backup:backup不參與服務,當其他節點無法服務了,他就參與服務。

max_fails:代理伺服器向後端請求,一旦發現請求狀态失敗,會去再度請求。超過max_fails規定的次數,随即宣告失敗。

fail_timeout:超過max_fails規定的次數,接下來就會“等待一會兒”,通常為10s ,可以通過fail_timeout設定更長的時間。

max_conns 由于nginx向upstram(伺服器池)采用輪詢的方式,分發請求,有的時候我們會遇到連接配接池中的伺服器硬體性能高低不一,有的是4核,有的是24核,配置低的伺服器可能根本接收不了分攤給他的請求數目,這個時候就用到了max_conns配置。

二、nginx的負載均衡政策

負載均衡政策

輪詢 預設方式
weight 權重方式
ip_hash 依據ip配置設定方式
least_conn 最少連接配接方式
fair(第三方) 響應時間方式
url_hash(第三方) 依據URL配置設定方式
  • 輪詢

nginx的負載均衡常見有上表6種,預設采用的就是逐一輪詢的方式。

upstream service {
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
    }
           
  • 權重-weight

權重輪詢的排程算法:weight參數用于指定輪詢幾率,weight的預設值為1;weight的數值與通路比率成正比,如下配置8081服務被通路的幾率為其他伺服器的兩倍。

upstream service {
        server localhost:8080;
        server localhost:8081 weight=2;
        server localhost:8082;
        server localhost:8083;
    }
           

輪詢帶來的問題是:如果很多操作或通路是基于cookie或者session的,輪詢會打到不同的伺服器上去,session和cookie也就無從保持,導緻了掉線。

  • ip_hash

 指定負載均衡器按照基于用戶端IP的配置設定方式,這個方法確定了相同的用戶端的請求一直發送到相同的伺服器,以保證session會話。這樣每個訪客都固定通路一個後端伺服器,可以解決session不能跨伺服器的問題。

upstream service {
        ip_hash;    #保證每個訪客固定通路一個後端伺服器
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
    }
           
  • least_conn

  把請求轉發給連接配接數較少的後端伺服器。輪詢算法是把請求平均的轉發給各個後端,使它們的負載大緻相同;但是,有些請求占用的時間很長,會導緻其所在的後端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。

upstream service {
        least_conn;
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
    }
           
  • fair

    按照伺服器端的響應時間來配置設定請求,響應時間短的優先配置設定。

upstream service {
        fair;
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
        
    }
           
  • url_hash(1.7.2以後版本推出)

  按通路url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,要配合緩存命中來使用。同一個資源多次請求,可能會到達不同的伺服器上,導緻不必要的多次下載下傳,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一台伺服器,一旦緩存住了資源,再此收到請求,就可以從緩存中讀取。 

upstream service {
        hash $request_uri;    #實作每個url定向到同一個後端伺服器
        server localhost:8080;
        server localhost:8081;
        server localhost:8082;
        server localhost:8083;
    }
           

繼續閱讀