对于一个业务系统的Tomcat集群来说,必须保证同一个用户访问到任一台服务器上都可以维持之前操作的身份。比如在服务器A进行了登陆,那么在服务器B中也要同步该用户已登录的状态,这里就用到了Session的同步。
同步方式
sticky模式、复制模式、Terracotta模式(非Tomcat自带)
sticky模式
把所有同一个session的请求,都发送到相同的节点,这样就避免了Session的问题
复制模式
所有的节点都保证同一个Session,有一点点的改变都会进行广播同步
实现方式:只要修改Tomcat的server.xml文件
- 修改Engine节点信息:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
- 去掉
<Cluster> <\Cluster>
的注释符 - web.xml中增加
<distributable/>
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文件
<Context sessionCookiePath="/"> <!-- 增加此配置 --> <Valve className="org.terracotta.session.TerracottaTomcat70xSessionValve" tcConfigUrl="172.29.131.138:9510"/> </Context>
注意: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