[转]通过 Terracotta实现基于Tomcat的Web应用集群

 转载自:

http://blog.csdn.net/lima01/article/details/4379572

 

本文介绍如何配置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版本为:
    • Apache Tomcat 6.0.18
    • Apache Tomcat 5.5.26
    • Apache Tomcat 5.0.28
  • Terracotta 3.0或更高版本

安装过程

  1. 在所有机器上安装Java
    请参考目 前支持的软硬件平台
  2. 在所有机器上安装Terracotta
    • 选一台机器作为Terracotta服务器
    • 在所有运行Tomcat的机器上也安装Terracotta,他们将称为Terracotta客户端
  3. 在应用服务器节点上安装Tomcat
  4. 把要部署的Web应用部署在所有Tomcat上

配置过程

下载附件中的tc-config.xml文件 ,保存到 ${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>


您可能还需要修改Terracotta服务器的信息。比如:

 <server host="192.168.0.100"> <!-- IP or host name of TC server-->
       <dso-port>9510</dso-port>
 </server>



把配制好的tc-config.xml文件拷贝到所有机器上。然后在每一台机器上,进入TERRACOTTA_HOME目录,运行:

UNIX/LINUX 
bin/tim-get.sh upgrade tc-config.xml
<Windows 
bin/tim-get.bat upgrade tc-config.xml

 

配置Tomcat应用服务器

在Tomcat安装目录的bin子目录中创建startupTC.sh(Unix)或startupTC.bat(Windows)文件。其内容为:

UNIX/LINUX 
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
Windows 
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

启动集群

在Terracotta服务器上的Terracotta安装目录执行如下命令:

UNIX/LINUX 
bin/start-tc-server.sh &
Windows 
bin/start-tc-server.bat


在每一台Web应用服务器上的Tomcat安装目录的bin子目录下执行:

UNIX/LINUX 
./startupTC.sh
Windows 
startupTC.bat


等Tomcat启动以后,查看Tomcat日志文件,确认Terrocotta已经启动。比如在Mac环境中,使用Terracotta 3.0.1,看到的日志将包括如下内容:

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


如果能看到上述信息,说明Terracotta和Tomcat都正常启动,并且已经与Terracotta服务器成功建立了连接。

验证Session集群

集群启动后,我们可以利用Tomcat内置的Web应用examples来验证集群是否成功配置好。
比如有两台Tomcat服务器分别为http://192.168.0.101:8080和http://192.168.0.102:8080。
首先启动dev-concole.sh(Unix)或dev-console.bat(Windows),连接到Terracotta服务器上。您可以看 到所 有Tomcat节点都显示在Connected Clients中。另外在Object Browser中可以看到一个共享数据:
tc:session_localhost/examples
说明所有session已经被共享到Terracotta服务器上了。

下面把浏览器指向:
http://localhost:8088/examples/jsp/cal/login.html
输入姓名和EMail。点击Submit进入下一级页面。
这时您可能会看到服务器抛出com.tc.exception.TCNonPortableObjectError异常。仔细查看异常信息会发现原来该例 子程序所需的一些类没有包含在tc-config.xml的instrumented-classes配置中。因此需要打开tc-config.xml配 置文件,把如下配置添加到<application><dso>中:

<instrumented-classes>
       <include>
             <class-expression>cal.*</class-expression>
        </include>
    </instrumented-classes>

重新启动Tomcat。再打开前面的页面。
您可能还会遇见TCNonPortableObjectError,不过这次的错误是有关boot jar的:

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.

只要认真阅读错误信息,按照提示的方法配置tc-config.xml文件,然后执行下面的命令重新生成boot jar文件,再重新启动Tomcat就可以了:

$TERRACOTTA_HOME/bin/make-boot-jar.sh -f $TOMCAT_HOME/tc-config.xml


处理完上述问题后,例子程序中会显示一个日历管理系统。您可以在里面配置一天的工作日程。
在第一台Tomcat服务器上配置好一天的日程,然后到第二台服务器上,打开相同的页面,您会看到前面输入的日程已经显示出来了。您还可以试着在第二台服 务器上对日程进行修改,再到第一台上面刷新页面,前面的修改也会立即显示出来。这说明两台Tomcat服务器的session信息已经完全同步了。

错误处理

1. 如果启动失败,有可能是JAVA_OPTS没有配置好。
可以尝试在startupTC文件中,在set JAVA_OPTS后面打印出JAVA_OPTS的内容。应该看到类似下面的内容:

-Xmx512m -Xms512M -Xbootclasspath/p:/Users/lma/terracotta/terracotta-3.0.1/lib/dso-boot/dso-boot-hotspot_osx_150_19.jar -Dtc.install-root=/Users/lma/terracotta/terracotta-3.0.1 -Dtc.config=/Users/lma/tc-config.xml


2. 如果遇见TCNonPortableObjectException异常,说明在Session中共享的类没有包含在tc-config.xml的 instrumented-classes配置中。一般在异常新吸力面Terracotta会包含需要添加到配置文件中的信息,比如:

<instrumented-classes>
         <include>
           <class-expression>num.NumberGuessBean</class-expression>
         </include>
         <instrumented-classes>
    </instrumented-classes>

只要按照提示把配置信息放到tc-config.xml文件中,然会从新启动Tomcat即可。

 

附件-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>

<iframe id="cproIframe1" src="http://cpro.baidu.com/cpro/ui/uijs.php?rs=300&amp;tu=117306&amp;tn=text_default_728_90&amp;n=csdnbaidu_cpr&amp;adn=3&amp;rsi1=90&amp;rsi0=728&amp;rad=&amp;rss0=%23FFFFFF&amp;rss1=%23FFFFFF&amp;conOP=0&amp;rss2=%230000ff&amp;rss3=%23444444&amp;rss4=%23008000&amp;rss5=&amp;rss6=%23e10900&amp;rsi5=4&amp;ts=1&amp;at=103&amp;ch=0&amp;cad=1&amp;aurl=&amp;rss7=&amp;cpa=1&amp;fv=11&amp;cn=1&amp;if=16&amp;word=http%3A%2F%2Fblog.csdn.net%2Flima01%2Farticle%2Fdetails%2F4379572&amp;refer=http%3A%2F%2Fblog.csdn.net%2Flima01%2Farticle%2Fcategory%2F566829&amp;ready=1&amp;jk=175ae41f7dd6a445&amp;jn=3&amp;lmt=1374468083&amp;csp=1366,768&amp;csn=1366,728&amp;ccd=32&amp;chi=12&amp;cja=true&amp;cpl=21&amp;cmi=42&amp;cce=true&amp;csl=zh-CN&amp;did=1&amp;rt=9&amp;dt=1374496883&amp;ev=50331648&amp;c01=0&amp;prt=1374496883208&amp;i3=f&amp;anatp=0&amp;stid=0&amp;lunum=6" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" align="center,center" width="728" height="90"></iframe>
查看评论
12楼   licdhemin 2012-02-15 16:13发表 [回复]
配置文件:
<?xml version="1.0" encoding="UTF-8"?>

<tc:tc-config xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd" xmlns:tc="http://www.terracotta.org/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
<servers>
<server host="10.8.10.95">
<dso-port>9510</dso-port>
</server>
<update-check>
<enabled>true</enabled>
</update-check>
</servers>
<clients>
<modules>
<module name="tim-tomcat-6.0" version="2.3.1"/>
</modules>
</clients>
<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>web_app1</web-application>
<web-application>web_app2</web-application>
</web-applications>  

</dso>
</application>
</tc:tc-config>
11楼   licdhemin 2012-02-15 16:11发表 [回复]
我这里按照您说的方式进行搭建环境,但是没有成功出线session的复制,查找中文论坛和官方的文档,发现对于tomcat的问题还是很多,不知马力老师那里能不能再次的出一份文档,为tomcat的集群从安装到搭建的完整的步骤呢?

我的环境是 terracotta-ee-3.6.1
tomcat-6.0.18
windows xp系统
谢谢
10楼   licdhemin 2012-02-14 17:10发表 [回复]
我这里按照您说的方式进行搭建环境,但是没有成功出线session的复制,查找中文论坛和官方的文档,发现对于tomcat的问题还是很多,不知马力老师那里能不能再次的出一份文档,为tomcat的集群从安装到搭建的完整的步骤呢?
9楼   rrrrrr11111111111111 2010-09-29 19:17发表 [回复]
谁有成功配置的经验啊,给我分享一下吧!
8楼   mousehu 2010-04-08 16:10发表 [回复]
terracotta 3.2.1 中会话复制部分确实变化挺大的。http://www.groovyq.net/node/150 这个就是3.2.1的会话复制,也是使用tomcat,只是内容简单了些,希望有帮助
7楼   lima01 2010-03-17 04:15发表 [回复]
example是你的web应用名。如果你有多个web应用,那的确是需要一个一个都放进来的。
不过Terracotta最新的3.2.1版本提供了express模式,不再需要配置tc-config.xml了。可以下来试试看。方便了很多。

我好久没时间更新博客了。最近一定找时间把Terracotta的新功能都介绍一下。

老马
6楼   mihokomatsu 2010-03-11 16:55发表 [回复]
马大哥,看你的文章很多次了,我想知道:&lt;web-application&gt;examples&lt;/web-application&gt;中的examples是不是工程名,如果是工程名的话,那是不是要把自己的工程部署到terracotta上啊,如果是,工程将放在哪里?不是的话&#183;&#183;怎么理解?

谢谢
5楼   流子 2010-01-02 18:39发表 [回复]
Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。这里的“真正需要这个数据的节点”如何确定?
Re:   lima01 2010-01-27 05:53发表 [回复]
回复 jiangguilong2000:
Terracotta服务器会记录所有共享数据目前的使用情况,包括哪些节点正在引用这些数据。当一个数据被改变的时候,Terracotta自然就知道应该向哪些节点通知这一变化。
4楼   cuker007 2009-10-26 14:37发表 [回复]
能给一个tim-equinox-3.5.1使用的例子吗。
3楼   liuyunfengheda 2009-10-20 16:13发表 [回复]
我所遇到的问题,请马力老师查看
http://blog.csdn.net/liuyunfengheda/archive/2009/10/20/4704206.aspx
如果是tomcat版本的原因的话,测试的结果我会告诉您!
2楼   lima01 2009-10-20 12:12发表 [回复]
finikes在官方论坛上说了他的经验。主要是Tomcat下载的版本的问题:
http://forums.terracotta.org/forums/posts/list/2604.page

问题解决!  
tomcat6的问题  
windows系统下不要用msi安装版,换zip直接解压版的tomcat6,那里面有startup.bat  
用java -jar startup.jar就是不行。

不知道会不会对你有帮助。如果还不行,请把配置文件,启动脚本等发给我看看。

Good luck!
1楼   liuyunfengheda 2009-10-19 18:52发表 [回复]
我这里按照您说的方式进行搭建环境,但是没有成功出线session的复制,查找中文论坛和官方的文档,发现对于tomcat的问题还是很多,不知马力老师那里能不能再次的出一份文档,为tomcat的集群从安装到搭建的完整的步骤呢?

你可能感兴趣的:(tomcat,Web,session,负载均衡,集群服务器)