nginx的6種負載均衡策略

在服務器集羣中,Nginx起到一個反向代理服務器的做用。爲了不單獨一個服務器壓力過大致使服務器奔潰,就須要將不一樣用戶的請求轉發給不一樣給不一樣的服務器,保證集羣中的每一臺服務器都能正常運做,這種機制就叫作負載均衡。算法

下面說一下Nginx支持的6種負載均衡策略。後端

輪詢(默認)跨域

輪詢是Nginx支持的默認負載均衡策略,輪詢策略就是指每一個請求會按時間順序逐一分配到不一樣的後臺服務器上。好比說一個集羣中只有服務器A和服務器B,第一次訪問是服務器A,第二次訪問就是服務器B,第三次訪問就是服務器A...以此類推。緩存

upstream balanceServer {
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

輪詢策略提供以下參數:服務器

fail_timeout 與max_fails結合使用,表示max_fails次失敗後服務器暫停的時間。
max_fails
設置在fail_timeout參數設置的時間內最大失敗次數,默認是1,若是在這個時間內,全部針對該服務器的請求都失敗了,那麼認爲該服務器會被認爲是停機了,返回proxy_next_upstream模塊定義的錯誤。
fail_time 服務器會被認爲停機的時間長度,默認爲10s。
backup 標記該服務器爲備用服務器。當主服務器中止時,請求會被髮送到它這裏,當其餘全部的非backup機器down掉或者繁忙的時候纔會請求backup服務器,所以這臺機器壓力會最低。
down 標記服務器永久停機了,表示當前的server暫時不參與負載。
weight 負載的權重,默認爲1。weight越大,表示這臺服務器被訪問的概率就越大。

在輪詢策略下,若是集羣中的某個服務器掛掉了,就會自動剔除該服務器。併發

輪詢策略適合服務器配置至關,無狀態且短平快的服務使用。負載均衡

權重(weight,加權輪詢)ide

權重策略是在輪詢策略的基礎上,另外指定了輪詢的概率。url

upstream balanceServer {
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

在上面的例子中,weight參數用來指定輪詢的概率,weight的默認值爲1,weight的數值與訪問比率成正比,好比8084端口的服務器被訪問的概率是其餘服務器的兩倍。spa

權重越高,分配到須要處理的請求就越多。

權重策略能夠與least_conn和ip_hash結合使用。

權重策略比較適合服務器的硬件配置差異較大的狀況。

根據IP分配(ip_hash)

這種策略是按照客戶端的IP去分配服務器,使同一個客戶端的請求都轉發到同一個後臺服務器,保證了Session的統一性,能夠用來解決Session的跨域問題。

upstream balanceServer {
    ip_hash; # 指定負載均衡策略爲ip_hash
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

在Nginx的1.3.1版本以前,不能在這種策略種使用權重(weight)。

ip_hash不能和backup參數同時使用。

這個策略適用於有狀態服務,好比說Session會話。

當有服務器須要剔除的時候,必須手動down掉。

最少鏈接(least_conn)

這個策略是把請求轉發給鏈接數較少的後端服務器。前面的輪詢策略是把請求平均地轉發給集羣中的每一個後臺服務器,使得它們的負載大體相同,可是有些請求可能佔用的時間會很長,可能致使所在的後端負載太高。這種狀況下選用least_conn策略就能達到更好的負載均衡效果。

upstream balanceServer {
    least_conn; # 指定負載均衡策略爲least_conn
    server localhost:8081;
    server localhost:8082 backup;
    server localhost:8083 max_fails=3 fail_timeout=20s;
    server localhost:8084 weight=2;
}

這個策略適合用在請求處理時間長短不一形成服務器過載的場景。

響應時間(fair)

這種策略是按照服務器的響應時間來分配請求,響應時間短的優先分配。

upstream balanceServer {
    fair; # 指定負載均衡策略爲fair
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

fair策略是一種第三方策略,須要安裝第三方插件。

根據URL分配(url_hash)

這種策略是按照訪問url的hash結果來分配請求,使得每一個url定向到同一個後端服務器,要配合緩存命中來使用。同一個資源屢次請求,可能會到達不一樣的服務器上,致使沒必要要的屢次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash的話,就可使得同一個url(也就是同一個資源請求)到達同一臺服務器,一旦緩存住了資源,再次收到請求,就能夠從緩存中讀取。

upstream balanceServer {
    url_hash; # 指定負載均衡策略爲url_hash
    server localhost:8081;
    server localhost:8082;
    server localhost:8083;
    server localhost:8084;
}

url_hash策略是一種第三方策略,須要安裝第三方插件。

配置實例

# user yanggb;
worker_processes  4;

events {
    # 最大併發數
    worker_connections  1024;
}

http {
    # 待選服務器列表
    upstream balanceServer {
        server 10.1.40.129:8099 fail_timeout=60s;
        server 10.1.40.23:9088;
        server 10.1.40.77:7086;
    }

    server {
        # 監聽端口
        listen 80;
        
        # 根目錄下
        location / {
            # 選擇哪一個服務器列表
            proxy_pass http://balanceServer;
        }
    }
    
}

總結

Nginx的負載均衡其實也能夠看做是5種,由於其中的權重輪詢其實能夠歸類到輪詢策略中。除了輪詢策略(包括權重輪詢)外的其餘負載均衡策略都是使用不一樣的算法實現的,在實際的運用中,須要根據不一樣的場景有針對性地去選擇不一樣的負載均衡策略(能夠多種策略組合使用),來響應實際的需求。

 

"有沒有那麼一個特別的場景,能讓你想起我。"

相關文章
相關標籤/搜索