原理
負載均衡的目的是為了解決單個節點壓力過大,造成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;
}