為什麼要使用集群?主要有兩方面原因:一是對於一些核心系統要求長期不能中斷服務,為了提供高可用性我們需要由多台機器組成的集群;另外一方面,隨著訪問量越來越大且業務邏輯越來越複雜,單台機器的處理能力已經不足以處理如此多且複雜的邏輯,於是需要增加若干臺機器使整個服務處理能力得到提公升。
如果說乙個web
應用不涉及會話的話,那麼做集群是相當簡單的,因為節點都是無狀態的,集群內各個節點無需互相通訊,只需要將各個請求均勻分配到集群節點即可。但基本所有
web應用都會使用會話機制,所以做
web應用集群時整個難點在於會話資料的同步。
當然你可以通過一些策略規避複雜的額資料同步操作,例如前面說到的把會話資訊儲存在分布式快取或資料庫中統一集中管理,如下圖,每個tomcat
例項只需去寫入或讀取資料庫即可,避免了
tomcat
集群之間的通訊。但這種方式也有不足,要額外引入資料庫或快取服務,同時也要保證它們的高可用性,增加了機器和維護成本。
鑑於統一將會話存放到資料庫或快取上存在的不足,提供另一種解決思路就是tomcat
集群節點自身完成各自的資料同步,不管訪問到哪個節點都能找到對應的會話,如下圖,客戶端第一次訪問生成會話,
tomcat
自身會將會話資訊同步到其他節點上,而且是每次請求完成都會同步此次請求過程中對
session
的所有操作,這樣一來下一次請求到集群中任意節點都能找到響應的會話資訊,且能保證資訊的及時性。而且任意乙個節點宕掉了也不影響整體對外的服務。
tomcat提供的第二種集群會話管理的機制就是單節點備份機制,下面看看這種方式具體的工作機制,集群一般是通過負載均衡對外提供整體服務,所有節點被隱藏在後端組成乙個整體。前面各種模式的實現都無需負載均衡協助,所以圖中都把負載均衡省略了。最常見的負載方式是前面用
apache
拖所有節點,它支援將類似「
326257da6db76f8d2e38f2c4540d1dea.tomcat1
」的會話
id進行分解,定位到
tomcat
集群中以
tomcat1
命名的節點上(這種方式稱為
session stick
,由apache jk
模組實現)。每個會話存在乙個原件和乙個備份,且備份與原件不會儲存在同乙個節點上,如下圖,例如當客戶端發起請求後通過負載均衡被分發到
tomcat1
例項節點上,生成乙個包含
.tomcat1
字尾的會話標識,並且
tomcat1
節點根據一定策略選出此次會話物件備份的節點,然後將包含了
的資訊傳送給
tomcat2
、tomcat3
、tomcat4
,如圖中虛線所示,這樣每個節點都有乙個會話
id、備份
ip列表,即每個節點都有每個會話的備份
ip位址。
完成上面一步後就是將會話內容備份到備份節點上,假如tomcat1的s1
、s2兩個會話的備份位址為
tomcat2
,則把會話物件備份到
tomcat2
中,類似的有
tomcat2把s3
會話備份到
tomcat4
,tomcat4把s4
、s5兩個對話備份到
tomcat3
,這樣集群中所有的會話都已經有了乙份備份。當
tomcat1
一直不出故障,由於
session stick
技術客戶端將一直訪問到
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應用...