在上一篇文章中,介紹了負(fù)載均衡服務(wù)顿乒,常用的負(fù)載均衡服務(wù)器以及負(fù)載均衡服務(wù)在公司的應(yīng)用情況垛玻。這一篇文章會(huì)對(duì)上篇提到的負(fù)載均衡服務(wù)器進(jìn)行較為深入的分析割捅,對(duì)其主要功能,優(yōu)缺點(diǎn)帚桩,使用場(chǎng)景進(jìn)行介紹亿驾。希望可以起到拋磚引玉的左右,對(duì)大家在了解账嚎,使用不同的負(fù)載均衡服務(wù)有所幫助莫瞬。
LVS
LVS是Linux Virtual Server的簡(jiǎn)寫(xiě),意即Linux虛擬服務(wù)器郭蕉,是一個(gè)基于Linux的負(fù)載均衡服務(wù)器疼邀。LVS項(xiàng)目在1998年5月由章文嵩博士成立,現(xiàn)在已經(jīng)得到了極為廣泛的應(yīng)用召锈,國(guó)內(nèi)外有很多網(wǎng)站和組織都在生產(chǎn)環(huán)境中使用LVS系統(tǒng)旁振。
LVS是基于Linux內(nèi)核模塊,通過(guò)在協(xié)議包工作鏈上對(duì)應(yīng)位置掛載hook代碼烟勋,來(lái)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)包的解析和重寫(xiě)规求。其工作原理與iptables相同。在Linux2.4之后卵惦,LVS打入Linux標(biāo)準(zhǔn)內(nèi)核阻肿,不需要安裝額外的軟件即可使用。LVS運(yùn)行于Linux內(nèi)核之中沮尿,用戶(hù)要通過(guò)運(yùn)行于用戶(hù)態(tài)的工具(ipvsadm)來(lái)對(duì)LVS進(jìn)行配置丛塌。下圖是Linux 數(shù)據(jù)包協(xié)議棧的工作鏈和LVS的掛載點(diǎn):
這幾個(gè)工作鏈主要是工作時(shí)間不同:
NF_IP_PRE_ROUTING:在報(bào)文作路由以前執(zhí)行
NF_IP_FORWARD:在報(bào)文轉(zhuǎn)向另一個(gè)NIC以前執(zhí)行
NF_IP_POST_ROUTING:在報(bào)文流出以前執(zhí)行
NF_IP_LOCAL_IN:在流入本地的報(bào)文作路由以后執(zhí)行
NF_IP_LOCAL_OUT:在本地報(bào)文做流出路由前執(zhí)行
對(duì)于數(shù)據(jù)包较解,LVS的工作流程是:PREROUTING -> LOCAL_IN -> POSTROUTING
對(duì)于出去的包(只有NAT有效):PREROUTING -> FORWARD -> POSTROUTING
對(duì)于Ping包:PREROUTING -> FORWARD -> POSTROUTING
主要特點(diǎn):
與應(yīng)用層的負(fù)載均衡不同,LVS運(yùn)行在內(nèi)核模式赴邻,沒(méi)有系統(tǒng)調(diào)用開(kāi)銷(xiāo)印衔。而只支持四層負(fù)載均衡模式,LVS也不用處理復(fù)雜的七層協(xié)議姥敛,因此有著很高的性能奸焙。當(dāng)單臂模式的設(shè)計(jì)又可以讓LVS承載大量流量(與后端對(duì)比一般可以達(dá)到1:10左右),因此LVS常常被用作整個(gè)系統(tǒng)的流量入口彤敛。 由于LVS的資源占用很少与帆,在日常的應(yīng)用中,其瓶頸常在于網(wǎng)絡(luò)帶寬而不是CPU和內(nèi)存墨榄,因此運(yùn)行在物理機(jī)上的LVS一般都會(huì)配置萬(wàn)兆或以上的網(wǎng)卡怀挠。阿里云的LVS集群就采用了單臺(tái)LVS配置四個(gè)萬(wàn)兆網(wǎng)卡的形式來(lái)提高資源利用率和處理能力击儡。
功能介紹:
LVS是一個(gè)純粹的負(fù)載均衡服務(wù)器挤渐,只支持四層負(fù)載均衡裆赵,支持三種模式,NAT之剧,TUN和DR模式郭卫。
NAT模式:工作在TCP層,這時(shí)LVS的功能與其他四層負(fù)載均衡服務(wù)器類(lèi)似猪狈,是通過(guò)NAT協(xié)議來(lái)修改數(shù)據(jù)包中的Source IP或者Dest IP地址箱沦,來(lái)實(shí)現(xiàn)負(fù)載均衡。在NAT模式下雇庙,上下行的流量都需要經(jīng)過(guò)LVS谓形,因此LVS的帶寬可能成為瓶頸。
TUN模式:工作在IP層:是通過(guò)在IP包的基礎(chǔ)上再進(jìn)行一次獨(dú)立的IP封裝疆前,加入額外的IP頭寒跳,來(lái)實(shí)現(xiàn)包轉(zhuǎn)發(fā)功能,因此TUN協(xié)議又叫做IPIP協(xié)議竹椒。TUN模式是單臂流量童太,只有上行數(shù)據(jù)會(huì)經(jīng)過(guò)LVS,下行數(shù)據(jù)則直接通過(guò)后端服務(wù)器發(fā)給用戶(hù)胸完。為了實(shí)現(xiàn)TU模式书释,后端服務(wù)器上需要支持IPIP協(xié)議,并綁定一個(gè)TUN設(shè)備和對(duì)應(yīng)的VIP地址赊窥。
DR模式:DR模式工作在二層爆惧,是通過(guò)直接修改mac幀中的目標(biāo)mac地址,來(lái)實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)功能锨能。因?yàn)镈R模式走的是mac層的協(xié)議扯再,因此需要負(fù)載均衡服務(wù)和后端服務(wù)器在同一個(gè)二層(同一個(gè)廣播域)之中芍耘。
總結(jié):使用方面,NAT模式使用最為靈活熄阻,對(duì)后端無(wú)侵入性斋竞,但性能也最差。DR模式性能最好秃殉,但對(duì)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)有要求坝初。而TUN模式可以達(dá)到和DR模式相近的性能,但是需要后端對(duì)IPIP協(xié)議的支持钾军。
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):LVS運(yùn)行簡(jiǎn)單脖卖,性能非常強(qiáng)大(運(yùn)行在DR或者TUN模式下的一臺(tái)LVS可以支持后端上百臺(tái)服務(wù)器的需要),而且服務(wù)十分穩(wěn)定(代碼很少有改動(dòng))巧颈。同時(shí),由于直接集成在Linux內(nèi)核中袖扛,使用簡(jiǎn)單砸泛,不需要額外安裝。
缺點(diǎn):模式不夠靈活蛆封,可配置項(xiàng)少唇礁,只支持三種固定模式,很難滿(mǎn)足一些自定義的需求惨篱。而LVS服務(wù)本身也十分簡(jiǎn)單盏筐,沒(méi)有其他負(fù)載均衡服務(wù)所帶的健康檢查等功能,需要其他工具(keepalived砸讳,OSPF等)支持琢融。社區(qū)不夠活躍,代碼更新和活躍度不高簿寂。
應(yīng)用場(chǎng)景:
LVS一般是用在網(wǎng)絡(luò)入口的位置漾抬,使用一組高可用的LVS集群后面會(huì)再接Haproxy,Nginx常遂,Apache等七層負(fù)載均衡服務(wù)纳令。對(duì)于一些四層的應(yīng)用,也會(huì)在前面直接架設(shè)一套LVS克胳,使用LVS的NAT模式進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)和負(fù)載均衡平绩。
Nginx/Tengine/Open Resty
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行漠另。Nginx 是由 Igor Sysoev 為俄羅斯訪問(wèn)量第二的 Rambler.ru 站點(diǎn)開(kāi)發(fā)的捏雌,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類(lèi)BSD許可證的形式發(fā)布酗钞,因它的穩(wěn)定性腹忽、豐富的功能集来累、示例配置文件和低系統(tǒng)資源的消耗而聞名。
Nginx起源也是web服務(wù)器窘奏,但是與Apache不同嘹锁,Nginx采用的是異步模式,epoll模型來(lái)實(shí)現(xiàn)着裹,與Apache相比领猾,Nginx在性能,資源消耗方面都有很大的提高骇扇。Nginx也是為了解決C 10K問(wèn)題而開(kāi)發(fā)的服務(wù)器之一摔竿。
主要功能:
作為一個(gè)web服務(wù)器,可以提供HTTP資源的訪問(wèn)少孝,還可以與php結(jié)合继低,提供動(dòng)態(tài)頁(yè)面支持。而作為負(fù)載均衡服務(wù)器稍走,Nginx除了HTTP/HTTPS協(xié)議之外袁翁,Nginx還支持IMAP/POP3協(xié)議,可以作為郵件的代理服務(wù)器使用婿脸。除了基本的負(fù)載均衡功能外粱胜,Nginx還支持URL重寫(xiě),基于Cookie狐树,URL的轉(zhuǎn)發(fā)等功能焙压。
Nginx還有良好的擴(kuò)展性,支持通過(guò)lua腳本進(jìn)行功能擴(kuò)展抑钟,可以根據(jù)自己的需要涯曲,開(kāi)發(fā)具體的業(yè)務(wù)邏輯。 Nginx基于多進(jìn)程模型在塔,首先啟動(dòng)一個(gè)master進(jìn)程掀抹,然后fork出多個(gè)worker進(jìn)程(可配置),worker進(jìn)程通過(guò)搶占的方式來(lái)處理請(qǐng)求心俗,具體運(yùn)行架構(gòu)如下圖所示:
Master進(jìn)程只負(fù)責(zé)接受連接傲武,不會(huì)執(zhí)行具體的業(yè)務(wù)邏輯。Worker進(jìn)程通過(guò)搶占的方式從master那里得到請(qǐng)求城榛,處理具體的業(yè)務(wù)邏輯揪利,包括請(qǐng)求解析,提供http服務(wù)狠持,請(qǐng)求轉(zhuǎn)發(fā)等疟位。 當(dāng)重新reload時(shí),Master會(huì)根據(jù)配置重新啟動(dòng)一組新的worker進(jìn)程喘垂,同時(shí)把請(qǐng)求全部轉(zhuǎn)發(fā)給新的worker甜刻。老的worker不再處理請(qǐng)求绍撞,當(dāng)當(dāng)前請(qǐng)求處理完畢之后才會(huì)退出。因此Nginx可以在運(yùn)行時(shí)無(wú)縫加載和reload得院。
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):Nginx基于epoll的異步模型傻铣,資源占用很少,在實(shí)際測(cè)試中祥绞,在處理4000并發(fā)連接時(shí)非洲,內(nèi)存資源占用也僅僅只有123.63MB。而Nginx對(duì)于運(yùn)維操作也非常友好蜕径,支持運(yùn)行時(shí)reload两踏,并且不會(huì)丟失用戶(hù)請(qǐng)求。Nginx的多進(jìn)程模型可以方便的使用多核資源兜喻,同時(shí)支持CPU綁定梦染,可以把具體的Nginx worker進(jìn)程綁定在具體的物理CPU之上。
缺點(diǎn):Nginx在處理大的post請(qǐng)求時(shí)朴皆,會(huì)將請(qǐng)求先緩存在本地磁盤(pán)弓坞,當(dāng)請(qǐng)求很大且并發(fā)請(qǐng)求很多時(shí),磁盤(pán)性能會(huì)成為瓶頸车荔,而且出現(xiàn)過(guò)由于硬盤(pán)寫(xiě)滿(mǎn)導(dǎo)致請(qǐng)求失敗的情況。同時(shí)戚扳,Nginx也不支持會(huì)話保持和主動(dòng)監(jiān)測(cè)忧便,健康檢查結(jié)果展示也不大優(yōu)好。
衍生版本
Nginx社區(qū)十分活躍帽借,并且在應(yīng)用中有基于Ningx開(kāi)發(fā)的很多衍生版本珠增,這里就介紹兩個(gè)版本:Tengine和OpenResty。
Tengine:是阿里基于Nginx開(kāi)發(fā)的衍生版本砍艾,補(bǔ)齊了Nginx的短板(Post緩存蒂教,主動(dòng)健康檢查,監(jiān)控頁(yè)面等)脆荷,并在此基礎(chǔ)上進(jìn)行了二次開(kāi)發(fā)凝垛,對(duì)性能和易用性(加入了很多自動(dòng)配置的選項(xiàng))進(jìn)行了優(yōu)化。
優(yōu)點(diǎn):已經(jīng)在阿里內(nèi)部得到了廣泛的應(yīng)用蜓谋,有大量的實(shí)踐基礎(chǔ)和調(diào)優(yōu)經(jīng)驗(yàn)梦皮。性能,穩(wěn)定性方面有保障桃焕。
缺點(diǎn):直接更改Nginx內(nèi)核剑肯,因此需要通過(guò)人工兼容的方式來(lái)跟隨Nginx主版本升級(jí)。
OpenResty:基于Nginx開(kāi)發(fā)的另一個(gè)衍生版本观堂,直接加入了很多優(yōu)質(zhì)的Nginx模塊让网,從而大大擴(kuò)展了Nginx本身的功能呀忧。與Tengine不同,它沒(méi)有直接更改Nginx內(nèi)核溃睹,而是通過(guò)加入模塊的方式來(lái)提供功能擴(kuò)展而账。
應(yīng)用場(chǎng)景
Nginx可以直接運(yùn)行在系統(tǒng)最前面,通過(guò)Keepalived實(shí)現(xiàn)高可用丸凭,作為系統(tǒng)流量的入口使用福扬。也可以對(duì)接LVS,Haproxy等四層負(fù)載均衡惜犀,對(duì)流量進(jìn)行二次分流铛碑。
Haproxy:
Haproxy是一個(gè)專(zhuān)門(mén)的負(fù)載均衡服務(wù)器,支持四層/七層負(fù)載均衡虽界。與Nginx汽烦,apache等不同,Haproxy不提供靜態(tài)資源訪問(wèn)莉御,URL重寫(xiě)等web服務(wù)器相關(guān)功能撇吞。
功能介紹
Haproxy也是基于事件機(jī)制的異步模型,但與nginx不同礁叔,Haproxy是基于單進(jìn)程模型牍颈,沒(méi)有提供天然的多進(jìn)程擴(kuò)展。雖然可以通過(guò)fork進(jìn)程來(lái)實(shí)現(xiàn)多進(jìn)程模型琅关,但是會(huì)引起一些問(wèn)題煮岁,因此官方并不推薦這種做法。在實(shí)際應(yīng)用中一般都是把它作為一個(gè)單進(jìn)程負(fù)載均衡服務(wù)使用涣易。
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):可以同時(shí)支持四層画机,七層負(fù)載均衡,有很高的性能新症。支持Seesion Sticky步氏,有良好的監(jiān)控頁(yè)面,同時(shí)不存在Post緩存問(wèn)題徒爹。
缺點(diǎn):由于Haproxy是基于但進(jìn)程模型荚醒,在reload時(shí)會(huì)導(dǎo)致短暫的不可用,同時(shí)不支持https隆嗅。在作為四層四層負(fù)載均衡服務(wù)器時(shí)無(wú)法獲取原始IP腌且。單進(jìn)程模型,對(duì)多核支持不好(需要多個(gè)實(shí)例)榛瓮,雖然可以運(yùn)作在多核模式下铺董,但存在著一些問(wèn)題。
應(yīng)用場(chǎng)景:
作為四層負(fù)載均衡服務(wù),可以直接接后端服務(wù)使用精续,但由于是采用雙臂模式和單進(jìn)程模型坝锰,并不適合作為單獨(dú)的流量入口。在不需要獲取源IP或者對(duì)性能要求不是很高的情況下作為四層負(fù)載均衡服務(wù)器使用重付∏昙叮或者作為七層負(fù)載均衡服務(wù)器,專(zhuān)門(mén)處理七層的上傳請(qǐng)求确垫。
Apache
Apache 起初由伊利諾伊大學(xué)香檳分校的國(guó)家超級(jí)電腦應(yīng)用中心(NCSA)開(kāi)發(fā)弓颈,是現(xiàn)在互聯(lián)網(wǎng)中使用最熱門(mén)和訪問(wèn)量最大的HTTP服務(wù)器,同時(shí)還可以通過(guò)加載模塊來(lái)完成反向代理功能删掀,但嚴(yán)格來(lái)說(shuō)Apache并不是一個(gè)很好的負(fù)載均衡服務(wù)器翔冀,在性能,功能上與較為專(zhuān)業(yè)的負(fù)載均衡服務(wù)相比并無(wú)優(yōu)勢(shì)披泪,而功能也乏善可陳纤子。但是考慮到Apache的廣泛應(yīng)用以及基于Apache的負(fù)載均衡服務(wù)在實(shí)際的生產(chǎn)環(huán)境中還是有不少應(yīng)用。
功能介紹:
Apache是一個(gè)web服務(wù)器款票,通過(guò)可以通過(guò)加載模塊來(lái)實(shí)現(xiàn)負(fù)載均衡服務(wù)控硼。作為一個(gè)強(qiáng)大的web服務(wù)器,Apache在解析HTTP協(xié)議有天然的優(yōu)勢(shì)艾少,支持基于域名分流卡乾,URL分析,URL重寫(xiě)缚够,轉(zhuǎn)發(fā)等功能幔妨。
Apache支持兩種模式的負(fù)載均衡:基于mod_proxy模塊的一般負(fù)載均衡和基于mod_proxy_ajp模塊的二進(jìn)制負(fù)載均衡。這兩種模式的主要區(qū)別在于Apache和后端服務(wù)之間的連接方式潮瓶。一般的負(fù)載均衡是采用HTTP協(xié)議,使用文本傳輸钙姊,而ajp模式則采用二進(jìn)制模式毯辅,因此性能上會(huì)更好。但相對(duì)的煞额,AJP模式需要后端服務(wù)器的支持思恐,在一般應(yīng)用時(shí),會(huì)通過(guò)跟tomcat結(jié)合來(lái)提供負(fù)載均衡服務(wù)膊毁。
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):Apache是應(yīng)用最廣的web服務(wù)器胀莹,因此在服務(wù)應(yīng)用上面有著天然的優(yōu)勢(shì)。而Apache+Tomcat的模式可以滿(mǎn)足現(xiàn)在大部分網(wǎng)站對(duì)于靜態(tài)資源和動(dòng)態(tài)資源的需求婚温。而作為一個(gè)強(qiáng)大的web服務(wù)器描焰,Apache還支持URL重寫(xiě),URL轉(zhuǎn)發(fā)等web服務(wù)相關(guān)的操作,可以對(duì)后端服務(wù)提供更多支持荆秦。
缺點(diǎn):作為負(fù)載均衡服務(wù)器篱竭,主要問(wèn)題是采用的多進(jìn)程模式,每個(gè)連接在處理時(shí)都會(huì)開(kāi)獨(dú)立的線程步绸,當(dāng)連接請(qǐng)求數(shù)據(jù)很多時(shí)掺逼,會(huì)有在處理高并發(fā)時(shí)會(huì)有性能隱患。
應(yīng)用場(chǎng)景:
因?yàn)闊o(wú)論從性能還是功能上看瓤介,都有更好的選擇吕喘,因此Apache一般不會(huì)單獨(dú)作為負(fù)載均衡服務(wù)器使用。一般是采用Apache服務(wù)作為靜態(tài)文件服務(wù)器使用的時(shí)候刑桑,使用AJP模塊與后端的Tomcat對(duì)接氯质,提供簡(jiǎn)單的負(fù)載均衡支持。
總結(jié)
本文對(duì)常用的四種負(fù)載均衡服務(wù)進(jìn)行了簡(jiǎn)單的介紹漾月,在之后的文章中病梢,會(huì)對(duì)具體的負(fù)載均衡服務(wù)進(jìn)行更為深入的分析和說(shuō)明。