今天總結一下負載均衡中LVS與Nginx的區別,好幾篇博文一開始就說LVS是單向的,Nginx是雙向的,我個人認為這是不準確的,LVS三種模式中,雖然DR模式以及TUN模式只有請求的報文經過Director,但是NAT模式,Real Server回覆的報文也會經過Director Server地址重寫:
對這三種模式有不瞭解的可以參考我之前的文章:
以及LVS概要文章:
首先要清楚的一點是,LVS是一個四層的負載均衡器,雖然是四層,但並沒有TCP握手以及分手,只是偷窺了IP等資訊,而Nginx是一個七層的負載均衡器,所以效率勢必比四層的LVS低很多,但是可操作性比LVS高,後面所有的討論都是基於這個區別。
為什麼四冊比七層效率高?
四層是TCP層,使用IP+埠四元組的方式。只是修改下IP地址,然後轉發給後端伺服器,TCP三次握手是直接和後端連線的。只不過在後端機器上看到的都是與代理機的IP的established而已,LVS中沒有握手。
7層代理則必須要先和代理機三次握手後,才能得到7層(HTT層)的具體內容,然後再轉發。意思就是代理機必須要與client和後端的機器都要建立連線。顯然效能不行,但勝在於七層,人工可操作性高,能寫更多的轉發規則。
Nginx特點
Nginx 專為效能優化而開發,效能是其最重要的要求,十分注重效率,有報告 Nginx 能支援高達 50000 個併發連線數。
正向代理與反向代理
正向代理:區域網中的電腦使用者想要直接訪問伺服器是不可行的,伺服器可能Hold不住,只能通過代理伺服器來訪問,這種代理服務就被稱為正向代理,特點是客戶端知道自己訪問的是代理伺服器。
反向代理:客戶端無法感知代理,因為客戶端訪問網路不需要配置,只要把請求傳送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取資料,然後再返回到客戶端。
此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器 IP 地址。
負載均衡
客戶端傳送多個請求到伺服器,伺服器處理請求,有一些可能要與資料庫進行互動,伺服器處理完畢之後,再將結果返回給客戶端。
普通請求和響應過程如下圖:
但是隨著資訊數量增長,訪問量和資料量增長,單臺的Server以及Database就成了系統的瓶頸,這種架構無法滿足日益增長的需求,這時候要麼提升單機的效能,要麼增加伺服器的數量。
關於提升效能,這兒就不贅述,提提如何增加伺服器的數量,構建叢集,將請求分發到各個伺服器上,將原來請求集中到單個伺服器的情況改為請求分發到多個伺服器,也就是我們說的負載均衡。
圖解負載均衡:
關於伺服器如何拆分組建叢集,參考:Redis叢集拆分原則之AKF,這兒主要講講負載均衡,也就是圖上的Proxy,可以是LVS,也可以是Nginx。假設有 15 個請求傳送到代理伺服器,那麼由代理伺服器根據伺服器數量(請求具體分配策略,可以參考LVS負載均衡理論以及演算法概要後面的負載均衡排程演算法),這兒假如是平均分配,那麼每個伺服器處理 5 個請求,這個過程就叫做負載均衡。
動靜分離
為了加快網站的解析速度,可以把動態頁面和靜態頁面交給不同的伺服器來解析,加快解析的速度,降低由單個伺服器的壓力。
動靜分離之前的狀態
動靜分離之後
光看兩張圖可能有人不理解這樣做的意義是什麼,我們在進行資料請求時,以淘寶購物為例,商品詳情頁有很多東西是動態的,隨著登入人員的不同而改變,例如使用者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、資料庫、聊天室等