1. 程式人生 > >nginx實現負載均衡的5種模式(RR)

nginx實現負載均衡的5種模式(RR)

負載均衡

負載均衡是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。簡單而言就是當有2臺或以上伺服器時,根據規則隨機的將請求分發到指定的伺服器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉到負載均衡。而Nginx目前支援自帶3種負載均衡策略,還有2種常用的第三方策略。

RR簡單輪詢(預設)

RR(round-robin)輪詢,每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

    upstream test {
        server localhost:8080;
        server localhost:8081;
    }
    server {
        listen       81;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;

        location / {
            proxy_pass http://test;
            proxy_set_header Host $host:$server_port;
        }
    }

負載均衡的核心程式碼為

upstream test {
server localhost:8080;
server localhost:8081;
}

這裡配置了2臺伺服器,實際上是一臺,只是埠不一樣而已,而8081的伺服器是不存在的,也就是說訪問不到,但是我們訪問http://localhost 的時候,也不會有問題,會預設跳轉到http://localhost:8080 具體是因為Nginx會自動判斷伺服器的狀態,如果伺服器處於不能訪問(伺服器掛了),就不會跳轉到這臺伺服器,所以也避免了一臺伺服器掛了影響使用的情況,由於Nginx預設是RR策略,所以我們不需要其他更多的設定。

balance權重

又叫平滑的加權輪詢(smooth weighted round-robin balancing),指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。

例如

    upstream test {
        server localhost:8080 weight=9;
        server localhost:8081 weight=1;
    }

那麼10次一般只會有1次會訪問到8081,而有9次會訪問到8080。

ip_hash(可確保session一致)

接下來是,基於IP雜湊分配,上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另外一個伺服器,當我們的程式不是無狀態的時候(採用了session儲存資料),這時候就有一個很大的很問題了,比如把登入資訊儲存到了session中,那麼跳轉到另外一臺伺服器的時候就需要重新登入了,除非做session共享或者同步

,所以很多時候我們需要一個客戶只訪問一個伺服器,那麼就需要用ip_hash了,ip_hash的每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

    upstream test {
        ip_hash;
        server localhost:8080;
        server localhost:8081;
    }

upstream-fair(第三方)

The Nginx fair proxy balancer enhances the standard round-robin load balancer provided
with Nginx so that it will track busy back end servers (e.g. Thin, Ebb, Mongrel)
and balance the load to non-busy server processes.

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
https://github.com/gnosek/nginx-upstream-fair

    upstream backend { 
        fair; 
        server localhost:8080;
        server localhost:8081;
    } 

url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。 在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法。

url_hash的優點是能夠提高後端快取伺服器的效率,比如提高squid快取(Squid是一個高效能的代理快取伺服器)的效率,但是缺點是當後端伺服器宕機的時候,url_hash不會自動跳轉的其他快取伺服器,而是返回給使用者一個503錯誤。

    upstream backend { 
        hash $request_uri; 
        hash_method crc32; 
        server localhost:8080;
        server localhost:8081;
    }