負載均衡之 LVS 與 Nginx 對比

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

對這三種模式有不瞭解的可以參考我之前的文章:LVS 服務 DR 模式安裝佈署過程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 就成了系統的瓶頸, 這種架構無法滿足日益增長的需求, 這時候要麼提升單機的性能, 要麼增加服務器的數量。

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

圖解負載均衡:

這兒主要講講負載均衡, 也就是圖上的 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、數據庫、聊天室等。

_作者:等不到的口琴 _

鏈接:cnblogs.com/Courage129/p/14383897.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GNs7u8vDhcu0PNrco2a5SA