03.01 十年程序員淺析億級PV的負載均衡架構!

前言

本來沒想寫這個題材的,為了某某童鞋能夠更好的茁壯成長,臨時寫一篇負載均衡的。負載均衡,大家可能聽過什麼3層負載均衡、4層負載均衡、7層負載均衡什麼的?那這是怎麼分的呢,ok,是根據osi七層網絡模型來分的,例如nginx是工作在應用層,應用層剛好是在第7層,因此nginx又可以稱為7層負載均衡。

我本來想一層層慢慢講,從最基礎的網絡協議開始講起,想了想又覺得這種講法不適合速成。因此我改變思路,直接講負載均衡架構的演進,最後的成品就可以在面試中侃一侃,因為現在負載均衡基本都是這套架構!

正文

DNS

開始呢,我們的應用只有一臺web-server。那麼你希望:

輸入guduyan.com就能定位該server!

那很簡單,只要在DNS裡配上域名和你的server映射關係,就能訪問到啦!

流程如下圖所示

十年程序員淺析億級PV的負載均衡架構!

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

十年程序員淺析億級PV的負載均衡架構!

Nginx+DNS

現在假設,我們多了一些需求啊。

你的系統按照功能模塊拆成兩個系統:用戶系統和訂單系統。

那麼你希望輸入guduyan.com/user/的時候定位到用戶系統。輸入guduyan.com/order/的時候定位到訂單系統。

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

十年程序員淺析億級PV的負載均衡架構!

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

那如果系統的訪問壓力進一步加大,萬一nginx掛了怎麼辦?如何給nginx引入熱備?

這裡就要用keepalived了,用兩臺nginx組成一個集群,分別部署上keepalived,設置成相同的虛IP,這樣一個節點在崩潰的情況下,另一個節點能夠自動接替其工作,如下圖所示

十年程序員淺析億級PV的負載均衡架構!

Lvs+Nginx+DNS

接下來隨著系統規模的繼續增大,你會慢慢的發現nginx也扛不住了!nginx工作在網絡的第7層,所以它可以針對http應用本身來做分流策略,比如針對域名、目錄結構等。

而Lvs工作在網絡4層,抗負載能力強,性能高,能達到F5的60%,對內存和CPU資源消耗比較低,且穩定,可靠性高。它利用linux的內核進行轉發,不產生流量。它能撐的併發量取決於機器的內存大小,一般來說撐個幾十萬併發問題不大!現在基本上都是nginx+Lvs的負載均衡架構!

ps:好好思考為什麼會出現nginx+Lvs被同時使用,注意看我演變的過程,面試必問!注意了,如果是比較小的網站(日pv<1000萬),用nginx就完全可以了。

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

十年程序員淺析億級PV的負載均衡架構!

可能有個疑問,為什麼nginx層不用keepalived做熱備?

主要原因是:

在這種架構下,nginx不是單臺,如果nginx掛了,Lvs會幫你轉發到其他可用的nginx上!

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

十年程序員淺析億級PV的負載均衡架構!

方案擴展到了這一步,Lvs層就沒有必要再進行擴展新的節點了,這套架構已經能扛得住億級的PV,當然,前提是你的應用沒問題!

另外如果資金充裕,Lvs可以替換為F5也是可行的。

總結

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


分享到:


相關文章: