本來沒想寫這個題材的,為了某某童鞋能夠更好的茁壯成長,臨時寫一篇負載均衡的。負載均衡,大家可能聽過什麼3層負載均衡、4層負載均衡、7層負載均衡什麼的?那這是怎麼分的呢,ok,是根據osi七層網絡模型來分的,例如nginx是工作在應用層,應用層剛好是在第7層,因此nginx又可以稱為7層負載均衡。
我本來想一層層慢慢講,從最基礎的網絡協議開始講起,想了想又覺得這種講法不適合速成。因此我改變思路,直接講負載均衡架構的演進,最後的成品就可以在面試中侃一侃,因為現在負載均衡基本都是這套架構!。
開始呢,我們的應用只有一臺web-server。那麼你希望:
輸入guduyan.com就能定位該server!
那很簡單,只要在DNS裡配上域名和你的server映射關係,就能訪問到啦!
流程如下圖所示
現在假設,我們多了一些需求啊。你的系統按照功能模塊拆成兩個系統:用戶系統和訂單系統。那麼你希望
輸入guduyan.com/user/的時候定位到用戶系統。輸入guduyan.com/order/的時候定位到訂單系統。
那這時候,光靠DNS就不行了,就需要採用DNS+nginx進行負載均衡!如下圖所示
那如果系統的訪問壓力進一步加大,萬一nginx掛了怎麼辦?如何給nginx引入熱備?
這裡就要用keepalived了,用兩臺nginx組成一個集群,分別部署上keepalived,設置成相同的虛IP,這樣一個節點在崩潰的情況下,另一個節點能夠自動接替其工作,如下圖所示
接下來隨著系統規模的繼續增大,你會慢慢的發現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集群的地址。如下所示
OK,這套架構已經能扛得住千萬的PV。一般面對面試官的提問,諸如如何設計高並發架構啊,本文都可以作為參考回答之一。
能不能加個雞腿