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部署實現
在後續繼續了解這部分內容時,發現了這兩個帖子:
1.有了lvs,還要apache,nginx有什麼用?
2.從乙個開發的角度看負載均衡和lvs—–注意看最後乙個lvs集群化的圖,nginx和rs是一對一連線的。
從以上文章來看,lvs+nginx組合使用的原因主要是用lvs來做負載均衡(因為工作在4層,效率高),nginx來做靜態檔案的處理。
這裡第二篇文章,和lvs的後續維護者之一的[吳佳明_普空的ppt](
)中比章博士的文章中多出了一種**模式,也就是full_nat模式,這種模式下,所有的響應也要經過lvs伺服器作為出口返回給客戶端。
lvs在full_nat的模式下,是否還是同步的模式呢?我猜想應該是的,因為lvs工作在4層,所以可能當前出錯的響應要對映到之前的那一次請求(因為沒有解析http包),所以也就做不到把錯誤**到其他的應用伺服器上重新處理。
另外,這個補充是不是就完全的否定了昨天(也就是補充之前的那一大段)的內容呢?我覺得並沒有。昨天的理解可能不是正規大型網際網路在使用的模式(當然,這裡我不能確定,因為我沒有大型網際網路的經驗),但是理論應該是對的。
具體一點,lvs+nginx的組合nginx用來做靜態檔案的處理的場景下,如果一次請求失敗了,那麼久不能被重新處理了,當然你的nginx也可以後掛1個以上的應用伺服器(這樣的話nginx實質上也是起到了lvs均衡補充的效果)。另外就是,nginx不是單單的作為靜態檔案的處理,而是作為lvs的乙個補充,互相彌補均衡上的不足。
那麼你可能會說lvs在4層上處理的高效就不復存在了,確實是的,這點要承認,但是,我們提高了系統請求的成功率,兩者需要各自去選擇和權衡。
另外,需要說的一點是,靜態內容其實我們還可以借助cdn去處理,而不是單單的依靠nginx或者apache去處理。
現在到了比較大一些的網際網路公司,也看了京東的用法(可以看開濤的nginx+lua系列
lvs+nginx的使用中,nginx還可以作為乙個中間環節來減小後端tomcat的服務壓力,以及做一些業務切換、分流、前置快取的功能。
關於LVS Nginx為什麼會被同時使用的思考
lvs是國內的章文嵩博士的大作,比nginx被廣泛接受還要早7年,並且已經被紅帽作為了系統內建軟體,可謂很牛了。lvs相對於nginx來說配置上就要相對複雜一些。但是,有時候我們會看到大牛們分享的經驗裡面是lvs nginx作為負載均衡了,一直想不明白這是個什麼道理。為什麼會出現兩者被同時使用呢?其...
為什麼會出現lvs nginx
一 ngix 應用層 網路七層負載均衡 1 非同步 請求資料和相應資料都要經過ngix,ngix和客戶端建立連線 2 輪詢所有的tomcat伺服器,保證請求成功或者最後一台tomcat伺服器也請求失敗 二 lvs 網路層 網路四層負載均衡 1 同步 接受請求資料,lvs 到伺服器,伺服器直接和客戶端...
var 為什麼會被let const 替代
1.變數提公升是指在子塊中定義的變數,在某些特殊情況下 比如說上文提到的for迴圈就是乙個子塊 其作用域擴大到了父塊的範圍內 dosomething是乙個父塊 有些文章也會把他稱作 變數洩漏 是乙個概念。2.var定義變數的作用域是函式作用域,並非塊級作用域 es5沒有塊級作用域的概念 變數是很容易...