咱們都知道,Nginx支持負載均衡,能夠很方便的幫助咱們進行水平擴容,然而它到底是依據什麼原則進行請求的分發,其中又有哪些負載均衡算法可供選擇和配置,今天就讓咱們好好來了解一下。 git
什麼叫負載均衡,咱們能夠參考一下圖片中的這種狀況:github
我所理解的負載均衡,就是:算法
可以將客戶端的請求均勻地分發到後臺各個應用服務器上,從而緩解服務器壓力。後端
而且當服務器出現宕機或者擴容時,也能正常運行。服務器
上面瞭解了什麼是負載均衡,那麼Nginx是怎麼實現這個功能的呢?cookie
Nginx中負責與上游交互的模塊,統稱爲upstream模塊。併發
而指定上游服務地址是經過upstream
和server
指令完成的,其關係爲:負載均衡
指定上游服務器的address
時,其地址能夠是域名、IP地址或者unix socket地址。框架
能夠在域名或者IP地址後加端口,若是不加端口,那麼默認使用80端口
。socket
在address
後面能夠添加一些參數,好比:
backup
:指定當前server爲備份服務,僅當非備份server不可用時,請求才會轉發到該server。
down
:標識某臺服務已經下線,再也不服務。
舉個例子:
upstream upstream-service {
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}複製代碼
在upstream
這個模塊中,它還提供了一個最基本的負載均衡算法round-robin
。
其功能是:
以加權輪詢的方式訪問server指令指定的上游服務。
這個算法是默認集成在Nginx的框架中,沒法移除,因此後面講解的全部算法都是基於此,全部算法在某些特殊狀況下最終都會變成round-robin
。
涉及到的指令有:
weight
:服務訪問的權重,默認是1。 max_conns
:server的最大併發鏈接數,僅做用於單worker進程。 max_fails
:在fail_timeout
時間內,最大的失敗次數。當達到最大失敗時,會在fail_timeout
時間內不容許再次被選擇。 fail_timeout
:單位爲秒,默認是10秒。指定一段時間內,最大的失敗次數max_fails
。到達max_fails
後,該server不能訪問的時間。 有的時候,正常的輪詢算法並不能知足咱們的需求,
好比:帶有cookie請求狀態的鏈接,若是應用服務沒有設置專門的管理cookie的服務器,那麼咱們就但願同一個用戶能被分配到同一個服務器。
再好比:咱們後端應用須要針對請求當中的參數或者URL,將相同的請求放到相同的服務器上進行處理。
針對第一種狀況,就能夠用upstream_ip_hash
。針對第二種狀況,可使用upstream_hash
。
功能:
以客戶端的IP地址做爲hash算法的關鍵字,映射到特定的上游服務器中。
1. 對IPV4地址使用前3個字節做爲關鍵字,對IPV6則使用完整地址。
2. 可使用
round-robin
算法的參數。3. 能夠基於
realip
模塊修改用於執行算法的IP地址。
舉個例子:
upstream upstream-service {
ip_hash;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}複製代碼
功能:
經過制定關鍵字做爲hash key,基於hash算法映射到特定的上游服務器中。
1. 關鍵字能夠含有變量、字符串。
2. 可使用
round-robin
算法的參數。
舉個例子(以請求中的參數username做爲hash key):
upstream upstream-service {
hash user_$arg_username;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}複製代碼
hash算法在必定程度上已經能夠知足了咱們的業務需求,但若是這個時候遇到應用宕機或者應用擴容,那麼hash的總數就會變化,這樣頗有可能帶來大量請求本來請求的服務器會更換,路由會失效,這樣對於咱們的應用服務也會產生極大的影響,這時候就能夠採用一致性hash算法。
對於一致性哈希算法的理解,能夠參考這篇文章:一致性哈希算法的理解與實踐
它的使用也十分簡單,就是在以前說的upstream_hash
模塊的hash
指令最後,添加參數consistent
,這樣Nginx就可使用一致性哈希算法了。
舉個例子(仍以請求中的參數username做爲hash key):
upstream upstream-service {
hash user_$arg_username consistent;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}複製代碼
以上就是Nginx中比較常見的負載均衡方法了,還有一些好比最少鏈接算法
等,都是在此之上的一些應用。若是你們有什麼疑問,歡迎在下方留言。
有興趣的話能夠訪問個人博客或者關注個人公衆號、頭條號,說不定會有意外的驚喜。