在 Tomcat 中水平擴展 Web 應用程序(負載平衡/集群)
我開發了一個由 2 個基本模組組成的簡單 REST 風格的 Web 應用程序。
模組#1:伺服器暴露 REST Web 服務,無狀態,部署在 Tomcat 中
模組#2:REST 客戶端有一個部署了 Module#1 的 Tomcat 實例。
我想水平擴展它並在第二台機器上執行第二個 Tomcat。在負載平衡/集群方面,我完全是新手,這就是我需要幫助的原因。不需要會話複製和故障轉移。
我應該如何處理它?
我做了一項研究,這些是我看到的可能的方法:
1.無集群,無第三方代理。
我在第二台機器上執行第二台 Tomcat。由於我可以控制客戶端和伺服器,因此我可以在客戶端提供一個非常基本的算法並隨機選擇一個主機,該主機將在 API 呼叫之前選擇。無需配置集群,也無需提供第三方代理。有沒有潛在的陷阱?這是一個正確的方法嗎?
2.Tomcat集群
當談到 Tomcat 集群配置時,這是否意味著有 2 個 Tomcat 在單獨的機器上執行並且它們的配置說它們是一個集群?我需要一個單獨的庫和工具嗎?Tomcat 夠用嗎?我會像第一種方法一樣執行 2 個程序嗎?
3.Tomcat負載均衡器
Tomcat集群和Tomcat負載均衡器有什麼區別?同樣,我是否需要一個單獨的庫和工具?Tomcat 夠用嗎?
4.第三方代理
我發現了一些關於 HAProxy 之類的資訊。這是否意味著所有呼叫都通過它,並且代理決定選擇哪個主機?這是否意味著除了兩個 Tomcat 程序之外,還會有第三個單獨執行?假設我在兩台不同的機器上有 2 個 Tomcat,這個代理在哪台機器上執行?
我應該選擇哪一個?我是不是誤會了什麼?文章,答案讚賞。
首先,您看到了load balance (without cluster) 和Cluster with replication兩個選項之間的區別。
分群具有形式意義。集群是一組試圖實現共同目標並相互了解的資源。集群通常涉及設置資源(通常是伺服器)以在特定通道(埠)上交換詳細資訊並不斷交換它們的狀態,因此資源的狀態也會在其他地方複製。它通常還包括負載均衡,其中,根據負載均衡策略將請求路由到集群中的某個資源。
集群架構用於解決以下一個或多個問題:
- 單個伺服器無法有效處理大量傳入請求
- 如果伺服器出現故障,有狀態的應用程序需要一種保存會話數據的方法
- 開發人員需要能夠在不中斷服務的情況下對其應用程序進行配置更改或部署更新。
集群架構使用負載平衡、多台伺服器處理平衡負載和會話複製的組合來解決這些問題。
在您的情況下,不需要會話複製,為此我認為集群配置不是您需要的方法。
文件:Apache Tomcat - 集群/會話複製 HOW-TO
當我們有多個具有相同設置的獨立伺服器時,負載平衡也可以在沒有集群的情況下發生,但除此之外,彼此不知道。然後,我們可以使用負載平衡器將請求轉發到一台伺服器或另一台伺服器,但一台伺服器不使用另一台伺服器的資源。此外,一種資源不與其他資源共享其狀態。
負載均衡器的基本特徵是能夠根據調度算法將傳入請求分佈在集群中的多個後端伺服器上。
在這兩種架構上,您都需要實現負載均衡器的東西,為此,一種選擇是使用Apache HTTP Server。
要在 Apache Http Server 中實現負載均衡器,您有一些選項:
- 使用
JK native connector
- 使用 Apache HTTP
mod_proxy
參考: