小白學習NGINX負載均衡的筆記
目錄
引言
這裡說的主要是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穩定發行版:
|
2.解壓並切換到安裝目錄:
|
3.編譯安裝 & 各種依賴安裝:
|
4.修改配置檔案
ps : 這裡在配置檔案nginx.conf中新增的stream 配置項應該在最外層與http處於同一級別。總體感覺stream的語法與http段非常類似。
|
或者
|
解析:
如上配置檔案的含義為
將埠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服務
|
配置示例:
下面將上面的幾種配置方式做個示例配置:
1、輪詢(weight=1)
預設選項,當weight不指定時,各伺服器weight相同,
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
|
2、weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
如果後端伺服器down掉,能自動剔除。
比如以下配置,則1.11伺服器的訪問量為1.10伺服器的兩倍。
|
3、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session不能跨伺服器的問題。
如果後端伺服器down掉,要手工down掉。
|
4、fair(第三方外掛)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
|
5、url_hash(第三方外掛)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取伺服器時比較有效。
在upstream中加入hash語句,hash_method是使用的hash演算法。
|
6、綜合示例
|
說明:
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等中介軟體儲存資料,不同機器間進行資料共享。 缺點:資料讀取速度受到中介軟體的效能影響。