天天看點

Nginx負載均衡配置與負載政策

原理

負載均衡的目的是為了解決單個節點壓力過大,造成Web服務響應過慢,嚴重的情況下導緻服務癱瘓,無法正常提供服務。

應用場景

春節期間在12306網站上買過火車票的朋友應該深有體會,有時查詢一張火車票都會很慢,甚至整個網頁都卡住不動了。通常一個通路量非常大的Web網站(比如:淘寶、京東、12306等),由于一個Web服務同時能處理的使用者并發請求的數量有限,同時還有機器故障的情況,是以一個Web站點通常會在N台機器上各部署一套同樣的程式。當某一個服務挂掉的時候,還有第二個、第三個、第N個服務。。。繼續為使用者提供服務,給使用者的感覺,你的服務還在正常的運作!在這些提供同樣服務的機器當中,在硬體配置方面也各不一樣,這樣就會存在部份機器性能非常好,能快速計算并響應使用者的請求,另外一部份機器可能配置差點,響應使用者的請求的時間會長一些。

這就需要我們思考一個問題?如果有一個服務正在同時處理1000個使用者的請求,這個服務的上限可能最多能同時處理1000個使用者的請求,這時它已經很忙了,如果此時又有一個新請求過來,我們仍然把這個請求配置設定給這台機器,這時候這個請求就隻能在幹等着,等這個服務處理完那些請求後,再繼續處理它。這樣在浏覽器中的反應就像12306我們在春節買票一樣,卡在那不動了,讓使用者眼巴巴的幹着急。而能提供同樣服務的其它機器,這時确很空閑。這樣不僅是對伺服器資源的浪費,也充分發揮不出弄多台伺服器裝同一個服務的最高價值。

我們通常稱對某一台機器的通路量稱為負載量,如何将一個使用者的請求,合理的配置設定到一台能快速響應使用者請求的伺服器上,我們就需要用到一些負載政策。也就展現出了文章主題的用意了:

負載均衡,将使用者的所有HTTP請求均衡的配置設定到每一台機器上,充分發揮所有機器的性能,提高服務的品質和使用者體驗。

負載均衡可以通過負載均衡網絡硬體裝置和Web伺服器軟體來實作,前者裝置成本較高,小公司通常負擔不起,是以後者一般是我們的首選。

實作負載均衡常用的Web伺服器軟體有Nginx、HAProxy、LVS、Apache,本文主要介紹Nginx的負載均衡政策

一、内置負載政策

Nginx負載均衡是通過upstream子產品來實作的,内置實作了三種負載政策,配置還是比較簡單的。

  • 輪循(預設) 

Nginx根據請求次數,将每個請求均勻配置設定到每台伺服器

  • 最少連接配接 

将請求配置設定給連接配接數最少的伺服器。Nginx會統計哪些伺服器的連接配接數最少。

  • IP Hash 

綁定處理請求的伺服器。第一次請求時,根據該用戶端的IP算出一個HASH值,将請求配置設定到叢集中的某一台伺服器上。後面該用戶端的所有請求,都将通過HASH算法,找到之前處理這台用戶端請求的伺服器,然後将請求交給它來處理。

輪循

http {

    # ... 省略其它配置

    upstream tomcats {
        server 192.168.0.100:8080;
        server 192.168.0.101:8080;
        server example.com:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://tomcats;
        }
    }

    # ... 省略其它配置
}      
  • proxy_pass http://tomcats:表示将所有請求轉發到tomcats伺服器組中配置的某一台伺服器上。
  • upstream子產品:配置反向代理伺服器組,Nginx會根據配置,将請求分發給組裡的某一台伺服器。tomcats是伺服器組的名稱。
  • upstream子產品下的server指令:配置處理請求的伺服器IP或域名,端口可選,不配置預設使用80端口。通過上面的配置,Nginx預設将請求依次配置設定給100,101,102來處理,可以通過修改下面這些參數來改變預設的配置設定政策:
  • weight 

      預設為1,将請求平均配置設定給每台server

upstream tomcats {
    server 192.168.0.100:8080 weight=2;  # 2/6次
    server 192.168.0.101:8080 weight=3;  # 3/6次
    server 192.168.0.102:8080 weight=1;  # 1/6次
}      

上例配置,表示6次請求中,100配置設定2次,101配置設定3次,102配置設定1次

  • max_fails 

預設為1。某台Server允許請求失敗的次數,超過最大次數後,在fail_timeout時間内,新的請求将不會配置設定給這台機器。如果設定為0,Nginx會将這台Server置為永久無效狀态,然後将請求發給定義了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令來處理這次錯誤的請求。

  • fail_timeout 

預設為10秒。某台Server達到max_fails次失敗請求後,在fail_timeout期間内,nginx會認為這台Server暫時不可用,不會将請求配置設定給它

upstream tomcats {
    server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    server 192.168.0.101:8080 weight=3;
    server 192.168.0.102:8080 weight=1;
}      

192.168.0.100這台機器,如果有3次請求失敗,nginx在15秒内,不會将新的請求配置設定給它。

  • backup 

    備份機,所有伺服器挂了之後才會生效

upstream tomcats {
    server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    server 192.168.0.101:8080 weight=3;

    server 192.168.0.102:8080 backup;
}      

在100和101都挂了之前,102為不可用狀态,不會将請求配置設定給它。隻有當100和101都挂了,102才會被啟用。

  • down 

    辨別某一台server不可用。可能能通過某些參數動态的激活它吧,要不真沒啥用。

upstream tomcats {
    server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;

    server 192.168.0.101:8080 down;

    server 192.168.0.102:8080 backup;
}      

表示101這台Server為無效狀态,不會将請求配置設定給它。

  • max_conns 

    限制配置設定給某台Server處理的最大連接配接數量,超過這個數量,将不會配置設定新的連接配接給它。預設為0,表示不限制。注意:1.5.9之後的版本才有這個配置

upstream tomcats {
    server 192.168.0.100:8080 max_conns=1000;
}      

表示最多給100這台Server配置設定1000個請求,如果這台Server正在處理1000個請求,nginx将不會配置設定新的請求給到它。假如有一個請求處理完了,還剩下999個請求在處理,這時nginx也會将新的請求配置設定給它。

  • resolve 

将server指令配置的域名,指定域名解析伺服器。需要在http子產品下配置resolver指令,指定域名解析服務

http {
    resolver 10.0.0.1;

    upstream u {
        zone ...;
        ...
        server example.com resolve;
    }
}      

表示example.com域名,由10.0.0.1伺服器來負責解析。 

二、第三方負載政策

1  fair

根據伺服器的響應時間來配置設定請求,響應時間短的優先配置設定,即負載壓力小的優先會配置設定。

由于fair子產品是第三方提供的,是以在編譯nginx源碼的時候,需要将fair添加到nginx子產品中。

假設我的nginx是通過源碼安裝的,安裝在/opt/nginx目錄下,而且安裝時沒有添加fair子產品
           

1> 下載下傳fair子產品源碼 

下載下傳位址:https://github.com/xyang0917/nginx-upstream-fair

cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip      

解壓後的目錄名為:nginx-upstream-fair-master

2> 重新編譯nginx,将fair子產品添加到編譯參數 

我的nginx源碼目錄在/opt/nginx-1.10.0

cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make      

注意:不要執行make install,這樣會覆寫之前nginx的配置 

3> 将新編譯的nginx可執行程式拷貝到/opt/nginx/sbin/目錄下,覆寫之前安裝的nginx 

編譯後的nginx執行程式,放在nginx源碼的objs目錄下

ps -aux | grep nginx
kill -9 nginx程序ID  # 停止nginx服務
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/  # 覆寫舊的nginx
nginx # 啟動服務      

配置使用fair負載政策子產品:

upstream tomcats {
    fair;
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}      

由于采用fair負載政策,配置weigth參數改變負載權重将無效。

2> url_hash

按請求url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,伺服器做緩存時比較有效。

1.7.2版本以後,url_hash子產品已經內建到了nginx源碼當中,不需要單獨安裝。之前的版本仍需要單獨安裝,下載下傳位址:https://github.com/evanmiller/nginx_upstream_hash 

安裝方法和fair子產品一樣,先下載下傳url_hash源碼,然後重新編譯nginx源碼,将url_hash子產品添加到編譯配置參數當中,最後将編譯後生成的nginx二進制檔案替換之前安裝的nginx二進制檔案即可。

upstream tomcats {
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
    hash $request_uri;
}