Nginx的負載均衡

咱們都知道,Nginx支持負載均衡,能夠很方便的幫助咱們進行水平擴容,然而它到底是依據什麼原則進行請求的分發,其中又有哪些負載均衡算法可供選擇和配置,今天就讓咱們好好來了解一下。 git

負載均衡的定義

什麼叫負載均衡,咱們能夠參考一下圖片中的這種狀況:github

  1. 當客戶端發送請求時,會先到Nginx,而後Nginx會將請求分發到後臺不一樣的服務器上。
  2. 若是後臺的服務器羣中有一個宕機了,那麼Nginx會自動忽略這臺服務器,不會將請求再次分發到這臺服務器上。
  3. 若是有新加入的服務器,Nginx也會將請求分發到這臺服務器上。

我所理解的負載均衡,就是:算法

可以將客戶端的請求均勻地分發到後臺各個應用服務器上,從而緩解服務器壓力。後端

而且當服務器出現宕機或者擴容時,也能正常運行。服務器

負載均衡的方法

上面瞭解了什麼是負載均衡,那麼Nginx是怎麼實現這個功能的呢?cookie

upstream和server的使用

Nginx中負責與上游交互的模塊,統稱爲upstream模塊。併發

而指定上游服務地址是經過upstreamserver指令完成的,其關係爲:負載均衡

指定上游服務器的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;
    }複製代碼

round-robin

upstream這個模塊中,它還提供了一個最基本的負載均衡算法round-robin

其功能是:

以加權輪詢的方式訪問server指令指定的上游服務。

這個算法是默認集成在Nginx的框架中,沒法移除,因此後面講解的全部算法都是基於此,全部算法在某些特殊狀況下最終都會變成round-robin

涉及到的指令有:

  1. weight:服務訪問的權重,默認是1。
  2. max_conns:server的最大併發鏈接數,僅做用於單worker進程。
  3. max_fails:在fail_timeout時間內,最大的失敗次數。當達到最大失敗時,會在fail_timeout時間內不容許再次被選擇。
  4. fail_timeout:單位爲秒,默認是10秒。指定一段時間內,最大的失敗次數max_fails。到達max_fails後,該server不能訪問的時間。

簡單的hash模塊

有的時候,正常的輪詢算法並不能知足咱們的需求,

好比:帶有cookie請求狀態的鏈接,若是應用服務沒有設置專門的管理cookie的服務器,那麼咱們就但願同一個用戶能被分配到同一個服務器。

再好比:咱們後端應用須要針對請求當中的參數或者URL,將相同的請求放到相同的服務器上進行處理。

針對第一種狀況,就能夠用upstream_ip_hash。針對第二種狀況,可使用upstream_hash

upstreamiphash

功能:

以客戶端的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;
    }複製代碼

upstream_hash

功能:

經過制定關鍵字做爲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中比較常見的負載均衡方法了,還有一些好比最少鏈接算法等,都是在此之上的一些應用。若是你們有什麼疑問,歡迎在下方留言。

有興趣的話能夠訪問個人博客或者關注個人公衆號、頭條號,說不定會有意外的驚喜。

death00.github.io/

相關文章
相關標籤/搜索