為了增加tomcat的性能和穩定性,我們一般采用balance和session同步機制。 下圖列出了我們常用也是最簡單的解決方案。

balance和session
1、 balance
負載均衡我們一般采用Apache proxy和Apache+mod_jk方式
所使用軟體:Apache2.2.19 http://httpd.apache.org/download.cgi#apache22;
Tomcat7 http://tomcat.apache.org/download-70.cgi
proxy、proxy_blancer和mod_jk的比較
proxy的缺點是,當其中一台tomcat停止運作的時候,apache仍然會轉發請求過去,導緻502網關錯誤。但是隻要伺服器再啟動就不存在這個問題。
mod_jk方式的優點是,Apache 會自動檢測到停止掉的tomcat,然後不再發請求過去。
缺點就是,當停止掉的tomcat伺服器再次啟動的時候,Apache檢測不到,仍然不會轉發請求過去。
proxy和mod_jk的共同優點是.可以隻将Apache置于公網,節省公網IP位址資源。
可以通過設定來實作Apache專門負責處理靜态網頁,讓Tomcat專門負責處理jsp和servlet等動态請求。
共同缺點是:如果前置Apache代理伺服器停止運作,所有叢集服務将無法對外提供。
proxy和mod_jk對靜态頁面請求的處理,都可以通設定來選取一個盡可能優化的效果。
mod_proxy_balancer和mod_jk都需要修改tomcat的配置檔案配合
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
這三種Tomcat叢集方式對實作最佳負載均衡都有一定不足,mod_proxy_balancer和mod_jk相對好些,mod_jk的設定能力更強些。lbfactor參數來配置設定請求任務。
apache自帶mod_proxy功能子產品中目前隻可以實作兩種不同的負載均衡叢集實作方式,第一種是分工合作的的形式,通過各台主機負責不同的任務而實 現任務分工。第二種是不同的機器在擔任同樣的任務,某台機器出現故障主機可以自動檢測到将不會影響到用戶端,而第一種卻不能實作但第一種實作方式的優點在 于他是主伺服器負擔相應沒第二種大因為台隻是提供跳轉指路功能,形象的說他不給你帶路隻是告訴你有條路可以到,但到了那是否可以看到你見的人他已經不會去管你了。相比之下第二種性能要比第一種會好很多;但他們都有個共同點都是一托N形式來完成任務的是以你的主機性能一定要好。
2、 session同步
對于tomcat的叢集有兩種方式,這個主要是針對session而言的。一種就是sticky模式,即黏性會話模式;另外一種就是session複制模式了。
2.1 sticky模式
利用負載均衡器的sticky模式的方式把所有同一session的請求都發送到相同的Tomcat節點。這樣不同使用者的請求就被平均配置設定到叢集 中各個tomcat節點上,實作負載均衡的能力。這樣做的缺點是沒有災難恢複的能力。一旦一個節點發生故障,這個節點上所有的session資訊全部丢 失;
這種方式其實是由前端balancer實作的,基本不需要webServer做任何改動(隻需要修改jvmRoute="tomcat1")
同一使用者同一session隻和一個webServer互動,一旦這個webserver發生故障,本次session将丢失,使用者不能繼續使用
2.2 複制模式
利用Tomcat session複制的機制使得所有session在所有Tomcat節點中保持一緻。當一個節點修改一個session資料的時候,該節點會把這個 session的所有内容序列化,然後廣播給所有其它節點。這樣當下一個使用者請求被負載均衡器配置設定到另外一個節點的時候,那個節點上有完備的 session資訊可以用來服務該請求。這種做法的問題是對session哪怕有一點點修改,也要把整個sessions資料全部序列化 (serialize),還要廣播給叢集中所有節點,不管該節點到底需不需要這個session。這樣很容易會造成大量的網絡通信,導緻網絡阻塞。一般采 用這種方式,當Tomcat節點超過4個時候,整個叢集的吞吐量就不能再上升了;
此方式是通過tomcat本身提供的功能,隻需要修改server.xml檔案
(1)修改Engine節點資訊: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
(2)去掉<Cluster> <\Cluster> 的注釋符
(3)web.xml中增加 <distributable/>
2.3 Terracotta模式
另一種方式就是利用開源軟體Terracotta。Terracotta的基本原理是對于叢集間共享的資料,當在一個節點發生變化的時 候,Terracotta隻把變化的部分發送給Terracotta伺服器,然後由伺服器把它轉發給真正需要這個資料的節點。這樣對網絡的壓力就非常小, 各個節點也不必浪費CPU時間和記憶體進行大量的序列化操作。把這種叢集間資料共享的機制應用在session同步上,相當于對tomcat第二種叢集實作 機制進行了優化,既避免了對資料庫的依賴,又能達到負載均衡和災難恢複的效果。在對比測試中,采用Terracotta搭建Tomcat叢集,節點達到8 個時候,整個叢集的吞吐量還一直是線性增長的。
2.4 三種模式比較
sticky模式最大的缺點就是不支援failover,一旦某一個webServer發生故障則此節點上的session就會丢失,是以不建議使用。
複制模式可以保證個别節點發生故障不丢失session,但是複制時需要序列化資料這會影響到系統的性能。
另外性能随着伺服器增加急劇下降,而且容易引起廣播風暴。經測試當Tomcat節點超過4個時候,整個叢集的吞吐量就不能再上升了。
需要修改server.xml和web.xml檔案