近段时间一直在做jetty集群的session共享,刚开始想使用memcache,跟同事讨论之后决定采用性能更好的terracotta,但谁也没有做过,且中文文档少得可怜,且仅有的几个中文文档都是关于jetty6.1.5和terracotta的,而jetty7和jetty6差别蛮大的,但其实配置差不多的,接连配置下来,还是遇到好些问题。
架构:LVS+Jetty7.5+terracotta+nagios+mysql集群来进行的,体系结构就不多说了,网上很多的,本文就在于Jetty7.5+terracotta部分。
terracotta分为server端和client端,具体的可以看官方文档的体系结构介绍:
server端:运行terracotta软件
client端:和webapp一起运行在应用服务器上,也就是和jetty7容器一起运行
准备工作:
下载terracotta3.7http://www.terracotta.org/
server端安装:
在其中一台服务器(我这里使用的centos5.5)上操作:
1、解压tar包到/usr/loca/terracotta下(这个目录是我事先建立好的)。
2、进入该目录下:(这个目录官方文档上叫做‘<terracotta>’)
cd /usr/local/terracotta/terracotta-3.7.0/
3、修改该目录下的config-samples目录下的tc-config.xml文件(默认没有这个文件,只有一个包含全部配置项目的sample文件,将该文件复制后修改为这个名字就可以了)
(具体这个文件中的配置是什么意思请看我博客中的另外一篇,详细讲述了配置项的功能和含义):
<?xml version="1.0" encoding="UTF-8" ?>
<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-6.xsd">
<tc-properties>
<property name="l2.nha.dirtydb.autoDelete" value="true"/>
<property name="l1.cachemanager.enabled" value="true"/>
<property name="logging.maxLogFileSize" value="1024"/>
</tc-properties>
<system>
<configuration-model>development</configuration-model>
</system>
<servers>
<server host="terracotta" name="my_server" bind="192.168.0.182">
<data>/opt/terracotta/server-data</data>
<logs>/opt/terracotta/server-logs</logs>
</server>
</servers>
<clients>
<logs>logs-%i</logs>
</clients>
</tc:tc-config>
注意server的host属性,可以直接配置为IP,如果配置为其他名称,比如terracotta,则在客户端的/etc/hosts文件中要配置解析对象:192.168.0.182 terracotta 才行,要不然会报无法解析域名的错误。logs-%i直接修改为logs-182,这个%i代表本机的IP地址
4、server端就配置完了,是最简单的配置,如需添加其余的配置只需要按照我的另外一篇博客的说明添加就好了,但还是要注意你自己业务或性能需求。
client端:
client端的配置也很简单,只需要在web.xml文件中添加一个过滤器就可以了:
<filter>
<filter-name>terracotta</filter-name>
<filter-class>org.terracotta.session.TerracottaJetty74xSessionFilter</filter-class>
<init-param>
<param-name>tcConfigUrl</param-name>
<param-value>192.168.0.182:9510</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>terracotta</filter-name>
<url-pattern>/*</url-pattern>
<!-- Enable all available dispatchers. -->
<dispatcher>ERROR</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
就是这个TerracottaJetty74xSessionFilter过滤器,这个过滤器是terracotta提供的,所以还需要terracotta的jar包支持:terracotta-session-1.3.0.jar,terracotta-toolkit-1.6-runtime-5.0.0.jar
tcConfigUrl指的就是这个客户端要去那个URL(server所在地)下载配置文件来对客户端进行配置(r如果有多个server--就是所谓的terracotta集群,则需要使用都好进行分隔),这就保证了不论有多少客户端,配置都是一样的,端口9510是默认的,如果要修改,那么在server端的tc-config.xml文件中也需要修改。
配置完了,就可以启动了,注意,先启动terracotta server端:(通过-f参数来指定我们自己的配置文件)
./start-tc-server.sh -f ../config-samples/tc-config.xml
等启动完成了:
Terracotta Server instance has started up as ACTIVE node on 192.168.0.182:9510 successfully, and is now ready for work
就可以分别启动客户端了--也就是启动jetty服务器。显示下文后表示连接成功:
2012-09-27 11:43:05,209 INFO - Terracotta 3.7.0, as of 20120717-133013 (Revision unknown-20453 by [email protected] from 3.7.0)
2012-09-27 11:43:35,443 INFO - Successfully loaded base configuration from server at '192.168.0.182:9510'.
2012-09-27 11:43:35,619 INFO - Successfully loaded base configuration from file at '/tmp/tc-config2732927072243054676.xml'.
2012-09-27 11:43:35,744 INFO - Log file: '/usr/local/jetty/jetty-distribution-7.6.5.v20120716/logs-192.168.0.166/terracotta-client.log'.
2012-09-27 11:43:51,771 INFO - Connection successfully established to server at 192.168.0.182:9510
2012-09-27 11:43:59.139:INFO:oejs.TransparentProxy:TransparentProxy @ /test_chat/javadoc-proxy to http://download.eclipse.org/jetty/stable-7/apidocs
2012-09-27 11:43:59.492:INFO:oejdp.ScanningAppProvider:Deployment monitor /usr/local/jetty/jetty-distribution-7.6.5.v20120716/contexts at interval 1
2012-09-27 11:43:59.527:INFO:oejd.DeploymentManager:Deployable added: /usr/local/jetty/jetty-distribution-7.6.5.v20120716/contexts/javadoc.xml
2012-09-27 11:43:59.997:INFO:oejsh.ContextHandler:started o.e.j.s.h.ContextHandler{/javadoc,file:/usr/local/jetty/jetty-distribution-7.6.5.v20120716/javadoc/}
2012-09-27 11:44:00.091:INFO:oejs.AbstractConnector:Started [email protected]:8080
测试部分:
接下来我们就要进行测试了,到底能不能session复制成功呢?我们采用jetty7自带的session测试来进行测试:
1、在浏览器中输入:http://192.168.0.180:8080/test_chat/
这个180是我集群的VIP,内网测试用。test_chat是我将自带的test.war代码修改了之后的项目,不修改也没有影响
2、点击session就会出现新建session的按钮:
3、我们新建一个session:k,v
看到我们有了这个键值对:k,v,且sessionid:IA91osG5iGTJ0W2jLto7.1 。
还要注意这个Context,这个context管理器是terracotta提供的。
4、然后我们另外打开一个窗口,重复之前的操作,并重新设置k1,v1
5、然后刷新之前的那个窗口:为了提醒读者看两个session不一样,请看其中有一项Last所记录的最后修改时间不相同,证明两个session是同一个。
发现相同了:
测试完成,能够实现session的共享。希望对读者有帮助,如果发现有问题,不吝赐教,万分感激!谢谢!
本文出自 “从普通程序员到CTO” 博客,谢绝转载!