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