IT运维笔记


Nginx + Tomcat + Terracotta 实现负载均衡

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相同)

拷贝/sessions/terracotta-session-1.3.5.jar和/common/terracotta-toolkit-1.6-runtime-5.5.0.jar至tomcat安装目录的lib目录。
修改conf/context.xml文件
3.   
4.  WEB-INF/web.xml
5.   
6.   
7. 
8. 

修改conf/server.xml文件
保证 没有被注释,AJP协议是Apache负载均衡时与后端主机的二进制 通讯协议。
如果配置粘性Session,需要配置服务器路径名jvmRoute。
·        

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