Nginx http_upstream_module 負載均衡策略

負載均衡


負載均衡的實現方法就是我們上篇博客介紹的反向代理 。將客戶的請求通過 nginx 分發(反向代理)到一組多臺不同的服務器上

這一組服務器我們稱爲 服務池(upstream server),池內的每一個服務器稱爲一個 單元,服務池內將對每一個單元進行請求輪訓,實現負載均衡。

 

 

負載均衡目的


當我們的服務是由一臺服務器支撐時,就絲毫不存在負載均衡的概念。只有當服務由多臺服務器(也就是服務器集羣)支撐時,纔會使用到負載均衡。

負載均衡顧名思義,是一種策略,用於防止一臺服務器過載,而其他服務器閒置情況發生的策略。通過該策略可以使得提供相同服務的服務器負載基本相同。說得直白一點,就是當客戶端發起一個請求之後,負載均衡會通過預先設定好的策略將該請求轉發給上游的一臺服務器進行處理。

如圖所示:

負載均衡是一個很成熟的技術,其中對後端服務器進行輪詢(默認);通過客戶端請求IP進行hash;對後端服務器指定權重等,是較爲常見的負載均衡策略。

七層負載均衡是工作在七層協議的第七層-應用層,主要工作是代理。它首先會與客戶端建立一條完整的連接並將應用層的請求流量解析出來,再按照調度算法選擇一個應用服務器,並與應用服務器建立另外一條連接將請求發送過去。均衡是依賴於反向代理的,反代不一定依賴於均衡,反向代理是可以獨立的

 

七層負載均衡配置語法


語法:upstream name ...
默認:——
位置:http

upstream #自定義組名 {
    server x1.baidu.com;    #可以是域名
    server x2.baidu.com;
    #server x3.baidu.com
                            #down         不參與負載均衡
                            #weight=5;    權重,越高分配越多
                            #backup;      預留的備份服務器
                            #max_fails    允許失敗的次數
                            #fail_timeout 超過失敗次數後,服務暫停時間
                            #max_coons    限制最大的接受的連接數
                            #根據服務器性能不同,配置適合的參數

    #server 106.xx.xx.xxx;        可以是ip
    #server 106.xx.xx.xxx:8080;   可以帶端口號
    #server unix:/tmp/xxx;        支出socket方式
}

配置七層均衡:upstream只能配置在http指令塊裏面

前端服務器:192.168.179.99

後端服務器1:192.168.179.100

後端服務器2:192.168.179.101

這裏後端服務器也可以通過配置虛擬主機實現。

 

前端服務器主要配置upstream和proxy_pass:

upstream 主要是配置均衡池和調度方法。

proxy_pass 主要是配置代理服務器ip或服務器組的名字。

proxy_set_header 主要是配置轉發給後端服務器的Host和前端客戶端真實ip。

 

均衡方式


  • 輪訓:按時間順序逐一分配到不同的後端服務器

  • 加權輪訓:weight值越大,分配到的機率越高

  • ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP固定訪問一個後端服務器

  • least_conn:最少鏈接數,哪個機器連接數少就分發給誰

  • url_hash:按照訪問的URL的hash結果來分配請求,每一個URL定向到同一個後端服務器

  • hash關鍵數值:hash自定義key


(1)輪詢 

代理服務器和後端服務器配置 

前端服務器:192.168.179.99配置
server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        root /data/www/test;
        location / {
        proxy_pass http://web;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_next_upstream error http_404 http_502;
      }
    }

proxy_next_upstream error http_404 http_502:通過這個指令,可以處理當後端服務返回404等報錯時,直接將請求轉發給其他服務器,而不是把報錯信息返回客戶端。

proxy_set_header Host $host:通過這個指令,把客戶端請求的host,轉發給後端。

proxy_set_header X-Real-IP $remote_addr:通過這個指令,把客戶端的IP轉發給後端服務器,在後端服務器的日誌格式中,添加$http_x_real_ip即可獲取原始客戶端的IP了


後端服務器
192.168.179.100
[root@www ~]# echo "proxy this is 192.168.179.100 page" >  /usr/local/nginx/html/index.html

192.168.179.101 
[root@www ~]# echo "proxy this is 192.168.179.101 page" >  /usr/local/nginx/html/index.html 

客戶端去訪問

客戶端去訪問代理服務器192.168.179.99,可以看到都可以訪問到後端服務器上面資源
這裏是使用輪詢的方式訪問,即192.168.179.100訪問一次然後192.168.179.100訪問一次,以此類推方式進行後端服務器上資源訪問(可以看到後端服務器,非常平均的處理請求)

[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.100 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.101 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.100 page
[root@localhost ~]# curl 192.168.179.99
proxy this is 192.168.179.101 page

(2)輪詢加權重

如果192.168.179.100服務器的比192.168.179.101的性能好上很多,那麼就可以使用輪詢加重的方式

前端服務器:192.168.179.99配置,這裏和上面一樣只不過修改了權重

 來四個請求,192.168.179.100處理其中三個,剩下的一個交個192.168.179.101
upstream web{ 
server 192.168.179.100 weight=3;
server 192.168.179.101 weight=1;
}

[root@localhost ~]# while true;do curl 192.168.179.99;sleep 1;done  -- --客戶端每隔兩秒去代理服務器上拿後端資源
proxy this is 192.168.179.101 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.100 page
proxy this is 192.168.179.101 page
proxy this is 192.168.179.100 page

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章