Nginx + Tomcat + Terracotta 实现负载均衡

http://qmwiki:7002/images/icons/emoticons/information.gif

导言

Terracotta介绍

Terracotta是一款由美国Terracotta公司开发的著名开源Java集群平台。它在JVM与Java应用之间实现了一个专门处理集群功能的抽象层,以其特有的增量检测、智能定向传送、 
分布式协作、服务器镜像、分片等技术,允许用户在不改变现有系统代码的情况下实现单机Java应用向集群话应用的无缝迁移。使得用户可以专注于商业逻辑的开发, 
由Terracotta负责实现高性能、高可用性、高稳定性的企业级Java集群。

运行环境

  1. JAVA JDK 1.6 + Tomcat6 + Terracotta Open Source-3.7.5 + Nginx-0.8.55
  2. 在Terracotta + Nginx + Tomcat 负载均衡构架中,Terracotta 起到session服务器作用,实时多机间的session缓存与复制
  3. 双机环境,两台内网相同网段的机器,IP分别是172.20.11.161、172.20.11.69
    如果是同一台机器,启动两个tomcat,则需要修改tomcat的端口。

实施步骤

Win7系统下安装环境
  1. 安装JAVA JDK、Tomcat等省略(网上有很多资料)
  2. 安装Terracotta Open Source(下载地址:http://www.terracotta.org/dl/oss-download-catalog)
    下载后直接安装,完成后可以关注sessions目录,里面有其于jetty服务器的example和依赖的jar。网上有例子是基于其中的cart.war做集群的测试工程,有兴趣的同学可以尝试。本例子用了Tomcat自带的session例子做测试,后来会讲到。
  3. 安装Nginx(下载地址:http://nginx.org/en/download.html)本次例子使用的是nginx/Windows-0.8.55
    下载后解压即刻。
配置集群

配置Tomcat(两台机器的Tomcat相同)

  1. 拷贝<Terracotta_Home>/sessions/terracotta-session-1.3.5.jar和<Terracotta_Home>/common/terracotta-toolkit-1.6-runtime-5.5.0.jar至tomcat安装目录的lib目录。
  2. 修改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"/> -->
  1. 修改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">

http://qmwiki:7002/images/icons/emoticons/information.gif

关于粘性Session网上的解释
什么是粘性session呢,具体的概念我也就不说了,说一个实例,你马上就能够理解过来了。有这个一个环境。前端有一个apache负载均衡器后台有3台Jboss节点组成的集群。这个时候我用世界之窗浏览器打开网站,apache负载均衡器把我的这个请求转发给节点1处理,接着我登陆登陆账号,然后刷新一下页面,问题出现了,它又要我重新登陆,为什么呢?因为apache负载均衡器把我下一个请求发给了节点2,但是节点2上没有我当前session,所有会要求我登陆,其实这算是一个新的连接了。如果开启了粘性session会怎么样呢。如果处理我第一个请求的服务器是节点1,那么往后我所有的请求都由这个服务器处理。这样就不会造成前面那种session混乱的局面了。

配置Nginx服务器
  1. 修改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的端口没有冲突

测试
  1. 启动两个tomcat
  2. 启动Nginx
  3. 访问地址http://localhost:8011/examples/servlets/servlet/SessionExample
    看到网页中
    Session ID: FJou2GULFPVdHOXqZuF1.jvm1
    刷新网页后显示 
    Session ID: FJou2GULFPVdHOXqZuF1.jvm2
    不断刷新可以发现,SessionID:FJou2GULFPVdHOXqZuF1这个是不变的,变的是后面的jvm1,jvm2。说明Nginx把请求交替地分发到两个tomcat上处理。如果你也能出现以上内容,说明例子成功了。
  4. 进一步测试
    在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里的内容没有丢失。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值