03.07 用nginx這個反向代理服務器實現負載均衡,集群幾臺服務器,同時協作完成一個任務,這樣的情景下就是分佈式嗎?

範李英芳


先說結論,可以利用Nginx的反向代理能力,集合幾個負責不同功能的server節點,從而實現分佈式;也可以利用Nginx的負載均衡能力,集合幾個相同功能的server節點,從而實現服務的高穩定性。

目前Nginx已經逐漸成為平臺服務必不可少的一環,就是因為它的反向代理與負載均衡能力滿足了開發者對產品服務高可用性以及模塊解耦的需求。

接下來我們分別來解釋反向代理與負載均衡。

反向代理

反向代理是針對服務器端。對於用戶來說,他只知道反向代理服務器的地址,但是反向代理服務器後面通常指向了多個服務器,負責了相同或者不同的模塊。Nginx會根據conf文件中配置的正則表達式來解析用戶實際請求的url path,然後再將請求轉發至不同的服務器進行處理,最後再將請求結果返回給用戶。這個過程就叫做反向代理,因此可以看做將不同的能力,不同的server整合到一個host和ip,從而減少用戶的使用負擔,也是對用戶更加友好。

負載均衡

與反向代理相對應的是負載均衡。

我通過一個例子來解釋,當一臺服務器能夠承受的qps只有2000,但是當前用戶量激增,qps達到了3500,在不修改代碼不優化的情況下如何解決呢。

我們可以再佈置一臺server,兩臺服務器一起處理請求,從整體上來看,qps就達到了4000。但是兩臺服務器有不同的ip,我們總不能在擴容後和用戶說,你的第奇數個請求發到8080端口,第偶數個請求發送到8082吧。

如何處理這個問題呢?這就用到了負載均衡。

我們可以在Nginx的conf文件中為同一個類型的path配置指向兩臺服務器地址,這樣對於用戶來說,他依然只需要請求Nginx的地址即可,Nginx會根據當前兩臺服務器的情況決定將請求轉發給哪一個。這樣佈置還有一個好處,就是如果其中一個節點宕機了,只要另一個節點還活著,從用戶的角度,整個服務就還能夠運轉,因為Nginx會將請求轉給有正常反饋的server。

我曾經嘗試過,在兩臺服務器一樣壓力的情況下,請求是均勻分給兩個不同的服務器的。


基於我相信大家已經對我說的“利用Nginx的反向代理能力,集合幾個負責不同功能的server節點,從而實現分佈式;也可以利用Nginx的負載均衡能力,集合幾個相同功能的server節點,從而實現服務的高穩定性”有了進一步的瞭解了。

以上是我的淺見,歡迎大家在下方評論留言。

我是蘇蘇思量,來自BAT的Java開發工程師,每天分享科技類見聞,歡迎關注我,與我共同進步。


一個存在感小透明


同時協作這個概念是不是題主理解錯了?

nginx作為反向代理使用負載均衡連接應用服務器,嚴格來說這幾個應用服務器的對外功能是一樣的!

譬如說整個業務系統是一個電商系統,那麼服務器上部署的應用服務彙總了會員註冊登錄,購物車,訂單,積分,支付等等服務,作為一個單一的服務軟件部署在服務器上,但是單一系統併發能力有限,所以才用nginx作為中介,連接多臺應用服務器,搭建了服務集群,對外提供統一的業務服務!這都是由nginx作為負載均衡中間層根據不同的均衡策略分發到不同的服務器上,不同的服務器之間可以有session,數據庫連接,緩存共享,但並不屬於相互協作範疇!



而如果是幾臺服務器之間的服務各自不同,比如說一臺服務器上是積分服務,一臺是訂單服務,一臺是SSO等等,這樣相互協同工作組成的系統叫分佈式系統!而這樣的分佈式服務,單純依靠nginx是做不到的,因為nginx的功能主要是做負載均衡分發,而不是作為各系統之間的數據中介!

一般分佈式服務(微服務),使用dubbo,spring boot形式的框架開發,相互之間通過某種協議(tcp,http等)相互調用,形成一種對外高度透明,統一的應用系統!而服務的註冊和發現通常使用zookeeper,eureka等服務器!

當然題目中提到的,使用nginx集成多臺業務系統服務得到的應用集群也屬於分佈式範疇,因為其中一臺機器宕機不影響整個系統的對外服務,應用分佈在不同的服務器節點上,形成一個高可用,穩定的系統!

分佈式系統作為大型高併發,高可用性的系統,一定會成為以後的架構主流,所以好好掌握分佈式才能不被out!


經過多年的開發生活,擁有多年的分佈式經驗,如果你在分佈式系統相關問題,諸如消息中間件,緩存,數據庫中間件,微服務等有疑惑,歡迎關注交流!


此生唯一


分佈式系統(distributed system)是建立在網絡之上的軟件系統。正是因為軟件的特性,所以分佈式系統具有高度的內聚性和透明性。因此,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操作系統),而不是硬件。內聚性是指每一個數據庫分佈節點高度自治,有本地的數據庫管理系統。透明性是指每一個數據庫分佈節點對用戶的應用來說都是透明的,看不出是本地還是遠程。在分佈式數據庫系統中,用戶感覺不到數據是分佈的,即用戶不須知道關係是否分割、有無副本、數據存於哪個站點以及事務


分享到:


相關文章: