今年一直在公司开发一个app项目,做了半年就上线了,开始的用户访问量不大, 后来访问量越来越大,客户反映经常出现连接服务器失败。为了改善这个,我从程序上进行优化,修改tomcat配置,把数据库换成阿里云数据库,但感觉这些都不是最好的解决办法,其根本原因是单台tomcat服务器无法处理高并发的请求,有性能瓶颈,后来想到负载均衡、tomcat集群,就在网上找了一些资料,采用1个apache+多个tomcat集群方式,慢慢研究就搭建起来了,集群模式架构如下:
首先想到要解决两个问题:
1、如何实现多台应用服务器之间的session共享(比如A用户登录,处理这个请求的是tomcat1,session在tomcat1上,如果不做session共享,A用户再次做操作,例如查询列表数据,这个请求可能由tomcat2来处理,发现找不到session,会提示登录,所以必须解决此问题)
2、如何使用多台应用服务器实现压力分解。
其实集群可以多台物理服务器,每台物理机上部署一个tomcat,这种方式是横向集群。还有一种是在一台物理机上部署多台应用服务器tomcat,这种方式是纵向集群,本文讲解的是纵向集群。
1、先准备好要使用的软件:apache2.4 ,tomcat8,mod_jk(apache和tomcat的连接器,我采用的是1.2版本,需要与apache版本对应)
apache2.4官网下载:http://httpd.apache.org/download.cgi
tomcat8官网下载:http://tomcat.apache.org/download-80.cgi
mod_jk下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/ 我下载的是
下载好之后放到一个文件夹,如下
2、将你下载的tomcat复制一份,我们做两个tomcat集群,修改tomcat的配置文件server.xml。在一台机器上部署多个tomcat需要修改端口,保持两个tomcat端口不一致才行。
以我的为例,
apache-tomcat-1 server.xml修改3个地方:
apache-tomcat-2 server.xml修改3个地方:
在tomcat/bin/startup.bat文件开头第一行加上
SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91
SET CATALINA_HOME=E:\software\fzjh\apache-tomcat-2
这两行代码,以保证tomcat能正常启动,不配置这个tomcat启动会一闪而过。
两个tomcat的server.xml文件加上如下这段:
可以在文件中搜索"cluster"然后将它覆盖,为了方便复制,我讲代码贴出来:
notifyListenersOnReplication="true"
mapSendOptions="6"/>
notifyListenersOnReplication="true"/>
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
port="4001"
selectorTimeout="100"
maxThreads="6"/>
至此,tomcat的配置就完成了,可以启动一下两个tomcat,看能不能正常启动。
3、开始配置apache服务器了,打开文件:httpd-2.4.23-x64-vc14-r3\Apache24\conf\httpd.conf
1)修改根路径SRVROOT,在文件中搜索这个单词"SRVROOT",修改成你的apache所在实际路径,比如我的
2)在文件最后加上一句话: include conf/mod_jk.conf
3) http.conf 同目录下新建mod_jk.conf文件,内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
#JkMount /*.jsp controller
JkMount /* controller
4) 在http.conf同目录下新建workers.properties,内容如下:
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8010 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8011 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
要注意的是,worker.tomcat1.port 这个端口一定要写正确,这就是apache连接的多个tomcat,就是这个
5) 将刚开始下载好的mod_jk.so文件拷贝到httpd-2.4.23-x64-vc14-r3\Apache24\modules目录下,以便apache加载连接器。
至此所有的负载均衡配置就配置好了,下面进行测试, 先启动apache服务器,
在cmd窗口中进入apache24/bin目录,输入net start apache2.4命令进行启动。
把应用放到apache-tomcat-1,apache-tomcat-2的webapps目录下并启动(你的应用的web.xml文件需要加上一个标签
apache的默认端口是80,我在浏览器中输入http://localhost/school回车,登录到我的项目中,点击各种功能,发现两个tomcat已经在协同工作,并交互分担请求,这说明已经成功了。
这样,你的应用就是负载均衡模式了,对于访问量大、高并发情况是很有效的, 停掉一个tomat后,另一个tomcat依然对外提供服务,对于用户来说完全没有影响使用,这就可以实现不停服务的情况下升级应用程序。
好啦,赶快按照这个步骤搭建你的负载均衡、服务器集群应用吧,有不明白的可以留言。