http://forums.terracotta.org/forums/posts/list/2342.page
官方论坛详细问题
本教程介绍如何配置Tomcat和Terracotta服务器将普通的Web应用部署到集群中,实现跨Tomcat节点的session复制,以达到负载均衡、提高系统吞吐量和灾难恢复的效果。
基本原理简介
一般利用Tomcat搭建Web应用集群有如下几种方法:
1、利用负载均衡器的粘session的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各 个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;
2、利用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列化 (serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采 用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了;
3、第三种方式是通过cookie保存用户信息的一个或几个关键字,每一个http请求到达web应用的时候,web程序拿这个关键字到数据库中读取相关 的数据,然后对其进行处理。也就是说把session数据保存到了数据库中。这样以来在内存中的session就完全不需要了。这样做的缺点就是加大了数 据库的负载,使得数据库变成了集群的瓶颈。而通过构造数据库集群提高负载能力往往需要高额的成本。
Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服 务器,然后由服务器把它转发给真正需要这个数据的节点。这样对网络的压力就非常小,各个节点也不必浪费CPU时间和内存进行大量的序列化操作。把这种集群 间数据共享的机制应用在session同步上,相当于对tomcat第二种集群实现机制进行了优化,既避免了对数据库的依赖,又能达到负载均衡和灾难恢复 的效果。在对比测试中,采用Terracotta搭建Tomcat集群,节点达到8个时候,整个集群的吞吐量还一直是线性增长的。
为了方便使用Terracotta搭建Tomcat集群,Terracotta提供了专门的插件tim-tomcat。下面将对集群的搭建进行详细描述。
准备工作
首先需要下载如下软件:
* Apache Tomcat
目前Terracotta官方支持的Tomcat版本为:
o Apache Tomcat 6.0.18
o Apache Tomcat 5.5.26
o Apache Tomcat 5.0.28
* Terracotta 3.0或更高版本
安装过程
1. 在所有机器上安装Java
请参考目前支持的软硬件平台
2. 在所有机器上安装Terracotta
* 选一台机器作为Terracotta服务器
* 在所有运行Tomcat的机器上也安装Terracotta,他们将称为Terracotta客户端
3. 在应用服务器节点上安装Tomcat
4. 把要部署的Web应用部署在所有Tomcat上
配置过程
下载附件中的Terracotta 配置文件,保存到 ${TERRACOTTA_HOME}/tc-config.xml(Unix上)或者 ${TERRACOTTA_HOME}\tc-config.xml(Windows上)。
修改web-applications和web-application部分,把要共享session的应用的contex配置上:
<web-applications>
<web-application>my_web_app1</web-application>
<web-application>my_web_app2</web-application>
</web-applications>
<server host="192.168.0.100">
<dso-port>9510</dso-port>
</server>
bin/tim-get.sh upgrade tc-config.xml
bin\tim-get.bat upgrade tc-config.xml
TC_INSTALL_DIR=<本地Terracotta安装目录>
TC_CONFIG_PATH=<本地tc-config.xml的完整文件名>
. $TC_INSTALL_DIR/bin/dso-env.sh -q
export JAVA_OPTS="$JAVA_OPTS $TC_JAVA_OPTS"
. startup.sh
set TC_INSTALL_DIR=<本地Terracotta安装目录>
set TC_CONFIG_PATH=<本地tc-config.xml的完整文件名>
call %TC_INSTALL_DIR%\bin\dso-env.bat -q
set JAVA_OPTS=%JAVA_OPTS% %TC_JAVA_OPTS%
startup.bat
bin/start-tc-server.sh &
bin\start-tc-server.bat
./startupTC.sh
startupTC.bat
2009-07-17 10:57:39,425 INFO - Terracotta 3.0.1, as of 20090514-130552 (Revision 12704 by cruise@su10mo5 from 3.0)
2009-07-17 10:57:39,828 INFO - Configuration loaded from the file at '/Users/lma/tc-config.xml'.
2009-07-17 10:57:39,975 INFO - Log file: '/Users/lma/apps/tomcat-5.5.27/bin/logs/client-logs/terracotta-client.log'.
2009-07-17 10:57:42,312 INFO - Connection successfully established to server at 192.168.0.102:9510
tc:session_localhost/examples
<instrumented-classes>
<include>
<class-expression>cal.*</class-expression>
</include>
</instrumented-classes>
com.tc.exception.TCNonPortableObjectError:
*******************************************************************************
Attempt to share an instance of a non-portable class referenced by a portable class. This unshareable class must be in the DSO boot jar. It also has superclasses which must be in the DSO boot jar. Please add all of these classes to the boot jar configuration and re-create the DSO boot jar.
$TERRACOTTA_HOME/bin/make-boot-jar.sh -f $TOMCAT_HOME/tc-config.xml
<tc:tc-config xmlns:tc="http://www.terracotta.org/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd">
<servers>
<!-- For more information on working with the Terracotta configuration file, including how to add
more servers, see http://www.terracotta.org/web/display/docs/About+Terracotta+Configuration+Files.
Edit the following server element so that its host attribute contains the value matching the
hostname for the Terracotta server. -->
<server host="localhost">
<dso-port>9510</dso-port>
</server>
<update-check>
<enabled>true</enabled>
</update-check>
</servers>
<!-- Check that the TIM shown in the <module> element's name attribute matches the Tomcat version you
are using. The TIM listed here, "tim-tomcat-5.5" is for Tomcat 5.5. For example, if you are using
Tomcat 6.0, edit the name to "tim-tomcat-6.0". -->
<clients>
<modules>
<module name="tim-tomcat-6.0" version="1.1.0" />
</modules>
</clients>
<!-- Using <web-application> elements, enter the context root of the web application being clustered.
If you are clustering more than one web application, use one <web-application> element per application.
Two example <web-application> elements are shown below. Edit or remove these elements as needed.
To set the value of the <web-application> element to the default web-application context, use the
special value "ROOT" (without quotation marks). -->
<application>
<dso>
<instrumented-classes>
<include>
<class-expression>num.NumberGuessBean</class-expression>
</include>
<include>
<class-expression>cal.*</class-expression>
</include>
</instrumented-classes>
<web-applications>
<web-application>examples</web-application>
</web-applications>
</dso>
</application>
</tc:tc-config>