一、为什么需要Tomcat集群

Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
Tomcat默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创建一个线程处理,当一个进程有500个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是150,也就是说同时支持150个并发。具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给JVM的内存越多性能也就越高,但也会加重GC的负担。当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。

操作系统对于进程中的线程数有一定的限制:

Windows 每个进程中的线程数不允许超过 2000
Linux 每个进程中的线程数不允许超过 1000

在Java中每开启一个线程需要耗用1MB的JVM内存空间用于作为线程栈之用,此处也应考虑。

 

此外,为了实现服务器升级不影响用户使用,有必要配置两个tomcat在一个或多个服务器中。下面介绍下如何在一台服务器中配置2个Tomcat。

 

二、部署集群项目

部署两个Tomcat,注意端口号的问题,详细的部署在这就不详细说明。记录这两个Tomcat的访问端口号,如访问的端口号分别为8080、8081。

为了区分后面访问到哪个tomcat,两个tomcat项目首页html的内容分别设置tomcat1、tomcat2。

关于一台服务器如何配置多个tomcat可参考之前我写过的一篇文章:


 

三、配置Nginx负载均衡

首先了解下nginx的一些知识,nginx模块一般被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。利用这两类模块,可以使nginx轻松完成任何单机工作。而我们下边用到的upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。

数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发是nginx有能力构建一个网络应用的关键组件。当然,鉴于开发成本的问题,一个网络应用的关键组件一开始往往会采用高级编程语言开发。但是当系统到达一定规模,并且需要更重视性能的时候,为了达到所要求的性能目标,高级语言开发出的组件必须进行结构化修改。此时,对于修改代价而言,nginx的upstream模块呈现出极大的吸引力,因为它天生就快。作为附带,nginx的配置系统提供的层次化和松耦合使得系统的扩展性也达到比较高的程度。

从本质上说,upstream属于handler,只是他不产生自己的内容,而是通过请求后端服务器得到内容,所以才称为upstream(上游)。请求并取得响应内容的整个过程已经被封装到nginx内部,所以upstream模块只需要开发若干回调函数,完成构造请求和解析响应等具体的工作。

 

nginx.conf详细配置如下:

 

upstream tomcatCluster {
        server localhost:8080 weight=10; ##weight配置权重,权重越高访问这个tomcat的频率就越高
        server localhost:8081 weight=20;
    }
    server {
        listen 80;
        server_name  www.xxx.com;
	location = / {
	  proxy_pass http://tomcatCluster/index.html;
        }
	location / {
	    if ($host != 'www.xxx.com') {
	      rewrite ^/(.*)$ http://tomcatCluster/index.html;
	    }
	    proxy_pass http://tomcatCluster;
	    include proxy.conf;
	}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }    
    }

四、测试

 

重启Nginx

 

/usr/local/nginx/sbin/nginx -s reload

 

 

浏览器输入地址:

http://localhost/index.html

刷新几遍发现,发现页面有时候显示tomcat1,有时候显示tomcat2,出现的几率分别为1/3,2/3,因为我们配置了权重值weight分别为10、20。

 

五、注意session问题

这里没讲到session问题,光是这样配置,两个tomcat的会话session肯定不一样,所以还需要解决session共享问题,在此就不多说,可参考之前写过的一篇文章: