1. 程式人生 > >lvs、nginx、haproxy中轉模式總結

lvs、nginx、haproxy中轉模式總結

lvs、nginx、haproxy是最常見的三種高可用性負載均衡軟體。由於lvs和haproxy在目前的公司的現網環境中並未用到,雖然之前簡單的瞭解和搭建過,現在也已經忘的差不多了,而及於nginx的負載均衡雖然公司在用,不過一配置檔案都是ctrl+c、ctrl+v,對轉發的理論性的東西也都忘的差不多了。隱約腦子裡現在只有upstream、dr 、ip_hash這幾個詞了。現對三者的轉發方式做下總結。

一、LVS轉發模式

LVS是章文嵩博士寫的一個工作於四層的高可能性軟體。不像後兩者支援七層轉發,不過也正因為其簡單,所以其是最穩定的。其共有三種IP負載均衡技術:VS/NAT(Virtual Server via Network Address Translation)、VS/TUN(Virtual Server via IP Tunneling)和VS/DR(Direct Routing),三者之間具體的比較見下表

lvs

二、nginx負載模式

nginx有五種負載演算法模式,分別是:輪詢、weight(權重)、ip_hash、fair、url_hash 。現逐一說明:

  1. 輪詢(預設): 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
  2. weight :指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。配置為:
    1. upstream bakend {
    2. server 192.168.0.14 weight=10;
    3. server 192.168.0.15 weight=10;
    4. }
  3. ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。配置為:
    1. upstream bakend 
      {
    2. ip_hash;
    3. server 192.168.0.14:88;
    4. server 192.168.0.15:80;
    5. }
  4. fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
    1. upstream backend {
    2. server server1;
    3. server server2;
    4. fair;
    5. }
  5. url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。配置如:
    1. upstream backend {
    2. server squid1:3128;
    3. server squid2:3128;
    4. hash $request_uri;
    5. hash_method crc32
      ;
    6. }

注:第五種模式下,需要注意在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法 。

server後面常接的引數有如下幾個:

  • down 表示單前的server暫時不參與負載 
  • weight 預設為1.weight越大,負載的權重就越大。 
  • max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤 
  • fail_timeout:max_fails次失敗後,暫停的時間。 
  • backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

三、haproxy

haproxy是三者之間負載演算法最多的,有八種,所以其應用場景也是最多,配置也是最靈活的,具體8種演算法為:

①roundrobin,表示簡單的輪詢,這個是負載均衡基本都具備的; 

②static-rr,表示根據權重,和nginx的weight演算法類似; 

③leastconn,表示最少連線者先處理,有點類似於nginx的fair,不過fair是根據響應時間; 

④source,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法,建議關注; 

⑤ri,表示根據請求的URI,類似於nginx的url_hash; 

⑥rl_param,表示根據請求的URl引數'balance url_param' requires an URL parameter name; 

⑦hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求; 

⑧rdp-cookie(name),表示根據據cookie(name)來鎖定並雜湊每一次TCP請求。

四、總結

具體現網應用可以根據據體的實際情況選擇最好的負載方式。三者中,lvs穩定性最好,可配置性最少;nginx針對域名、目錄結構進行正則匹配是最強的,同時其對網路依賴比較小,不過效能上和lvs和haproxy相比稍差一點點;haproxy支援虛擬主機,尤其在session保持方面做的最好,其有三種演算法可以實現session共享———— ip識別(source)、cookie識別、session識別三種,除此之外在對mysql做HA方案時也經常會用到該軟體。