一人拾柴火不旺,眾人拾柴火焰高。Tomcat服務(wù)器也是一樣,一臺服務(wù)器再強大能承受的訪問也是有限的。要提供高并發(fā)、高可用的服務(wù),就必須橫向擴展,多臺Tomcat組成一個集群,根據(jù)實際的訪問量動態(tài)增減服務(wù)器的部署。
負(fù)載均衡的難點
我們一般用session來保持會話,所以Tomcat服務(wù)器是有狀態(tài)的。壞處是當(dāng)一臺宕機后自動跳轉(zhuǎn)到另一臺服務(wù)器可能會導(dǎo)致用戶會話失效,最明顯的例子就是要重新登錄。所以以下的幾種方法,都是在圍繞session的問題。
方案一、使用Tomcat自帶的session同步功能
如果我們使用nginx作為負(fù)載均衡服務(wù)器,它默認(rèn)使用是輪詢策略(也就是第一次請求分給服務(wù)器A,第二次分配給B,以此類推)。這種方案非常簡單,但是別忘了我們的session是放在訪問服務(wù)器上,輪詢得結(jié)果是下次我們可能訪問的是另一臺服務(wù)器了,導(dǎo)致我們的會話不能保持。
其實,解決起來也似乎很簡單,就是創(chuàng)建session時,只需要把它復(fù)制給集群中的所有服務(wù)器就行了,下次不管訪問哪一臺Tomcat,它都能根據(jù)sessionID找到我們的session。非常幸運的是,Tomcat本身就已經(jīng)幫我們實現(xiàn)了這個功能——session復(fù)制。我們只需簡單兩步配置即可:
在server.xml中打開以下注釋:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
在tomcat或者應(yīng)用下web.xml,添加:
<distributable/>
是不是非常簡單實用呢。
簡單歸簡單,不得不提的是,它有一個缺點,因為它默認(rèn)使用BackupManager,是all-to-all的復(fù)制,所以如果大量節(jié)點的集群會有廣播風(fēng)暴,而且即使沒有部署應(yīng)用的節(jié)點也會復(fù)制。所以對大規(guī)模的集群,這種方案需謹(jǐn)慎考慮哦。