天天看點

負載均衡 LVS 與 Nginx 對比

今天總結一下負載均衡中LVS與Nginx的差別,好幾篇博文一開始就說LVS是單向的,Nginx是雙向的,我個人認為這是不準确的,LVS三種模式中,雖然DR模式以及TUN模式隻有請求的封包經過Director,但是NAT模式,Real Server回複的封包也會經過Director Server位址重寫:

負載均衡 LVS 與 Nginx 對比

文末領:LVS & Nginx實戰教程

首先要清楚的一點是,LVS是一個四層的負載均衡器,雖然是四層,但并沒有TCP握手以及分手,隻是偷窺了IP等資訊,而Nginx是一個七層的負載均衡器,是以效率勢必比四層的LVS低很多,但是可操作性比LVS高,後面所有的讨論都是基于這個差別。

為什麼四冊比七層效率高? 四層是TCP層,使用IP+端口四元組的方式。隻是修改下IP位址,然後轉發給後端伺服器,TCP三向交握是直接和後端連接配接的。隻不過在後端機器上看到的都是與代理機的IP的established而已,LVS中沒有握手。 7層代理則必須要先和代理機三次握手後,才能得到7層(HTT層)的具體内容,然後再轉發。意思就是代理機必須要與client和後端的機器都要建立連接配接。顯然性能不行,但勝在于七層,人工可操作性高,能寫更多的轉發規則。

Nginx特點

Nginx 專為性能優化而開發,性能是其最重要的要求,十分注重效率,有報告 Nginx 能支援高達 50000 個并發連接配接數。

正向代理與反向代理

正向代理:區域網路中的電腦使用者想要直接通路伺服器是不可行的,伺服器可能Hold不住,隻能通過代理伺服器來通路,這種代理服務就被稱為正向代理,特點是用戶端知道自己通路的是代理伺服器。

反向代理:用戶端無法感覺代理,因為用戶端通路網絡不需要配置,隻要把請求發送到反向代理伺服器,由反向代理伺服器去選擇目标伺服器擷取資料,然後再傳回到用戶端。

此時反向代理伺服器和目标伺服器對外就是一個伺服器,暴露的是代理伺服器位址,隐藏了真實伺服器 IP 位址。

負載均衡 LVS 與 Nginx 對比

負載均衡

用戶端發送多個請求到伺服器,伺服器處理請求,有一些可能要與資料庫進行互動,伺服器處理完畢之後,再将結果傳回給用戶端。

普通請求和響應過程如下圖:

負載均衡 LVS 與 Nginx 對比

但是随着資訊數量增長,通路量和資料量增長,單台的Server以及Database就成了系統的瓶頸,這種架構無法滿足日益增長的需求,這時候要麼提升單機的性能,要麼增加伺服器的數量。

關于提升性能,這兒就不贅述,提提如何增加伺服器的數量,建構叢集,将請求分發到各個伺服器上,将原來請求集中到單個伺服器的情況改為請求分發到多個伺服器,也就是我們說的負載均衡。

圖解負載均衡:

關于伺服器如何拆分組建叢集,參考:Redis叢集拆分原則之AKF,這兒主要講講負載均衡,也就是圖上的Proxy,可以是LVS,也可以是Nginx。假設有 15 個請求發送到代理伺服器,那麼由代理伺服器根據伺服器數量(請求具體配置設定政策,可以參考LVS負載均衡理論以及算法概要後面的負載均衡排程算法),這兒假如是平均配置設定,那麼每個伺服器處理 5 個請求,這個過程就叫做負載均衡。

動靜分離

為了加快網站的解析速度,可以把動态頁面和靜态頁面交給不同的伺服器來解析,加快解析的速度,降低由單個伺服器的壓力。

動靜分離之前的狀态

負載均衡 LVS 與 Nginx 對比

動靜分離之後

負載均衡 LVS 與 Nginx 對比

光看兩張圖可能有人不了解這樣做的意義是什麼,我們在進行資料請求時,以淘寶購物為例,商品詳情頁有很多東西是動态的,随着登入人員的不同而改變,例如使用者ID,使用者頭像,但是有些内容是靜态的,例如商品詳情頁,那麼我們可以通過CDN(全局負載均衡與CDN内容分發)将靜态資源部署在使用者較近的伺服器中,使用者資料資訊安全性要更高,可以放在某處集中,這樣相對于将說有資料放在一起,能分擔主伺服器的壓力,也能加速商品詳情頁等内容傳輸速度。

Nginx的優勢

可操作性大

Nginx是一個應用層的程式,是以使用者可操作性的空間大得多,可以作為網頁靜态伺服器,支援 Rewrite 重寫規則;支援 GZIP 壓縮,節省帶寬;可以做緩存;可以針對 http 應用本身來做分流政策,靜态分離,針對域名、目錄結構等相比之下 LVS 并不具備這樣的功能,是以 nginx 單憑這點可以利用的場合就遠多于 LVS 了;但 nginx 有用的這些功能使其可調整度要高于 LVS,是以經常要去觸碰,人為出現問題的幾率也就大

網絡依賴小

nginx 對網絡的依賴較小,理論上隻要 ping 得通,網頁通路正常,nginx 就能連得通,nginx 同時還能區分内外網,如果是同時擁有内外網的節點,就相當于單機擁有了備份線路;LVS 就比較依賴于網絡環境,目前來看伺服器在同一網段内并且 LVS 使用 direct 方式分流,效果較能得到保證。另外注意,LVS 需要向托管商至少申請多于一個 ip 來做 visual ip

安裝簡單

nginx 安裝和配置比較簡單,測試起來也很友善,因為它基本能把錯誤用日志列印出來。LVS 的安裝和配置、測試就要花比較長的時間,因為同上所述,LVS 對網絡依賴性比較大,很多時候不能配置成功都是因為網絡問題而不是配置問題,出了問題要解決也相應的會麻煩的多

nginx 也同樣能承受很高負載且穩定,但負載度和穩定度差 LVS 還有幾個等級:nginx 處理所有流量是以受限于機器 IO 和配置;本身的 bug 也還是難以避免的;nginx 沒有現成的雙機熱備方案,是以跑在單機上還是風險比較大,單機上的事情全都很難說

支援健康檢查以及請求重發

nginx 可以檢測到伺服器内部的故障(健康檢查),比如根據伺服器處理網頁傳回的狀态碼、逾時等等,并且會把傳回錯誤的請求重新送出到另一個節點。目前 LVS 中 ldirectd 也能支援針對伺服器内部的情況來監控,但 LVS 的原理使其不能重發請求。比如使用者正在上傳一個檔案,而處理該上傳的節點剛好在上傳過程中出現故障,nginx 會把上傳切到另一台伺服器重新處理,而 LVS 就直接斷掉了

LVS 的優勢

抗負載能力強

因為 LVS 工作方式的邏輯是非常簡單的,而且工作在網絡的第 4 層,僅作請求分發用,沒有流量,是以在效率上基本不需要太過考慮。LVS 一般很少出現故障,即使出現故障一般也是其他地方(如記憶體、CPU 等)出現問題導緻 LVS 出現問題

配置性低

這通常是一大劣勢同時也是一大優勢,因為沒有太多的可配置的選項,是以除了增減伺服器,并不需要經常去觸碰它,大大減少了人為出錯的幾率

工作穩定

因為其本身抗負載能力很強,是以穩定性高也是順理成章的事,另外各種 LVS 都有完整的雙機熱備方案,是以一點不用擔心均衡器本身會出什麼問題,節點出現故障的話,LVS 會自動判别,是以系統整體是非常穩定的

無流量

LVS 僅僅分發請求,而流量并不從它本身出去,是以可以利用它這點來做一些線路分流之用。沒有流量同時也保住了均衡器的 IO 性能不會受到大流量的影響

LVS 基本上能支援所有應用,因為 LVS 工作在第 4 層,是以它可以對幾乎所有應用做負載均衡,包括 http、資料庫、聊天室等

負載均衡 LVS 與 Nginx 對比
負載均衡 LVS 與 Nginx 對比

繼續閱讀