關於LVS+Nginx爲什麼會被同時使用的思考

原文鏈接:https://blog.csdn.net/BuquTianya/article/details/52076153

分類專欄: 移動應用JAVA後臺開發

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/BuquTianya/article/details/52076153

最初的理解

(也可以每個nginx都掛在上所有的應用服務器) 
nginx大家都在用,估計也很熟悉了,在做負載均衡時很好用,安裝簡單、配置簡單、相關材料也特別多。

lvs是國內的章文嵩博士的大作,比nginx被廣泛接受還要早7年,並且已經被紅帽作爲了系統內置軟件,可謂很牛了。lvs相對於nginx來說配置上就要相對複雜一些。

但是,有時候我們會看到大牛們分享的經驗裏面是lvs+nginx作爲負載均衡了,一直想不明白這是個什麼道理。

爲什麼會出現兩者被同時使用呢?其實,這要從兩者的各自優勢來說了。

nginx用來做http的反向代理,能夠upsteam實現http請求的多種方式的均衡轉發。由於採用的是異步轉發可以做到如果一個服務器請求失敗,立即切換到其他服務器,直到請求成功或者最後一臺服務器失敗爲止。這可以最大程度的提高系統的請求成功率。

lvs採用的是同步請求轉發的策略。這裏說一下同步轉發和異步轉發的區別。同步轉發是在lvs服務器接收到請求之後,立即redirect到一個後端服務器,由客戶端直接和後端服務器建立連接。異步轉發是nginx在保持客戶端連接的同時,發起一個相同內容的新請求到後端,等後端返回結果後,由nginx返回給客戶端。

進一步來說:當做爲負載均衡服務器的nginx和lvs處理相同的請求時,所有的請求和響應流量都會經過nginx;但是使用lvs時,僅請求流量經過lvs的網絡,響應流量由後端服務器的網絡返回。

也就是,當作爲後端的服務器規模龐大時,nginx的網絡帶寬就成了一個巨大的瓶頸。

但是僅僅使用lvs作爲負載均衡的話,一旦後端接受到請求的服務器出了問題,那麼這次請求就失敗了。但是如果在lvs的後端在添加一層nginx(多個),每個nginx後端再有幾臺應用服務器,那麼結合兩者的優勢,既能避免單nginx的流量集中瓶頸,又能避免單lvs時一錘子買賣的問題。

參考文章: 
章文嵩:LVS項目介紹 
moon:強大的nginx反向代理異步傳輸模式(原理) 

yaoweibin:nginx健康檢查 
追馬博客:LVS+keepalived+nginx+tomcat部署實現

補充(20160731 下午2:07):

在後續繼續瞭解這部分內容時,發現了這兩個帖子: 
1. 有了LVS,還要apache,nginx有什麼用? 
2.從一個開發的角度看負載均衡和LVS—–注意看最後一個lvs集羣化的圖,nginx和rs是一對一連接的。

從以上文章來看,lvs+nginx組合使用的原因主要是用lvs來做負載均衡(因爲工作在4層,效率高),nginx來做靜態文件的處理。

這裏第二篇文章,和lvs的後續維護者之一的[吳佳明_普空的ppt](http://velocity.oreilly.com.cn/2012/ppts/pukong.pdf 
)中比章博士的文章中多出了一種轉發模式,也就是full_nat模式,這種模式下,所有的響應也要經過lvs服務器作爲出口返回給客戶端。

lvs在full_nat的模式下,是否還是同步的模式呢?我猜想應該是的,因爲lvs工作在4層,所以可能當前出錯的響應要映射到之前的那一次請求(因爲沒有解析http包),所以也就做不到把錯誤轉發到其他的應用服務器上重新處理。

另外,這個補充是不是就完全的否定了昨天(也就是補充之前的那一大段)的內容呢?我覺得並沒有。昨天的理解可能不是正規大型互聯網在使用的模式(當然,這裏我不能確定,因爲我沒有大型互聯網的經驗),但是理論應該是對的。

具體一點,lvs+nginx的組合nginx用來做靜態文件的處理的場景下,如果一次請求失敗了,那麼久不能被重新處理了,當然你的nginx也可以後掛1個以上的應用服務器(這樣的話nginx實質上也是起到了lvs均衡補充的效果)。另外就是,nginx不是單單的作爲靜態文件的處理,而是作爲lvs的一個補充,互相彌補均衡上的不足。

那麼你可能會說lvs在4層上處理的高效就不復存在了,確實是的,這點要承認,但是,我們提高了系統請求的成功率,兩者需要各自去選擇和權衡。

另外,需要說的一點是,靜態內容其實我們還可以藉助cdn去處理,而不是單單的依靠nginx或者apache去處理。

補充(2016年12月17日 上午11:24)

現在到了比較大一些的互聯網公司,也看了京東的用法(可以看開濤的nginx+lua系列http://www.iteye.com/blogs/subjects/nginx-lua)。

lvs+nginx的使用中,nginx還可以作爲一箇中間環節來減小後端tomcat的服務壓力,以及做一些業務切換、分流、前置緩存的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章