對于一個業務系統的Tomcat集群來說,必須保證同一個用戶訪問到任一臺服務器上都可以維持之前操作的身份。比如在服務器A進行了登陸,那么在服務器B中也要同步該用戶已登錄的狀態,這里就用到了Session的同步。
同步方式
sticky模式、復制模式、Terracotta模式(非Tomcat自帶)
sticky模式
把所有同一個session的請求,都發送到相同的節點,這樣就避免了Session的問題
復制模式
所有的節點都保證同一個Session,有一點點的改變都會進行廣播同步
實現方式:只要修改Tomcat的server.xml文件
修改Engine節點信息:
去掉 的注釋符
web.xml中增加
Terracotta模式
該方法是利用開源軟件Terracotta
Terracotta的基本原理是對于集群間共享的數據,當在一個節點發生變化的時候,Terracotta只把變化的部分發送給Terracotta服務器,然后由服務器把它轉發給真正需要這個數據的節點。
比較
sticky模式,失去了負載均衡的意義,把同一個人的請求始終分配到同一個服務器處理。
復制模式,容易引起流量洪災,每一次改變都要進行一次廣播,對網絡的影響很大。
Terracotta,比較適合的選擇,但是需要第三方開源軟件,配置比較繁瑣。
Session同步實例——Terracotta
1、下載Terracotta
http://d2zwv9pap9ylyd.cloudfront.net/terracotta-3.7.7.tar.gz
2、安裝
tar zxvf terracotta-3.4.1.tar.gz
mv terracotta-3.4.1 /usr/local/terracotta
3、配置Tomcat作為Terracotta客戶端
復制terracotta-session-1.3.7.jar和terracotta-toolkit-1.1-runtime-5.7.0.jar到Tomcat/lib目錄:CATALINA_HOME/lib
編輯 /var/lib/tomcat7/conf/context.xml文件
注意:className要根據Tomcat的版本進行修改。
4、配置Terracotta服務端
#拷貝配置文件例子
cp ./config-samples/tc-config-express-reference.xml ./tc-config.xml
#修改成自己的配置
vim ./tc-config.xml
注意:編輯的文件中注意修改:server和web-application
5、啟動Terracotta
啟動順序:管理 => 子節點
#進入目錄
cd /usr/local/terracotta
#復制tc-config.xml到bin目錄
mv tc-config.xml ./bin/
#配置java環境變量
vi ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.bashrc
(主服務器)運行Terracotta(注意加 & 丟到后臺執行)
./start-tc-server.sh &
各個子節點,配置好context.xml后重啟服務器
(各個子服務)重啟Tomcat
service tomcat7 restart
6、關閉Terracotta
子節點關閉tomcat
管理節點執行 ./stop-tc-server.sh -n apache