Nginx+Tomcat集群环境搭建

Tomcat集群能带来什么?

提高服务的性能、并发能力、以及高可用性
提高项目架构的横向扩展能力

提高服务的性能

实际公司线上生产环境都会选择一台机器部署一个tomcat,多台机器完成集群,毕竟一台机器部署多个tomcat还是有一些共享瓶颈的,例如它们的网卡只有一个,内存和磁盘IO等都是共用的。而多台机器共同提供相同的服务,能够充分利用每一台机器的资源,自然能够提高服务的性能。

并发能力

很好理解,一台tomcat的http线程池是有限的,那么两台能承载的http线程自然是一台的2倍。

高可用性

简单理解在Nginx下面挂了多台tomcat节点,当其中一台tomcat挂掉的时候,那么我们可以把这个节点从Nginx负载均衡tomcat集群的配置当中移除,那么对于请求nginx还会打到可用的tomcat服务器上,并不影响我们提供的服务。所以tomcat集群就能带来一定的高可用性。

横向扩展能力

假设对于一台服务器,通过不断的升级它的cpu、内存、更换固态硬盘等,我们认为这是纵向提高机器的配置,来达到提高tomcat所提供服务的性能,随着硬件不断提高,成本是指数级上升的。
而横向扩展能力则不同,比如天猫的双11活动,因为平时访问量没有那么高,但是双11访问量非常高,当tomcat集群完成后我们就可以做一个横向扩展,只要增加tomcat节点就可以了,根据实际数据、历史数据去做一个评估,当然这个还要有一定的动态能力,根据实际的情况动态的增加几个节点,让nginx进行热部署,就把新增的节点加入到集群中。

Tomcat集群实现原理

通过Nginx负载均衡对多个tomcat进行请求转发,也就是说将多个用户的请求通过一定的策略打到集群的各个tomcat服务器中。

Tomcat集群带来了什么新问题
1.Session登录信息存储及读取问题
通常在单tomcat环境下,我们都是将登录信息存储在原生提供的Session对象中。那么在集群环境下,当用户A发起登录请求被转发到tomcat1上,最终登录的session信息存储到了tomcat1上,用户A此时访问系统的某个服务,该请求被转发到了tomcat2上,但是tomcat2并没有该用户的登录信息,所以会提示用户未登录,显然这是不合理的。
所以在集群环境下我们必须要解决多个tomcat之间session共享问题,让用户只需要登录一次就可以继续访问其他的服务。

2.服务器定时任务并发的问题
当服务器存在定时任务时,假设配置的30分钟执行一次,那么到了执行的时间点,多个tomcat就会同时启动这个定时任务,带来的问题就是首先如果定时任务的业务逻辑很复杂时,非常容易造成线上的数据错乱,其次我们其实只希望有一台服务器去执行定时任务就够了,那么多台同时执行也会带来不必要的资源浪费。

3.根据项目架构和现有业务还有可能有更多的问题
对于实际不同的场景还会有很多的问题,所以随着项目架构的演进,从架构层面的变化会引起代码层面的变化以及解决方案的变化,不要想当然的认为集群就是多部署几台tomcat就行了。

Tomcat集群架构

如图为tomcat集群后简要的架构图,左侧是一个分布式的Redis Session Server,无论用户请求哪台tomcat,都将session信息存储在这里,tomcat请求session也都从这里获取。所以这里还需要做单点登录功能。
同时可以利用分布式Redis来做一个分布式锁,解决多个tomcat在同一时间点启动定时任务的问题。

Nginx+Tomcat集群环境搭建详细搭建:
https://www.jianshu.com/p/ba996d83f02a