文章目錄
-
- 一、什麼是負載均衡
- 二、 負載均衡政策
-
- 1、輪詢(預設)
- 2、權重 weight
- 3、ip_hash( IP綁定)
- 4、fair(第三方插件)
- 5、url_hash(第三方插件)
- 三、負載均衡配置的狀态參數
- 四、配置執行個體:
一、什麼是負載均衡
當一台伺服器的機關時間内的通路量越大時,伺服器壓力就越大,大到超過自身承受能力時,伺服器就會崩潰。為了避免伺服器崩潰,讓使用者有更好的體驗,我們通過負載均衡的方式來分擔伺服器壓力。
我們可以建立很多很多伺服器,組成一個伺服器叢集,當使用者通路網站時,先通路一個中間伺服器,在讓這個中間伺服器在伺服器叢集中選擇一個壓力較小的伺服器,然後将該通路請求引入該伺服器。
如此以來,使用者的每次通路,都會保證伺服器叢集中的每個伺服器壓力趨于平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。
負載均衡是用反向代理的原理實作的。
二、 負載均衡政策
1、輪詢(預設)
每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、權重 weight
指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的 。
情況。
upstream backserver {
server 192.168.0.14 weight=3;
server 192.168.0.15 weight=7;
}
權重越高,在被通路的機率越大,如上例,分别是30%,70%。
3、ip_hash( IP綁定)
上述方式存在一個問題就是說,在負載均衡系統中,假如使用者在某台伺服器上登入了,那麼該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的某一個,那麼已經登入某一個伺服器的使用者再重新定位到另一個伺服器,其登入資訊将會丢失,這樣顯然是不妥的。
我們可以采用ip_hash指令解決這個問題,如果客戶已經通路了某個伺服器,當使用者再次通路時,會将該請求通過雜湊演算法,自動定位到該伺服器。
每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、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 執行檔案
新編譯後的 nginx 執行程式,放在nginx源碼的
objs
目錄下, 将
objs
目錄下新編譯的 nginx 可執行程式拷貝到
/opt/nginx/sbin/
目錄下,覆寫之前安裝的nginx 。
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 參數改變負載權重将無效。
5、url_hash(第三方插件)
按通路url的hash結果來配置設定請求,使每個url定向 。
到同一個後端伺服器,後端伺服器為緩存時比較有效。
upstream backserver {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
hash $request_uri;
hash_method crc32;
}
場景:如果現在我們的電商項目出現了一個爆品,那個通路這個爆品的請求會增多。
若此時使用 url hash ,那麼請求會壓到同一台伺服器上,這樣顯然是不合理的。
nginx 1.7.2 版本以後,url_hash 子產品已經內建到了 nginx 源碼當中,不需要單獨安裝。之前的版本仍需要單獨安裝,下載下傳位址:https://github.com/evanmiller/nginx_upstream_hash 。
安裝方法和 fair 子產品一樣,先下載下傳url_hash源碼,然後重新編譯nginx源碼,将url_hash子產品添加到編譯配置參數當中,最後将編譯後生成的
nginx 二進制檔案
替換之前安裝的
nginx
二進制檔案即可。
三、負載均衡配置的狀态參數
-
: 表示下線,此 server 暫時不參與負載down
-
:預設為1。 weight越大,負載的權重就越大。weight
-
:允許請求失敗的次數預設為1 。當超過最大次數時,傳回 proxy_next_upstream 子產品定義的錯誤max_fails
-
:在經曆了max_fails次失敗後,暫停服務的時間。 max_fails可以和 fail_timeout一起使用。fail_timeout
-
: 預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,是以這台機器的壓力最輕。backup
四、配置執行個體:
#user nobody;
worker_processes 4;
events {
# 最大并發數
worker_connections 1024;
}
http{
# 待選伺服器清單
upstream myproject{
# ip_hash指令,将同一使用者引入同一伺服器。
ip_hash;
server 125.219.42.4 fail_timeout=60s;
server 172.31.2.183;
}
server{
# 監聽端口
listen 80;
# 根目錄下
location / {
# 選擇哪個伺服器清單
proxy_pass http://myproject;
}
}
}