在關于高并發負載均衡一文中已經提到,企業在解決高并發問題時,一般有兩個方向的處理政策,軟體、硬體,硬體上添加負載均衡器分發大量請求,軟體上可在高并發瓶頸處:資料庫+web伺服器兩處添加解決方案,其中web伺服器前面一層最常用的的添加負載方案就是使用nginx實作負載均衡。
一、負載均衡的作用
1、轉發功能
按照一定的算法【權重、輪詢】,将用戶端請求轉發到不同應用伺服器上,減輕單個伺服器壓力,提高系統并發量。
2、故障移除
通過心跳檢測的方式,判斷應用伺服器目前是否可以正常工作,如果伺服器期宕掉,自動将請求發送到其他應用伺服器。
3、恢複添加
如檢測到發生故障的應用伺服器恢複工作,自動将其添加到處理使用者請求隊伍中。

二、Nginx實作負載均衡
同樣使用兩個tomcat模拟兩台應用伺服器,端口号分别為8080 和8081
1、Nginx的負載分發政策
Nginx 的 upstream目前支援的配置設定算法:
1)、輪詢 ——1:1 輪流處理請求(預設)
每個請求按時間順序逐一配置設定到不同的應用伺服器,如果應用伺服器down掉,自動剔除,剩下的繼續輪詢。
2)、權重 ——you can you up
通過配置權重,指定輪詢幾率,權重和通路比率成正比,用于應用伺服器性能不均的情況。
3)、ip_雜湊演算法
每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個應用伺服器,可以解決session共享的問題。
2、配置Nginx的負載均衡與分發政策
通過在upstream參數中添加的應用伺服器IP後添加指定參數即可實作,如:
upstream tomcatserver1 {
server 192.168.72.49:8080 weight=3;
server 192.168.72.49:8081;
}
server {
listen 80;
server_name 8080.max.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver1;
index index.html index.htm;
}
}
通過以上配置,便可以實作,在通路8080.max.com這個網站時,由于配置了proxy_pass位址,所有請求都會先通過nginx反向代理伺服器,在伺服器将請求轉發給目的主機時,讀取upstream為 tomcatsever1的位址,讀取分發政策,配置tomcat1權重為3,是以nginx會将大部分請求發送給49伺服器上的tomcat1,也就是8080端口;較少部分給tomcat2來實作有條件的負載均衡,當然這個條件就是伺服器1、2的硬體指數處理請求能力。
3、nginx其他配置
upstream myServer {
server 192.168.72.49:9090 down;
server 192.168.72.49:8080 weight=2;
server 192.168.72.49:6060;
server 192.168.72.49:7070 backup;
}
1)down
表示單前的server暫時不參與負載
2)Weight
預設為1.weight越大,負載的權重就越大。
3)max_fails
允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤
4)fail_timeout
max_fails 次失敗後,暫停的時間。
5)Backup
其它所有的非backup機器down或者忙的時候,請求backup機器。是以這台機器壓力會最輕。
三、使用Nginx的高可用
除了要實作網站的高可用,也就是提供n多台伺服器用于釋出相同的服務,添加負載均衡伺服器分發請求以保證在高并發下各台伺服器能相對飽和的處理請求。同樣,負載均衡伺服器也需要高可用,以防如果負載均衡伺服器挂掉了,後面的應用伺服器也紊亂無法工作。
實作高可用的方案:添加備援。添加n台nginx伺服器以避免發生上述單點故障。具體方案詳見下文:keepalive+nginx實作負載均衡高可用
四、總結
總結一點,負載均衡不論是各種軟體或硬體上的解決方案,主要還是将大量的并發請求按照一定的規律分發給不同的伺服器處理,進而減少某台伺服器的瞬時壓力,提高網站的抗并發能力。nginx在負載均衡的應用之是以廣泛,筆者認為這歸功于它的靈活配置,一個nginx.conf檔案解決大部分問題,不論是nignx建立虛拟伺服器、nginx的反向代理伺服器,還是本文介紹的nginx的負載均衡,幾乎都在這個配置檔案中進行。伺服器上隻負責把nginx搭好,跑起來即可。而且它本身輕量級,不需要占用伺服器太多資源就可以達到較好的效果,膩害。
【當你用心寫完每一篇部落格之後,你會發現它比你用代碼實作功能更有成就感!】