常用的負(fù)載均衡技術(shù)
Nginx、LVS、HAProxy 是目前使用最廣泛的三種負(fù)載均衡軟件,本人都在多個(gè)項(xiàng)目中實(shí)施過,通常會(huì)結(jié)合Keepalive做健康檢查,實(shí)現(xiàn)故障轉(zhuǎn)移的高可用功能。
1)在四層(tcp)實(shí)現(xiàn)負(fù)載均衡的軟件:
lvs------>重量級(jí)
nginx------>輕量級(jí),帶緩存功能,正則表達(dá)式較靈活
haproxy------>模擬四層轉(zhuǎn)發(fā),較靈活2)在七層(http)實(shí)現(xiàn)反向代理的軟件:
haproxy------>天生技能,全面支持七層代理,會(huì)話保持,標(biāo)記,路徑轉(zhuǎn)移;
nginx------>只在http協(xié)議和mail協(xié)議上功能比較好,性能與haproxy差不多;
apache------>功能較差總的來說,一般是lvs做4層負(fù)載;nginx做7層負(fù)載;haproxy比較靈活,4層和7層負(fù)載均衡都能做
一般對(duì)負(fù)載均衡的使用是隨著網(wǎng)站規(guī)模的提升根據(jù)不同的階段來使用不同的技術(shù)。具體的應(yīng)用需求還得具體分析:
1)如果是中小型的 Web 應(yīng)用,比如日PV小于1000 萬,用 Nginx 就完全可以了;
2)如果機(jī)器不少,可以用DNS輪詢, LVS所耗費(fèi)的機(jī)器還是比較多的;大型網(wǎng)站或重要的服務(wù),且服務(wù)器比較多時(shí), 可以考慮用LVS。還有一種是通過硬件來進(jìn)行進(jìn)行,常見的硬件有比較昂貴的F5和Array等商用的負(fù)載均衡器,它的優(yōu)點(diǎn)就是有專業(yè)的維護(hù)團(tuán)隊(duì)來對(duì)這些服務(wù)進(jìn)行維護(hù)、缺點(diǎn)就是花銷太大,所以對(duì)于規(guī)模較小
的網(wǎng)絡(luò)服務(wù)來說暫時(shí)還沒有需要使用;另外一種就是類似于 Nginx/LVS/HAProxy 的基于 Linux 的開源免費(fèi)的負(fù)載均衡軟件,這些都是通過軟件級(jí)別來實(shí)現(xiàn),所以費(fèi)用非常低廉。目前關(guān)于網(wǎng)
站架構(gòu)一般比較合理流行的架構(gòu)方案: Web 前端采用Nginx/HAProxy+Keepalived 作負(fù)載均衡器;后端采用 MySQL 數(shù)據(jù)庫(kù)一主多從和讀寫分離,采用 LVS+Keepalived 的架構(gòu)。 當(dāng)然要根據(jù)
項(xiàng)目具體需求制定方案。下面說說各自的特點(diǎn)和適用場(chǎng)合。
下面簡(jiǎn)單說下Nginx、LVS、HAProxy 負(fù)載均衡軟件的優(yōu)缺點(diǎn):
一、Nginx的優(yōu)點(diǎn)是:
- 1)工作在網(wǎng)絡(luò)的7層之上,可以針對(duì) http 應(yīng)用做一些分流的策略,比如針對(duì)域名、目錄結(jié)構(gòu),它的正則規(guī)則比 HAProxy 更為強(qiáng)大和靈活,這也是它目前廣泛流
行的主要原因之一, Nginx 單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于 LVS 了。 - 2) Nginx 對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴非常小,理論上能 ping 通就就能進(jìn)行負(fù)載功能,這個(gè)也是它的優(yōu)勢(shì)之一;相反 LVS 對(duì)網(wǎng)絡(luò)穩(wěn)定性依賴比較大,這點(diǎn)本人深有體會(huì);
- 3) Nginx 安裝和配置比較簡(jiǎn)單,測(cè)試起來比較方便,它基本能把錯(cuò)誤用日志打印出來。 LVS 的配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了, LVS 對(duì)網(wǎng)絡(luò)依賴比較大。
- 4)可以承擔(dān)高負(fù)載壓力且穩(wěn)定,在硬件不差的情況下一般能支撐幾萬次的并發(fā)量,負(fù)載度比 LVS 相對(duì)小些。
- 5) Nginx 可以通過端口檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn),不過其中缺點(diǎn)就是不支持url來檢測(cè)。
比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過程中出現(xiàn)故障, Nginx 會(huì)把上傳切到另一臺(tái)服務(wù)器重新處 理,而LVS就直接斷掉了,如果是上傳一個(gè)很大的文件或者很重要的文
件的話,用戶可能會(huì)因此而不滿。 - 6)Nginx 不僅僅是一款優(yōu)秀的負(fù)載均衡器/反向代理軟件,它同時(shí)也是功能強(qiáng)大的 Web 應(yīng)用服務(wù)器。 LNMP 也是近幾年非常流行的 web 架構(gòu),在高流量的環(huán)境中穩(wěn)定性也很好。
- 7)Nginx 現(xiàn)在作為 Web 反向加速緩存越來越成熟了,速度比傳統(tǒng)的 Squid 服務(wù)器更快,可以考慮用其作為反向代理加速器。
- 8)Nginx 可作為中層反向代理使用,這一層面 Nginx 基本上無對(duì)手,唯一可以對(duì)比 Nginx 的就只有 lighttpd 了,不過 lighttpd 目前還沒有做到 Nginx 完全的功能,配置也不那么清晰易讀,
社區(qū)資料也遠(yuǎn)遠(yuǎn)沒 Nginx 活躍。 - 9) Nginx 也可作為靜態(tài)網(wǎng)頁和圖片服務(wù)器,這方面的性能也無對(duì)手。還有 Nginx社區(qū)非?;钴S,第三方模塊也很多。
Nginx 的缺點(diǎn)是:
- 1)Nginx 僅能支持 http、 https 和 Email 協(xié)議,這樣就在適用范圍上面小些,這個(gè)是它的缺點(diǎn)。
- 2)對(duì)后端服務(wù)器的健康檢查,只支持通過端口來檢測(cè),不支持通過 url 來檢測(cè)。不支持 Session 的直接保持,但能通過 ip_hash 來解決。
二、LVS:使用 Linux 內(nèi)核集群實(shí)現(xiàn)一個(gè)高性能、 高可用的負(fù)載均衡服務(wù)器,它具有很好的可伸縮性( Scalability)、可靠性( Reliability)和可管理性(Manageability)。
LVS 的優(yōu)點(diǎn)是:
- 1)抗負(fù)載能力強(qiáng)、是工作在網(wǎng)絡(luò) 4 層之上僅作分發(fā)之用, 沒有流量的產(chǎn)生,這個(gè)特點(diǎn)也決定了它在負(fù)載均衡軟件里的性能最強(qiáng)的,對(duì)內(nèi)存和 cpu 資源消耗比較低。
- 2)配置性比較低,這是一個(gè)缺點(diǎn)也是一個(gè)優(yōu)點(diǎn),因?yàn)闆]有可太多配置的東西,所以并不需要太多接觸,大大減少了人為出錯(cuò)的幾率。
- 3)工作穩(wěn)定,因?yàn)槠浔旧砜关?fù)載能力很強(qiáng),自身有完整的雙機(jī)熱備方案,如LVS+Keepalived,不過我們?cè)陧?xiàng)目實(shí)施中用得最多的還是 LVS/DR+Keepalived。
- 4)無流量, LVS 只分發(fā)請(qǐng)求,而流量并不從它本身出去,這點(diǎn)保證了均衡器 IO的性能不會(huì)收到大流量的影響。
- 5)應(yīng)用范圍比較廣,因?yàn)?LVS 工作在 4 層,所以它幾乎可以對(duì)所有應(yīng)用做負(fù)載均衡,包括 http、數(shù)據(jù)庫(kù)、在線聊天室等等。
LVS 的缺點(diǎn)是:
- 1)軟件本身不支持正則表達(dá)式處理,不能做動(dòng)靜分離;而現(xiàn)在許多網(wǎng)站在這方面都有較強(qiáng)的需求,這個(gè)是 Nginx/HAProxy+Keepalived 的優(yōu)勢(shì)所在。
- 2)如果是網(wǎng)站應(yīng)用比較龐大的話, LVS/DR+Keepalived 實(shí)施起來就比較復(fù)雜了,特別后面有 Windows Server 的機(jī)器的話,如果實(shí)施及配置還有維護(hù)過程就比較復(fù)雜了,相對(duì)而言,
Nginx/HAProxy+Keepalived 就簡(jiǎn)單多了。
三、HAProxy 的特點(diǎn)是:
- 1)HAProxy 也是支持虛擬主機(jī)的。
- 2)HAProxy 的優(yōu)點(diǎn)能夠補(bǔ)充 Nginx 的一些缺點(diǎn),比如支持 Session 的保持,Cookie的引導(dǎo);同時(shí)支持通過獲取指定的 url 來檢測(cè)后端服務(wù)器的狀態(tài)。
- 3)HAProxy 跟 LVS 類似,本身就只是一款負(fù)載均衡軟件;單純從效率上來講HAProxy 會(huì)比 Nginx 有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于 Nginx 的。
- 4)HAProxy 支持 TCP 協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā),可以對(duì) MySQL 讀進(jìn)行負(fù)載均衡,對(duì)后端的 MySQL 節(jié)點(diǎn)進(jìn)行檢測(cè)和負(fù)載均衡,大家可以用 LVS+Keepalived 對(duì) MySQL主從做負(fù)載均衡。
- 5)HAProxy 負(fù)載均衡策略非常多, HAProxy 的負(fù)載均衡算法現(xiàn)在具體有如下8種:
1> roundrobin,表示簡(jiǎn)單的輪詢,這個(gè)不多說,這個(gè)是負(fù)載均衡基本都具備的;
2> static-rr,表示根據(jù)權(quán)重,建議關(guān)注;
3> leastconn,表示最少連接者先處理,建議關(guān)注;
4> source,表示根據(jù)請(qǐng)求源 IP,這個(gè)跟 Nginx 的 IP_hash 機(jī)制類似,我們用其作為解決 session 問題的一種方法,建議關(guān)注;
5> ri,表示根據(jù)請(qǐng)求的 URI;
6> rl_param,表示根據(jù)請(qǐng)求的 URl 參數(shù)’balance url_param’ requires an URLparameter name;
7> hdr(name),表示根據(jù) HTTP 請(qǐng)求頭來鎖定每一次 HTTP 請(qǐng)求;
8> rdp-cookie(name),表示根據(jù)據(jù) cookie(name)來鎖定并哈希每一次 TCP 請(qǐng)求。
四、Nginx和LVS 對(duì)比的總結(jié):
- 1)Nginx 工作在網(wǎng)絡(luò)的 7 層,所以它可以針對(duì) http 應(yīng)用本身來做分流策略,比如針對(duì)域名、目錄結(jié)構(gòu)等,相比之下 LVS 并不具備這樣的功能,所以 Nginx 單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于LVS了;
但 Nginx 有用的這些功能使其可調(diào)整度要高于 LVS,所以經(jīng)常要去觸碰觸碰,觸碰多了,人為出問題的 幾率也就會(huì)大。 - 2)Nginx 對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴較小,理論上只要 ping 得通,網(wǎng)頁訪問正常, Nginx就能連得通,這是 Nginx 的一大優(yōu)勢(shì)! 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,貌似是不能用本身的 IP 來做 VIP 的。要做好 LVS 管理員,確實(shí)得跟進(jìn)學(xué)習(xí)很多有關(guān)網(wǎng)絡(luò)通信方面的知識(shí),就不再是一個(gè) HTTP 那么簡(jiǎn)單了。 - 3)Nginx 安裝和配置比較簡(jiǎn)單,測(cè)試起來也很方便,因?yàn)樗灸馨彦e(cuò)誤用日志打印出來。 LVS 的安裝和配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了; LVS 對(duì)網(wǎng)絡(luò)依賴比較大,很多時(shí)候不能配置成功都是
因?yàn)榫W(wǎng)絡(luò)問題而不是配置問題,出了問題要解決也相應(yīng)的會(huì)麻煩得多。 - 4)Nginx 也同樣能承受很高負(fù)載且穩(wěn)定,但負(fù)載度和穩(wěn)定度差 LVS 還有幾個(gè)等級(jí):Nginx 處理所有流量所以受限于機(jī)器 IO 和配置;本身的 bug 也還是難以避免的。
- 5)Nginx 可以檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn)。目前 LVS 中l(wèi)directd 也能支持針對(duì)服務(wù)器內(nèi)部的情況
來監(jiān)控,但 LVS 的原理使其不能重發(fā)請(qǐng)求。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過程中 出現(xiàn)故障, Nginx 會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而 LVS 就直接斷掉了,如果
是上傳一個(gè)很大的文件或者很重要的文件的話,用戶可能會(huì)因此而惱火。 - 6)Nginx 對(duì)請(qǐng)求的異步處理可以幫助節(jié)點(diǎn)服務(wù)器減輕負(fù)載,假如使用 apache 直接對(duì)外服務(wù),那么出現(xiàn)很多的窄帶鏈接時(shí) apache 服務(wù)器將會(huì)占用大 量?jī)?nèi)存而不能釋放,使用多一個(gè) Nginx 做 apache
代理的話,這些窄帶鏈接會(huì)被 Nginx 擋住,apache 上就不會(huì)堆積過多的請(qǐng)求,這樣就減少了相 當(dāng)多的資源占用。這點(diǎn)使用squid 也有相同的作用,即使 squid 本身配置為不緩存,對(duì) apache 還是有
很大幫助的。 - 7)Nginx 能支持 http、 https 和 email( email 的功能比較少用), LVS 所支持的應(yīng)用在這點(diǎn)上會(huì)比 Nginx 更多。在使用上,一般最 前端所采取的策略應(yīng)是 LVS,也就是 DNS 的指向應(yīng)為 LVS 均衡器,
LVS 的優(yōu)點(diǎn)令它非常適合做這個(gè)任務(wù)。重要的ip地址,最好交由 LVS 托管,比如數(shù)據(jù) 庫(kù)的 ip、 webservice 服務(wù)器的 ip等等,這些 ip 地址隨著時(shí)間推移,使用面會(huì)越來越大,如果更換 ip 則故障會(huì)接踵
而至。所以將這些重要 ip 交給 LVS 托管是最為穩(wěn)妥的,這樣做的唯一缺點(diǎn)是需要的 VIP 數(shù)量會(huì)比較多。Nginx 可作為 LVS 節(jié)點(diǎn)機(jī)器使用,一是可以利用 Nginx的功能,二是可以利 用 Nginx 的性能。當(dāng)然
這一層面也可以直接使用 squid,squid 的功能方面就比 Nginx 弱不少了,性能上也有所遜色于 Nginx。Nginx 也可作為中層代理使用,這一層面 Nginx 基本上無對(duì)手,唯一可以撼動(dòng) Nginx 的就只有 lighttpd
了,不過 lighttpd 目前還沒有能做到 Nginx 完全的功能,配置也不那么清晰易讀。另外,中層代理的 IP 也是重要的,所以中層代理也擁有一個(gè)VIP 和 LVS 是最完美的方案了。具體的應(yīng)用還得 具體分析,如果
是比較小的網(wǎng)站(日 PV 小于 1000 萬),用 Nginx 就完全可以了,如果機(jī)器也不少,可以用DNS 輪詢, LVS 所耗費(fèi)的機(jī)器還是比較多 的;大型網(wǎng)站或者重要的服務(wù),機(jī)器不發(fā)愁的時(shí)候,要多多考慮利用 LVS。
現(xiàn)在對(duì)網(wǎng)絡(luò)負(fù)載均衡的使用是隨著網(wǎng)站規(guī)模的提升根據(jù)不同的階段來使用不同的技術(shù):
- 1)第一階段:利用 Nginx 或 HAProxy 進(jìn)行單點(diǎn)的負(fù)載均衡,這一階段服務(wù)器規(guī)模剛脫離開單服務(wù)器、單數(shù)據(jù)庫(kù)的模式,需要一定的負(fù)載均衡,但是仍 然規(guī)模較小沒有專業(yè)的維護(hù)團(tuán)隊(duì)來進(jìn)行維護(hù),也沒有需要進(jìn)行大規(guī)模的網(wǎng)站部署。這樣利用Nginx 或 HAproxy 就是第一選擇,此時(shí)這些東西上手快, 配置容易,在七層之上利用 HTTP 協(xié)議就可以。這時(shí)是第一選擇。
- 2)第二階段:隨著網(wǎng)絡(luò)服務(wù)進(jìn)一步擴(kuò)大,這時(shí)單點(diǎn)的 Nginx 已經(jīng)不能滿足,這時(shí)使用 LVS 或者商用 Array 就是首要選擇, Nginx 此時(shí)就作為 LVS 或者 Array 的節(jié)點(diǎn)來使用,具體 LVS 或 Array 的是選擇是根據(jù)
公司規(guī)模和預(yù)算來選擇,Array 的應(yīng)用交付功能非常強(qiáng)大,本人在某項(xiàng)目中使用過,性價(jià)比也遠(yuǎn)高于 F5,商用首選!但是一般來說這階段相關(guān)人才跟不上業(yè)務(wù)的提升,所以購(gòu)買商業(yè)負(fù)載均衡已經(jīng)成為了必經(jīng)之路。 - 3)第三階段:這時(shí)網(wǎng)絡(luò)服務(wù)已經(jīng)成為主流產(chǎn)品,此時(shí)隨著公司知名度也進(jìn)一步擴(kuò)展,相關(guān)人才的能力以及數(shù)量也隨之提升,這時(shí)無論從開發(fā)適合自身產(chǎn)品的定制,以及降低成本來講開源的 LVS,已經(jīng)成為首選,這時(shí)
LVS 會(huì)成為主流。最終形成比較理想的基本架構(gòu)為: Array/LVS — Nginx/Haproxy —Squid/Varnish — AppServer。