tomcat集群機制剖析及其生產部署選型

2021-12-30 05:12:31 字數 2686 閱讀 5325

為什麼要使用集群?主要有兩方面原因:一是對於一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多台機器組成的集群;另外一方面,隨著訪問量越來越大且業務邏輯越來越複雜,單台機器的處理能力已經不足以處理如此多且複雜的邏輯,於是需要增加若干臺機器使整個服務處理能力得到提公升。

如果說乙個web應用不涉及會話的話,那麼做集群是相當簡單的,因為節點都是無狀態的,集群內各個節點無需互相通訊,只需要將各個請求均勻分配到集群節點即可。但基本所有web應用都會使用會話機制,所以做web應用集群時整個難點在於會話資料的同步。

當然你可以通過一些策略規避複雜的額資料同步操作,例如前面說到的把會話資訊儲存在分布式快取或資料庫中統一集中管理,如下圖,每個tomcat例項只需去寫入或讀取資料庫即可,避免了tomcat集群之間的通訊。但這種方式也有不足,要額外引入資料庫或快取服務,同時也要保證它們的高可用性,增加了機器和維護成本。

鑑於統一將會話存放到資料庫或快取上存在的不足,提供另一種解決思路就是tomcat集群節點自身完成各自的資料同步,不管訪問到哪個節點都能找到對應的會話,如下圖,客戶端第一次訪問生成會話,tomcat自身會將會話資訊同步到其他節點上,而且是每次請求完成都會同步此次請求過程中對session的所有操作,這樣一來下一次請求到集群中任意節點都能找到響應的會話資訊,且能保證資訊的及時性。而且任意乙個節點宕掉了也不影響整體對外的服務。

tomcat提供的第二種集群會話管理的機制就是單節點備份機制,下面看看這種方式具體的工作機制,集群一般是通過負載均衡對外提供整體服務,所有節點被隱藏在後端組成乙個整體。前面各種模式的實現都無需負載均衡協助,所以圖中都把負載均衡省略了。最常見的負載方式是前面用apache拖所有節點,它支援將類似「326257da6db76f8d2e38f2c4540d1dea.tomcat1」的會話id進行分解,定位到tomcat集群中以tomcat1命名的節點上(這種方式稱為sessionstick,由apachejk模組實現)。每個會話存在乙個原件和乙個備份,且備份與原件不會儲存在同乙個節點上,如下圖,例如當客戶端發起請求後通過負載均衡被分發到tomcat1例項節點上,生成乙個包含.tomcat1字尾的會話標識,並且tomcat1節點根據一定策略選出此次會話物件備份的節點,然後將包含了的資訊傳送給tomcat2、tomcat3、tomcat4,如圖中虛線所示,這樣每個節點都有乙個會話id、備份ip列表,即每個節點都有每個會話的備份ip位址。

完成上面一步後就是將會話內容備份到備份節點上,假如tomcat1的s1、s2兩個會話的備份位址為tomcat2,則把會話物件備份到tomcat2中,類似的有tomcat2把s3會話備份到tomcat4,tomcat4把s4、s5兩個對話備份到tomcat3,這樣集群中所有的會話都已經有了乙份備份。當tomcat1一直不出故障,由於sessionstick技術客戶端將一直訪問到tomcat1節點上,保證一直能獲取到會話。而當tomcat1出故障了,這時tomcat也提供了乙個failover機制,apache感知到後端集群tomcat1節點被移除了,這時它會把請求隨機分配到其他任意節點上,接下去會有兩種情況:

①剛好分到了備份節點tomcat2上,此時仍能獲取到s1會話,除此之外,tomcat2還要另外做的事是將這個s1會話標記為原件且繼續選取乙個備份位址備份s1會話,這樣一來又有了備份。

②假如分到了非備份節點tomcat3,此時肯定找不到s1會話,於是它將向集群所有節點發問,「請問誰有s1會話的備份ip位址資訊?」,因為只有tomcat2有s1的備份位址資訊,它接收到詢問後應答告知tomcat3節點s1會話的備份在tomcat2,根據這個資訊就能查到s1會話了,並且tomcat3在自己本地生成s1會話並標為原件,tomcat2上的副本不變,這樣一來同樣能找到s1會話,正常完整整個請求處理。

以上兩種模型都有各自的優缺點,在實際生產上部署應該根據實際情況選擇適合的模型。

對於全節點會話同步模型

細看很容易發現集群的節點之間的會話是兩兩互相複製的,一旦集群節點數量及訪問量大起來,將導致大量的會話資訊需要互相複製同步,很容易導致網路阻塞,而且這些同步操作很可能會成為整體效能的瓶頸,根據經驗,此種方案在實際生產上推薦的集群節點個數為3-6個,它無法組建更大的集群,而且冗餘了大量的資料,利用率較低。

對於集群增量會話管理器,可通過配置server.xml檔案使用它,在tomcat中使用集群模式需要在節點下新增節點,而集群增量會話管理器正是在此節點下新增乙個子節點。

對於會話備份模型

針對上面全節點會話同步模型的網路流量隨節點數量增加呈平方趨勢增長的問題,也正是因為這個因素導致無法構建較大規模的集群,為了使集群節點能更加大,首要解決的就是資料複製時流量增長的問題,tomcat提出會話備份模型對前面的模型進行優化,它使會話備份的網路流量隨節點數量的增加呈線性趨勢增長,每個會話只會有乙個備份,大大減少了網路流量和邏輯操作,此模型可構建較大的集群。生產上可以組成十個以上的節點作為乙個集群。

對於集群備份會話管理器,可通過配置server.xml檔案使用它,它的配置與deltamanager的配置基本相似,在節點下新增乙個子節點。

使用這種模型也要考慮到,雖然這種模式支援更大的集群,但它只有乙個資料備份,假如剛好源資料和備份資料所在的機器同時宕掉了,則沒辦法恢復資料,不過剛好同時宕機的機率很小很小。

tomcat集群機制剖析及其生產部署選型

為什麼要使用集群?主要有兩方面原因 一是對於一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多台機器組成的集群 另外一方面,隨著訪問量越來越大且業務邏輯越來越複雜,單台機器的處理能力已經不足以處理如此多且複雜的邏輯,於是需要增加若干臺機器使整個服務處理能力得到提公升。如果說乙個web 應...

tomcat集群機制剖析及其生產部署選型

為什麼要使用集群?為什麼要使用集群?主要有兩方面原因 一是對於一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多台機器組成的集群 另外一方面,隨著訪問量越來越大且業務邏輯越來越複雜,單台機器的處理能力已經不足以處理如此多且複雜的邏輯,於是需要增加若干臺機器使整個服務處理能力得到提公升。集...

tomcat集群機制剖析及其生產部署選型

為什麼要使用集群?主要有兩方面原因 一是對於一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多台機器組成的集群 另外一方面,隨著訪問量越來越大且業務邏輯越來越複雜,單台機器的處理能力已經不足以處理如此多且複雜的邏輯,於是需要增加若干臺機器使整個服務處理能力得到提公升。如果說乙個web 應...