| 导言
|
Terracotta介绍
Terracotta是一款由美国Terracotta公司开发的著名开源Java集群平台。它在JVM与Java应用之间实现了一个专门处理集群功能的抽象层,以其特有的增量检测、智能定向传送、
分布式协作、服务器镜像、分片等技术,允许用户在不改变现有系统代码的情况下实现单机Java应用向集群话应用的无缝迁移。使得用户可以专注于商业逻辑的开发,
由Terracotta负责实现高性能、高可用性、高稳定性的企业级Java集群。
运行环境
- JAVA JDK 1.6 + Tomcat6 + Terracotta Open Source-3.7.5 + Nginx-0.8.55
- 在Terracotta + Nginx + Tomcat 负载均衡构架中,Terracotta 起到session服务器作用,实时多机间的session缓存与复制
- 双机环境,两台内网相同网段的机器,IP分别是172.20.11.161、172.20.11.69
如果是同一台机器,启动两个tomcat,则需要修改tomcat的端口。
实施步骤
Win7系统下安装环境
- 安装JAVA JDK、Tomcat等省略(网上有很多资料)
- 安装Terracotta Open Source(下载地址:http://www.terracotta.org/dl/oss-download-catalog)
下载后直接安装,完成后可以关注sessions目录,里面有其于jetty服务器的example和依赖的jar。网上有例子是基于其中的cart.war做集群的测试工程,有兴趣的同学可以尝试。本例子用了Tomcat自带的session例子做测试,后来会讲到。 - 安装Nginx(下载地址:http://nginx.org/en/download.html)本次例子使用的是nginx/Windows-0.8.55
下载后解压即刻。
配置集群
配置Tomcat(两台机器的Tomcat相同)
- 拷贝<Terracotta_Home>/sessions/terracotta-session-1.3.5.jar和<Terracotta_Home>/common/terracotta-toolkit-1.6-runtime-5.5.0.jar至tomcat安装目录的lib目录。
- 修改conf/context.xml文件
3. <!-- Default set of monitored resources -->
4. <WatchedResource>WEB-INF/web.xml</WatchedResource>
5. <!-- 加上这一句,Terracotta 代理HttpServletSession,其中tcConfigUrl是配置安装了Terracotta的机器IP,9510是Terracotta的默认端口 -->
6. <!-- 单机情况下可以用localhost -->
7. <Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="localhost:9510"/>
8. <!--双机情况下Terracotta安装在172.20.11.161,则另外一台机器需要改成这样 -->
<!-- <Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="172.20.11.161:9510"/> -->
- 修改conf/server.xml文件
- 保证 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />没有被注释,AJP协议是Apache负载均衡时与后端主机的二进制 通讯协议。
- 如果配置粘性Session,需要配置服务器路径名jvmRoute。
· <!-- <Engine name="Catalina" defaultHost="localhost"> -->
· <!-- 这句增加jvmRoute属性,最好两个Tomcat配置的值是不同,方便调试使区分,这里分别配置了jvm1,jvm2 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
| 关于粘性Session网上的解释 |
配置Nginx服务器
- 修改conf/nginx.conf文件
2. ...
3. #工作进程数,不需要跟机器一致。
4. worker_processes 2;
5. ...
6.
7. http{
8. ...
9. upstream localhost {
10. #根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。
11. #同一机器在多网情况下,路由切换,ip可能不同
12. #ip_hash;
13. # 单机配置
14. #server localhost:81;
15. #server localhost:82;
16. # 多机配置
17. server 172.20.11.161:81;
18. server 172.20.11.69:82;
19.
20.}
21....
22.server {
23. #端口改为8011
24. listen 8011;
25. server_name localhost;
26.
27. #配置反向代理
28. location / {
29. proxy_pass http://localhost;
30. }
31.}
32....
}
到此配置已经完成。
检查配置
#启动cmd命令行窗口,进入nginx根目录下
测试nginx配置是否正确,测试命令:nginx -t (默认验证:conf\nginx.conf),也可以指定配置文件路径。
配置正确会显示如下
D:\nginx> nginx -t
the configuration file D:\nginx/conf/nginx.conf syntax is ok
configuration file D:\nginx/conf/nginx.conf test is successful
#启动两个tomcat,能正常启动没有报错,说明两个tomcat的端口没有冲突
测试
- 启动两个tomcat
- 启动Nginx
- 访问地址http://localhost:8011/examples/servlets/servlet/SessionExample
看到网页中
Session ID: FJou2GULFPVdHOXqZuF1.jvm1
刷新网页后显示
Session ID: FJou2GULFPVdHOXqZuF1.jvm2
不断刷新可以发现,SessionID:FJou2GULFPVdHOXqZuF1这个是不变的,变的是后面的jvm1,jvm2。说明Nginx把请求交替地分发到两个tomcat上处理。如果你也能出现以上内容,说明例子成功了。 - 进一步测试
在GET based form里填写Name和Value,然后提交,提交之后显示:
The following data is in your session:
111 = 1
可以发现URL上会带上参数?dataname=111&datavalue=1。为了不影响我们测试结果,需要把参数去掉,也可以直接点浏览器后退键,使地址回到不带参数,然后再刷新。可以看jvm1变成了jvm2,但依然显示
The following data is in your session:
111 = 1
说明既然分发到不同的tomcat上,session里的内容没有丢失。