1. 程式人生 > >小白學習NGINX負載均衡的筆記

小白學習NGINX負載均衡的筆記

目錄

引言

模組安裝

1.下載NGINX穩定發行版: 

2.解壓並切換到安裝目錄:

3.編譯安裝  &  各種依賴安裝:

4.修改配置檔案

5.檢測語法 & 開啟服務:

配置示例:

1、輪詢(weight=1)  

2、weight

3、ip_hash

4、fair(第三方外掛)

5、url_hash(第三方外掛)

6、綜合示例

問題和思考


 

引言

這裡說的主要是webserver方面的負載均衡的一些內容:

首先負載均衡有很多中介軟體可以實現,NGINX(反向代理的方式)、LVS、zooker等。由於lvs是整合在Linux核心之中,對作業系統高度依賴,適用性不強。而zk又過於有名,在各種服務治理之中應用廣泛。這裡就只談一談NGINX的負載均衡思路和實踐。

特別鳴謝:https://www.jianshu.com/p/5dcd1e027e17

 

模組安裝

NGINX藉助反向代理的思路實現代理轉發,負載均衡的效果。但是為了實現這個效果,需要單獨安裝Stream模組(nginx預設不安裝,且所需版本要高於1.9.0)。【ngx_stream_core_module模組工作於傳輸層,基於tcp或udp的服務連線實現所謂反向代理或排程器的能力】

安裝過程nginx官網有詳細的說明,這裡給出我的安裝示例:

1.下載NGINX穩定發行版: 

wget  https://nginx.org/download/nginx-1.12.1.tar.gz


2.解壓並切換到安裝目錄:

tar -zxvf nginx-1.12.1.tar.gz

cd nginx-1.12.1

3.編譯安裝  &  各種依賴安裝:

yum -y install gcc gcc-c++ autoconf automake

yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

 

./configure --prefix=/opt/nginx --sbin-path=/opt/nginx/sbin/nginx --conf-path=/opt/nginx/conf/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-stream

make

make install

cd /opt/nginx

4.修改配置檔案

ps :  這裡在配置檔案nginx.conf中新增的stream  配置項應該在最外層與http處於同一級別。總體感覺stream的語法與http段非常類似。

vim /opt/nginx/conf/nginx.conf(在配置檔案最後行新增如下)

    stream {

      upstream NAME1 {

        hash $remote_addr consistent;

        server 10.22.0.7:5000 max_fails=3 fail_timeout=30s;

        server 10.22.0.8:5000 max_fails=3 fail_timeout=30s;

      }

      upstream NAME2 {

        hash $remote_addr consistent;

        server 192.168.5.8:8080 max_fails=3 fail_timeout=30s;

      }

      server{

      listen 8080;

        proxy_connect_timeout 1s;

        proxy_timeout 3s;

        proxy_pass NAME1;

      }

      server{

      listen 60000;

        proxy_connect_timeout 1s;

        proxy_timeout 3s;

        proxy_pass NAME2;

      }

    }

或者

upstream masters {      #定義一個服務組

    server 127.0.0.1:8070 weight=1 max_fails=3 fail_timeout=10s;

}

server {

    server {

        listen       8090;

        server_name  _;

 

        location / {

                proxy_pass http://masters;

                proxy_connect_timeout 2s;

                proxy_read_timeout 2s;

                proxy_send_timeout 2s;

        }

}

 

 

解析:

 

如上配置檔案的含義為
將埠8080反向代理NAME1組的serverIP:PORT,最大失敗次數為3,超時時間為30秒;
將埠60000反向代理NAME2組的serverIP:PORT,最大失敗次數為3,超時時間為30秒。

同時 stream  支援5種方式的代理方式(靈活可配置,好驚喜):

1、後端響應時間短優先分配(fair)    按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

2、輪詢(weight=1)                                預設方式。

3、權重(weight不相同)                       適用於下游機器的效能不一致的情況,各個叢集的加權可以靈活變動。

4、客戶端IP進行雜湊(ip_hash)        每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session不能跨伺服器的問題。
                                                              缺點:如果後端伺服器down掉,要手工down掉。

5、根據目標網址雜湊(url_hash)      按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取伺服器時比較有效。

                                                              缺點:需要藉助第三方外掛實現

 

5.檢測語法 & 開啟服務:

每次修改配置檔案,建議重啟nginx服務

#語法檢查

/opt/nginx/sbin/nginx -t

 

 

#啟動nginx

/opt/nginx/sbin/nginx

 

 

#重啟nginx(推薦方式)

/opt/nginx/sbin/nginx -s reload

 

 

配置示例:

下面將上面的幾種配置方式做個示例配置:

1、輪詢(weight=1)  

預設選項,當weight不指定時,各伺服器weight相同,
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

upstream bakend {

    server 192.168.1.10;

    server 192.168.1.11;

}

 

2、weight


指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
如果後端伺服器down掉,能自動剔除。
比如以下配置,則1.11伺服器的訪問量為1.10伺服器的兩倍。
 

upstream bakend {

    server 192.168.1.10 weight=1;

    server 192.168.1.11 weight=2;

}

 

 

 

3、ip_hash


每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session不能跨伺服器的問題。
如果後端伺服器down掉,要手工down掉。
 

 

upstream resinserver{

    ip_hash;

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

}

 

4、fair(第三方外掛)


按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
 

upstream resinserver{

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

    fair;

}

5、url_hash(第三方外掛)


按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取伺服器時比較有效。
在upstream中加入hash語句,hash_method是使用的hash演算法。

upstream resinserver{

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

    hash $request_uri;

    hash_method crc32;

}

 

6、綜合示例

upstream tel_img_stream {

    #ip_hash;

    server 192.168.11.68:20201;

    server 192.168.11.69:20201 weight=100 down;

    server 192.168.11.70:20201 weight=100;

    server 192.168.11.71:20201 weight=100 backup;

    server 192.168.11.72:20201 weight=100 max_fails=3 fail_timeout=30s;

}

說明:
1)、down 表示當前的server暫時不參與負載
2)、weight 預設為1.weight越大,負載的權重就越大。
3)、backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
4)、上例中192.168.11.72:20201 設定最大失敗次數為 3,也就是最多進行 3 次嘗試,且超時時間為 30秒。max_fails 的預設值為 1,fail_timeout 的預設值是 10s。
注意,當upstream中只有一個 server 時,max_fails 和 fail_timeout 引數可能不會起作用。
weight\backup 不能和 ip_hash 關鍵字一起使用。

 

問題和思考

 

一個比較突出的問題就是:我們的web伺服器常使用session 快取使用者的一些資訊,當使用nginx做反向代理進行轉發請求時,同一使用者的不同時段請求會轉發給不同的機器處理。如果程式依賴session資料,而不同機器間記憶體又不共享,可能出現邏輯問題,常見的是資料不一致。網上示例解決方法:

1、使用前述的ip_hash的方法,將同一使用者(預設使用者一次請求IP不變)的每次請求都送給同一臺機器處理。    缺點:負載均衡的靈活性下降,不能保證使用者一次請求不切換IP。

2、使用cookie 替代session,將資料儲存到客戶端。                                                                                              缺點:資料安全性下降,而且這種情況不適用資料量比較大的情況。

3、使用DB ,redis  或者memcache等中介軟體儲存資料,不同機器間進行資料共享。                                             缺點:資料讀取速度受到中介軟體的效能影響。