我們得到了這個 JavaEE WebApp(JSP+Struts+Hibernate+MySQL),它目前在單一伺服器上運行。由於網站的成長和效能問題,我們決定將專案叢集到一些機器上。該網站應該能夠容忍每秒 5000 個請求。經過一些谷歌搜尋和閱讀內容後,我想出了一些策略來完成這項工作:
- 使用 Apache 作為前端負載平衡器和反向代理,一些 Tomcat 實例各自位於單獨的電腦上,最後是運行 MySQL 的資料庫伺服器。 Tomcat 實例可以根據需要進行擴充。
- 使用nginx作為前端負載平衡器和反向代理。其餘的就跟上面一樣了。
- 使用HA代理作為前端負載平衡器和反向代理。其餘的就跟上面一樣了。
我想在上述方法中,所有流量都應該通過前端負載平衡器(Apache、Nginx 或 HAProxy 伺服器)。這使得前端伺服器成為瓶頸,同時也是單點故障(SPOF)。是對的嗎?單一前端伺服器能否承受大型 Web 應用程式的所有流量?
為了解決這個問題,我想出了一個手工策略:
- 將登入頁面和驗證操作放在前端伺服器上(例如,可以從 myapp.com 存取它)。當使用者成功登入時,他會被重新導向到後端伺服器之一(例如 srv1.myapp.com)並在那裡繼續其活動。
那麼,我走的路正確嗎?
讓我知道您對這些方法的看法,如果您正在考慮更好的方法,請在此處提及。
答案1
將登入頁面放在前端伺服器上並重新導向到後端是一個壞主意。使用者可能會為您的後端伺服器添加書籤,最終可能會出現分佈不均的情況,並且當伺服器發生故障時,如果使用者位於同一會話中,他們仍然會嘗試存取它。
您需要的是主動/被動(心跳/起搏器/IP故障轉移/DNS 故障轉移) 或主動/主動 (DNS 輪詢/網路負載平衡)前端伺服器。
透過主動/被動,您的所有流量將被重新導向到一台前端伺服器,並有第二台備用伺服器(雙機熱備)。當第一個伺服器發生故障時,您會以某種方式進行故障轉移(透過重新分配 IP 位址或修改 DNS*)以指向第二個伺服器。
透過主動/主動,您將有兩個(或更多)伺服器持續處於活動狀態,使用以太坊DNS 輪詢或者IP/網路負載平衡在兩者之間(大致)均勻分配負載。然後,兩台伺服器將再次將負載分配給您的後端伺服器。
active/active 是大多數大型 Web 應用程式使用的方法(請參閱 Youtube/Google/Twitter/Wordpress.com/Tumblr 的 DNS 記錄,它們將為伺服器提供多個 IP 以進行 DNS 循環。
一旦您做出決定並實施它,您所要做的就是在解決方案之間進行選擇。我個人建議NGINX但每個人都有自己的偏好(HA代理,烏賊,切羅基,光速,F5(硬體),思科(硬體)和無數其他)。
不幸的是,對於這類問題,我們不能只說“這樣做”,因為這實際上取決於您的要求。研究上面的一些關鍵字,如果您有任何具體問題,請隨時提問。
*如果可能的話,應該避免基於 DNS 的故障轉移,有些用戶端會快取超出其 TTL 的 DNS,因此不太理想。
答案2
我不了解 nginx,但您可以在主動/被動配置中配對幾個 haproxy 負載平衡器,以防止 haproxy 成為單點故障。
也有商業解決方案,但由於某種原因,它們似乎沒有在伺服器故障上得到那麼多的“墨水”。