來自:孤獨(dú)煙(微信號(hào):zrj_guduyan)
引言
本來沒想寫這個(gè)題材的,為了某某童鞋能夠更好的茁壯成長(zhǎng),臨時(shí)寫一篇負(fù)載均衡的。負(fù)載均衡,大家可能聽過什么3層負(fù)載均衡、4層負(fù)載均衡、7層負(fù)載均衡什么的?那這是怎么分的呢,ok,是根據(jù)osi七層網(wǎng)絡(luò)模型來分的,例如nginx是工作在應(yīng)用層,應(yīng)用層剛好是在第7層,因此nginx又可以稱為7層負(fù)載均衡。
我本來想一層層慢慢講,從最基礎(chǔ)的網(wǎng)絡(luò)協(xié)議開始講起,想了想又覺得這種講法不適合速成。因此我改變思路,直接講負(fù)載均衡架構(gòu)的演進(jìn),最后的成品就可以在面試中侃一侃,因?yàn)楝F(xiàn)在負(fù)載均衡基本都是這套架構(gòu)!。
正文
DNS
開始呢,我們的應(yīng)用只有一臺(tái)web-server。那么你希望:
輸入guduyan.com就能定位該server!
那很簡(jiǎn)單,只要在DNS里配上域名和你的server映射關(guān)系,就能訪問到啦!
流程如下圖所示
好,現(xiàn)在呢,多了一臺(tái)web-server,你就可以通過在DNS里加一條配置,以DNS輪詢方式進(jìn)行負(fù)載均衡。如下圖所示
Nginx+DNS
現(xiàn)在假設(shè),我們多了一些需求啊。你的系統(tǒng)按照功能模塊拆成兩個(gè)系統(tǒng):用戶系統(tǒng)和訂單系統(tǒng)。那么你希望
輸入guduyan.com/user/的時(shí)候定位到用戶系統(tǒng)。輸入guduyan.com/order/的時(shí)候定位到訂單系統(tǒng)。
那這時(shí)候,光靠DNS就不行了,就需要采用DNS+nginx進(jìn)行負(fù)載均衡!如下圖所示
ps:nginx還可以做動(dòng)靜分離哦,大家應(yīng)該懂的!
那如果系統(tǒng)的訪問壓力進(jìn)一步加大,萬一nginx掛了怎么辦?如何給nginx引入熱備?
這里就要用keepalived了,用兩臺(tái)nginx組成一個(gè)集群,分別部署上keepalived,設(shè)置成相同的虛IP,這樣一個(gè)節(jié)點(diǎn)在崩潰的情況下,另一個(gè)節(jié)點(diǎn)能夠自動(dòng)接替其工作,如下圖所示
Lvs+Nginx+DNS
接下來隨著系統(tǒng)規(guī)模的繼續(xù)增大,你會(huì)慢慢的發(fā)現(xiàn)nginx也扛不住了!nginx工作在網(wǎng)絡(luò)的第7層,所以它可以針對(duì)http應(yīng)用本身來做分流策略,比如針對(duì)域名、目錄結(jié)構(gòu)等。
而Lvs工作在網(wǎng)絡(luò)4層,抗負(fù)載能力強(qiáng),性能高,能達(dá)到F5的60%,對(duì)內(nèi)存和CPU資源消耗比較低,且穩(wěn)定,可靠性高。它利用linux的內(nèi)核進(jìn)行轉(zhuǎn)發(fā),不產(chǎn)生流量。它能撐的并發(fā)量取決于機(jī)器的內(nèi)存大小,一般來說撐個(gè)幾十萬并發(fā)問題不大!現(xiàn)在基本上都是nginx+Lvs的負(fù)載均衡架構(gòu)!
ps:好好思考為什么會(huì)出現(xiàn)nginx+Lvs被同時(shí)使用,注意看我演變的過程,面試必問!注意了,如果是比較小的網(wǎng)站(日pv<1000萬),用nginx就完全可以了。
那么,在這種情況下的架構(gòu)圖如下所示
可能有個(gè)疑問,為什么nginx層不用keepalived做熱備?
主要原因是:
在這種架構(gòu)下,nginx不是單臺(tái),如果nginx掛了,Lvs會(huì)幫你轉(zhuǎn)發(fā)到其他可用的nginx上!
最后,為了應(yīng)對(duì)億級(jí)的PV,一般會(huì)在DNS端配多個(gè)Lvs集群的地址。如下所示
方案擴(kuò)展到了這一步,Lvs層就沒有必要再進(jìn)行擴(kuò)展新的節(jié)點(diǎn)了。這套架構(gòu)已經(jīng)能扛得住億級(jí)的PV。當(dāng)然,前提是你的應(yīng)用沒問題!另外如果資金充裕,Lvs可以替換為F5也是可行的。
總結(jié)
OK,這套架構(gòu)已經(jīng)能扛得住千萬的PV。一般面對(duì)面試官的提問,諸如如何設(shè)計(jì)高并發(fā)架構(gòu)啊,本文都可以作為參考回答之一。