在本地开发项目时,我们通常只会将代码部署到一台服务器上。然而,在实际项目中,为了更好地应对突发情况,我们可能将代码部署在多台服务器上,尽可能地避免因为网站发生故障,造成正常服务中断的情况。在Java Web开发过程中,我们使用多台Tomcat服务器搭建服务器集群。
Tomcat集群的作用
Tomcat集群主要有以下两个作用:
- 提高服务性能,并发能力以及高可用性
- 提供项目架构的横向扩展能力
Tomcat集群实现原理
在本章中,Tomcat集群的实现是通过Nginx负载均衡进行请求转发而产生的。
Tomcat集群引发的问题及解决方案
在Tomcat集群的情况下,将会产生了以下问题:
- Session登录信息存储及读取的问题
- 服务器定时任务并发的问题,…
因此,在使用Tomcat集群的时候,我们要注意到这些问题。
针对上面的Session登录信息存储及读取的问题,我们可以使用下面两种方案:
采用nginx ip哈希策略,将相同ip的请求转发到同一台服务器上
优点:可以不改变现有技术架构,直接实现横向扩展
缺点:容易导致服务器请求(负载)不平均,完全依赖ip哈希的结果;在ip变化的环境下将无法服务
将SessionId存储到Cookie中,无论用户在哪台服务器登录,都从Cookie中获取SessionId,并将Session信息存储到Redis中,当用户需要获取登录信息时,从Redis中获取相关信息
为了解决服务器定时任务并发的问题,我们将使用分布式锁来处理该问题。
Nginx负载均衡配置
对于Nginx来说,负载均衡主要有以下几种配置方式:
- 轮询(默认)
- 权重
- ip哈希
- url哈希(第三方)
- fair(第三方)
轮询方式
使用轮询进行负载均衡,其主要优缺点如下:
优点:实现简单
缺点:不考虑每台服务器处理能力
轮询方式的主要配置如下:
upstream www.happymmall.com { |
权重方式
使用权重进行负载均衡,其主要优点如下:
优点:考虑了每台服务器处理能力的不同,在这个配置中使用了weight,若不使用,则默认为1
权重方式的主要配置如下:
upstream www.happymmall.com { |
ip哈希方式
使用ip哈希进行负载均衡,其主要优点如下:
优点:能实现同一用户访问同一个服务器
缺点:根据ip哈希,会造成请求访问分布不平均
ip哈希方式的主要配置如下:
upstream www.happymmall.com { |
url哈希方式
使用url哈希进行负载均衡,其优缺点如下:
优点:能实现同一服务访问同一服务器
缺点:根据url哈希分配请求会不平均,请求频繁的url会请求到同一服务器
url哈希方式的主要配置如下:
upstream www.happymmall.com { |
fair方式
使用fair进行负载均衡,按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream www.happymmall.com { |
Tomcat单机部署多应用
为了实现单机部署多应用,我们需要准备多个Tomcat,在本章中,我们实现两个Tomcat集群,准备两个Tomcat:Tomcat1和Tomcat2
配置环境变量
在windows环境下,我们配置6个环境变量:
Tomcat1:CATALINA_1_BASE、CATALINA_1_HOME、TOMCAT_1_HOME,指向Tomcat1根目录
Tomcat2:CATALINA_2_BASE、CATALINA_2_HOME、TOMCAT_2_HOME,指向Tomcat2根目录
配置Tomcat
除了配置环境变量以外,我们还需要配置这两个Tomcat。
Tomcat1:
修改bin目录下的catalina.bat:
查找该文件下的所有CATALINA_BASE,替换为CATALINA_1_BASE
查找该文件下的所有CATALINA_HOME,替换为CATALINA_1_HOME
修改bin目录下的startup.bat:
查找该文件下的所有CATALINA_BASE,替换为CATALINA_1_BASE
查找该文件下的所有CATALINA_HOME,替换为CATALINA_1_HOME
Tomcat2:
修改conf目录下的server.xml:
修改
<Server port="8005" shutdown="SHUTDOWN">
中的端口8005为9005修改
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
中的端口8080改为9080修改
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
中的端口8009改为9009
修改bin目录下的catalina.bat:
查找该文件下的所有CATALINA_BASE,替换为CATALINA_2_BASE
查找该文件下的所有CATALINA_HOME,替换为CATALINA_2_HOME
修改bin目录下的startup.bat:
查找该文件下的所有CATALINA_BASE,替换为CATALINA_2_BASE
查找该文件下的所有CATALINA_HOME,替换为CATALINA_2_HOME
启动服务器
启动Tomcat1,查看打印出的CATALINA_1_BASE,CATALINA_1_HOME:
启动Tomcat2,查看打印出的CATALINA_2_BASE,CATALINA_2_HOME:
若能够正常启动,且其打印出的信息和服务器相对应,则表示配置成功
配置Nginx
upstream www.happymmall.com{ |
修改host文件
为了使用Nginx配置的域名,我们修改host文件,添加一条配置127.0.0.1 www.happymmall.com
Tomcat多机部署多应用
多机部署比单机多实例简单得多,只需要在每台主机安装一个Tomcat即可
- 如果一个机器部署一个Tomcat实例,不用修改
- 如果一个机器部署多个Tomcat实例,参照上一节的方法
- 若使用不同的机器上的Tomcat实现Tomcat集群,需要保证各机器之间的网络是互通的,Nginx装在任意一台机器上即可,也可把Nginx服务独立出来一台
Tomcat与Nginx集群步骤总结
通过上文,我们可以了解Tomcat与Nginx集群的基本实现步骤
- 配置各Tomcat相应的环境变量CATALINA_BASE、CATALINA_HOME、TOMCAT_HOME
- 配置各Tomcat配置文件对应的CATALINA_BASE、CATALINA_HOME
- 配置Nginx负载均衡,通过Nginx负载均衡整合Tomcat实现Tomcat集群