為什么要使用集群?主要有兩方面原因:一是對于一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多臺機器組成的集群;另外一方面,隨著訪問量越來越大且業務邏輯越來越復雜,單臺機器的處理能力已經不足以處理如此多且復雜的邏輯,于是需要增加若干臺機器使整個服務處理能力得到提升。
如果說一個web應用不涉及會話的話,那么做集群是相當簡單的,因為節點都是無狀態的,集群內各個節點無需互相通信,只需要將各個請求均勻分配到集群節點即可。但基本所有web應用都會使用會話機制,所以做web應用集群時整個難點在于會話數據的同步,當然你可以通過一些策略規避復雜的額數據同步操作,例如前面說到的把會話信息保存在分布式緩存或數據庫中統一集中管理,如下圖,每個tomcat實例只需去寫入或讀取數據庫即可,避免了tomcat集群之間的通信。但這種方式也有不足,要額外引入數據庫或緩存服務,同時也要保證它們的高可用性,增加了機器和維護成本。
?
????鑒于以上存在的不足,提供另一種解決思路就是tomcat集群節點自身完成各自的數據同步,不管訪問到哪個節點都能找到對應的會話,如下圖,客戶端第一次訪問生成會話,tomcat自身會將會話信息同步到其他節點上,而且是每次請求完成都會同步此次請求過程中對session的所有操作,這樣一來下一次請求到集群中任意節點都能找到響應的會話信息,且能保證信息的及時性。細看很容易發現集群的節點之間的會話是兩兩互相復制的,一旦集群節點數量及訪問量大起來,將導致大量的會話信息需要互相復制同步,很容易導致網絡阻塞,而且這些同步操作很可能會成為整體性能的瓶頸,根據經驗,此種方案在實際生產上推薦的集群節點個數為3-6個,無法組建更大的集群,而且冗余了大量的數據,利用率不高。
?
全節點復制的網絡流量隨節點數量增加呈平方趨勢增長,也正是因為這個因素導致無法構建較大規模的集群,為了使集群節點能更加大,首要解決的就是數據復制時流量增長的問題,下節將介紹另外一種會話管理方式,每個會話只會有一個備份,它使會話備份的網絡流量隨節點數量的增加呈線性趨勢增長,大大減少了網絡流量和邏輯操作,可構建較大的集群。
喜歡java的同學可以加個好友:
