日活億級使用者的伺服器架構要怎麼搭?

碼洞發表於2019-01-30

引言

本來沒想寫這個題材的,為了某某童鞋能夠更好的茁壯成長,臨時寫一篇負載均衡的。負載均衡,大家可能聽過什麼3層負載均衡、4層負載均衡、7層負載均衡什麼的?那這是怎麼分的呢,ok,是根據osi七層網路模型來分的,例如nginx是工作在應用層,應用層剛好是在第7層,因此nginx又可以稱為7層負載均衡。
我本來想一層層慢慢講,從最基礎的網路協議開始講起,想了想又覺得這種講法不適合速成。因此我改變思路,直接講負載均衡架構的演進,最後的成品就可以在面試中侃一侃,因為現在負載均衡基本都是這套架構!。

正文

DNS

開始呢,我們的應用只有一臺web-server。那麼你希望:
輸入guduyan.com就能定位該server!

那很簡單,只要在DNS裡配上域名和你的server對映關係,就能訪問到啦!
流程如下圖所示

日活億級使用者的伺服器架構要怎麼搭?

好,現在呢,多了一臺web-server,你就可以透過在DNS里加一條配置,以DNS輪詢方式進行負載均衡。如下圖所示

日活億級使用者的伺服器架構要怎麼搭?

Nginx+DNS

現在假設,我們多了一些需求啊。你的系統按照功能模組拆成兩個系統:使用者系統和訂單系統。那麼你希望
輸入guduyan.com/user/的時候定位到使用者系統。輸入guduyan.com/order/的時候定位到訂單系統。

那這時候,光靠DNS就不行了,就需要採用DNS+nginx進行負載均衡!如下圖所示

日活億級使用者的伺服器架構要怎麼搭?

ps:nginx還可以做動靜分離哦,大家應該懂的!

那如果系統的訪問壓力進一步加大,萬一nginx掛了怎麼辦?如何給nginx引入熱備?
這裡就要用keepalived了,用兩臺nginx組成一個叢集,分別部署上keepalived,設定成相同的虛IP,這樣一個節點在崩潰的情況下,另一個節點能夠自動接替其工作,如下圖所示

日活億級使用者的伺服器架構要怎麼搭?

Lvs+Nginx+DNS

接下來隨著系統規模的繼續增大,你會慢慢的發現nginx也扛不住了!nginx工作在網路的第7層,所以它可以針對http應用本身來做分流策略,比如針對域名、目錄結構等。
而Lvs工作在網路4層,抗負載能力強,效能高,能達到F5的60%,對記憶體和CPU資源消耗比較低,且穩定,可靠性高。它利用linux的核心進行轉發,不產生流量。它能撐的併發量取決於機器的記憶體大小,一般來說撐個幾十萬併發問題不大!現在基本上都是nginx+Lvs的負載均衡架構!
ps:好好思考為什麼會出現nginx+Lvs被同時使用,注意看我演變的過程,面試必問!注意了,如果是比較小的網站(日pv<1000萬),用nginx就完全可以了。

那麼,在這種情況下的架構圖如下所示

日活億級使用者的伺服器架構要怎麼搭?

可能有個疑問,為什麼nginx層不用keepalived做熱備?
主要原因是:
在這種架構下,nginx不是單臺,如果nginx掛了,Lvs會幫你轉發到其他可用的nginx上!

最後,為了應對億級的PV,一般會在DNS端配多個Lvs叢集的地址。如下所示

日活億級使用者的伺服器架構要怎麼搭?


方案擴充套件到了這一步,Lvs層就沒有必要再進行擴充套件新的節點了。這套架構已經能扛得住億級的PV。當然,前提是你的應用沒問題!另外如果資金充裕,Lvs可以替換為F5也是可行的。

總結

OK,這套架構已經能扛得住千萬的PV。一般面對面試官的提問,諸如如何設計高併發架構啊,本文都可以作為參考回答之一

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561269/viewspace-2565242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章