聊聊負(fù)載均衡 LVS vs Nginx 對(duì)比
大家好,今天來聊聊負(fù)載均衡如何選擇。
Nginx特點(diǎn)
正向代理與反向代理
負(fù)載均衡
動(dòng)靜分離
Nginx的優(yōu)勢(shì)
可操作性大
網(wǎng)絡(luò)依賴小
安裝簡(jiǎn)單
支持健康檢查以及請(qǐng)求重發(fā)
LVS 的優(yōu)勢(shì)
抗負(fù)載能力強(qiáng)
配置性低
工作穩(wěn)定
無流量
今天總結(jié)一下負(fù)載均衡中LVS與Nginx的區(qū)別,好幾篇博文一開始就說LVS是單向的,Nginx是雙向的,我個(gè)人認(rèn)為這是不準(zhǔn)確的,LVS三種模式中,雖然DR模式以及TUN模式只有請(qǐng)求的報(bào)文經(jīng)過Director,但是NAT模式,Real Server回復(fù)的報(bào)文也會(huì)經(jīng)過Director Server地址重寫:

首先要清楚的一點(diǎn)是,LVS是一個(gè)四層的負(fù)載均衡器,雖然是四層,但并沒有TCP握手以及分手,只是偷窺了IP等信息,而Nginx是一個(gè)七層的負(fù)載均衡器,所以效率勢(shì)必比四層的LVS低很多,但是可操作性比LVS高,后面所有的討論都是基于這個(gè)區(qū)別。
?「為什么四層比七層效率高?」
四層是TCP層,使用IP+端口四元組的方式。只是修改下IP地址,然后轉(zhuǎn)發(fā)給后端服務(wù)器,TCP三次握手是直接和后端連接的。只不過在后端機(jī)器上看到的都是與代理機(jī)的IP的established而已,LVS中沒有握手。
7層代理則必須要先和代理機(jī)三次握手后,才能得到7層(HTT層)的具體內(nèi)容,然后再轉(zhuǎn)發(fā)。意思就是代理機(jī)必須要與client和后端的機(jī)器都要建立連接。顯然性能不行,但勝在于七層,人工可操作性高,能寫更多的轉(zhuǎn)發(fā)規(guī)則。
?
「Nginx特點(diǎn)」
Nginx 專為性能優(yōu)化而開發(fā),性能是其最重要的要求,十分注重效率,有報(bào)告 Nginx 能支持高達(dá) 50000 個(gè)并發(fā)連接數(shù)。
正向代理與反向代理
「正向代理」?:局域網(wǎng)中的電腦用戶想要直接訪問服務(wù)器是不可行的,服務(wù)器可能Hold不住,只能通過代理服務(wù)器來訪問,這種代理服務(wù)就被稱為正向代理,特點(diǎn)是客戶端知道自己訪問的是代理服務(wù)器。

「反向代理」?:客戶端無法感知代理,因?yàn)榭蛻舳嗽L問網(wǎng)絡(luò)不需要配置,只要把請(qǐng)求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù),然后再返回到客戶端。
此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實(shí)服務(wù)器 IP 地址。

負(fù)載均衡
客戶端發(fā)送多個(gè)請(qǐng)求到服務(wù)器,服務(wù)器處理請(qǐng)求,有一些可能要與數(shù)據(jù)庫進(jìn)行交互,服務(wù)器處理完畢之后,再將結(jié)果返回給客戶端。
普通請(qǐng)求和響應(yīng)過程如下圖:

但是隨著信息數(shù)量增長(zhǎng),訪問量和數(shù)據(jù)量增長(zhǎng),單臺(tái)的Server以及Database就成了系統(tǒng)的瓶頸,這種架構(gòu)無法滿足日益增長(zhǎng)的需求,這時(shí)候要么提升單機(jī)的性能,要么增加服務(wù)器的數(shù)量。
關(guān)于提升性能,這兒就不贅述,提提如何增加服務(wù)器的數(shù)量,構(gòu)建集群,將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原來請(qǐng)求集中到單個(gè)服務(wù)器的情況改為請(qǐng)求分發(fā)到多個(gè)服務(wù)器,也就是我們說的負(fù)載均衡。
圖解負(fù)載均衡:

關(guān)于服務(wù)器如何拆分組建集群,這兒主要講講負(fù)載均衡,也就是圖上的Proxy,可以是LVS,也可以是Nginx。假設(shè)有 15 個(gè)請(qǐng)求發(fā)送到代理服務(wù)器,那么由代理服務(wù)器根據(jù)服務(wù)器數(shù)量,這兒假如是平均分配,那么每個(gè)服務(wù)器處理 5 個(gè)請(qǐng)求,這個(gè)過程就叫做負(fù)載均衡。
動(dòng)靜分離
為了加快網(wǎng)站的解析速度,可以把動(dòng)態(tài)頁面和靜態(tài)頁面交給不同的服務(wù)器來解析,加快解析的速度,降低由單個(gè)服務(wù)器的壓力。
「動(dòng)靜分離之前的狀態(tài)」

「動(dòng)靜分離之后」

光看兩張圖可能有人不理解這樣做的意義是什么,我們?cè)谶M(jìn)行數(shù)據(jù)請(qǐng)求時(shí),以淘寶購物為例,商品詳情頁有很多東西是動(dòng)態(tài)的,隨著登錄人員的不同而改變,例如用戶ID,用戶頭像,但是有些內(nèi)容是靜態(tài)的,例如商品詳情頁,那么我們可以通過CDN(全局負(fù)載均衡與CDN內(nèi)容分發(fā))將靜態(tài)資源部署在用戶較近的服務(wù)器中,用戶數(shù)據(jù)信息安全性要更高,可以放在某處集中,這樣相對(duì)于將說有數(shù)據(jù)放在一起,能分擔(dān)主服務(wù)器的壓力,也能加速商品詳情頁等內(nèi)容傳輸速度。
Nginx的優(yōu)勢(shì)
可操作性大
Nginx是一個(gè)應(yīng)用層的程序,所以用戶可操作性的空間大得多,可以作為網(wǎng)頁靜態(tài)服務(wù)器,支持 Rewrite 重寫規(guī)則;支持 GZIP 壓縮,節(jié)省帶寬;可以做緩存;可以針對(duì) http 應(yīng)用本身來做分流策略,靜態(tài)分離,針對(duì)域名、目錄結(jié)構(gòu)等相比之下 LVS 并不具備這樣的功能,所以 nginx 單憑這點(diǎn)可以利用的場(chǎng)合就遠(yuǎn)多于 LVS 了;但 nginx 有用的這些功能使其可調(diào)整度要高于 LVS,所以經(jīng)常要去觸碰,人為出現(xiàn)問題的幾率也就大
網(wǎng)絡(luò)依賴小
nginx 對(duì)網(wǎng)絡(luò)的依賴較小,理論上只要 ping 得通,網(wǎng)頁訪問正常,nginx 就能連得通,nginx 同時(shí)還能區(qū)分內(nèi)外網(wǎng),如果是同時(shí)擁有內(nèi)外網(wǎng)的節(jié)點(diǎn),就相當(dāng)于單機(jī)擁有了備份線路;LVS 就比較依賴于網(wǎng)絡(luò)環(huán)境,目前來看服務(wù)器在同一網(wǎng)段內(nèi)并且 LVS 使用 direct 方式分流,效果較能得到保證。另外注意,LVS 需要向托管商至少申請(qǐng)多于一個(gè) ip 來做 visual ip
安裝簡(jiǎn)單
nginx 安裝和配置比較簡(jiǎn)單,測(cè)試起來也很方便,因?yàn)樗灸馨彦e(cuò)誤用日志打印出來。LVS 的安裝和配置、測(cè)試就要花比較長(zhǎng)的時(shí)間,因?yàn)橥纤觯琇VS 對(duì)網(wǎng)絡(luò)依賴性比較大,很多時(shí)候不能配置成功都是因?yàn)榫W(wǎng)絡(luò)問題而不是配置問題,出了問題要解決也相應(yīng)的會(huì)麻煩的多
nginx 也同樣能承受很高負(fù)載且穩(wěn)定,但負(fù)載度和穩(wěn)定度差 LVS 還有幾個(gè)等級(jí):nginx 處理所有流量所以受限于機(jī)器 IO 和配置;本身的 bug 也還是難以避免的;nginx 沒有現(xiàn)成的雙機(jī)熱備方案,所以跑在單機(jī)上還是風(fēng)險(xiǎn)比較大,單機(jī)上的事情全都很難說
支持健康檢查以及請(qǐng)求重發(fā)
nginx 可以檢測(cè)到服務(wù)器內(nèi)部的故障(健康檢查),比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn)。目前 LVS 中 ldirectd 也能支持針對(duì)服務(wù)器內(nèi)部的情況來監(jiān)控,但 LVS 的原理使其不能重發(fā)請(qǐng)求。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過程中出現(xiàn)故障,nginx 會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而 LVS 就直接斷掉了。
LVS 的優(yōu)勢(shì)
抗負(fù)載能力強(qiáng)
因?yàn)?LVS 工作方式的邏輯是非常簡(jiǎn)單的,而且工作在網(wǎng)絡(luò)的第 4 層,僅作請(qǐng)求分發(fā)用,沒有流量,所以在效率上基本不需要太過考慮。LVS 一般很少出現(xiàn)故障,即使出現(xiàn)故障一般也是其他地方(如內(nèi)存、CPU 等)出現(xiàn)問題導(dǎo)致 LVS 出現(xiàn)問題
配置性低
這通常是一大劣勢(shì)同時(shí)也是一大優(yōu)勢(shì),因?yàn)闆]有太多的可配置的選項(xiàng),所以除了增減服務(wù)器,并不需要經(jīng)常去觸碰它,大大減少了人為出錯(cuò)的幾率
工作穩(wěn)定
因?yàn)槠浔旧砜关?fù)載能力很強(qiáng),所以穩(wěn)定性高也是順理成章的事,另外各種 LVS 都有完整的雙機(jī)熱備方案,所以一點(diǎn)不用擔(dān)心均衡器本身會(huì)出什么問題,節(jié)點(diǎn)出現(xiàn)故障的話,LVS 會(huì)自動(dòng)判別,所以系統(tǒng)整體是非常穩(wěn)定的
無流量
LVS 僅僅分發(fā)請(qǐng)求,而流量并不從它本身出去,所以可以利用它這點(diǎn)來做一些線路分流之用。沒有流量同時(shí)也保住了均衡器的 IO 性能不會(huì)受到大流量的影響
LVS 基本上能支持所有應(yīng)用,因?yàn)?LVS 工作在第 4 層,所以它可以對(duì)幾乎所有應(yīng)用做負(fù)載均衡,包括 http、數(shù)據(jù)庫、聊天室等。