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共享或者同步
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;
}