这两天搭建了一个tomcat集群的小demo,过程中的一些的小坑,在这里给大家说一下。
1.前言
当我们的项目并发量特别大,单一服务器无法满足的时候,或者一个服务器宕机,系统就无法运行的时候这里我们就可以搭建一个集群服务了,因为集群有一定的扩充性和容错能力.
1.1 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。
1.2 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,对外界来看是一个大Web服务器。不过集群的节点也可以单独提供服务。
特点和作用
0.1 高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
0.2 负载平衡:即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
总体来说集群就是把一个项目发布在多个服务器上面,然后实现压力分散处理,或者当一台服务器宕机的时候 其它服务器可以进行接替,这个项目还可以正常运行。
本文中采用的负载均衡技术为 反向代理负载均衡 (如Apache+JK2+Tomcat这种组合)
使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式 与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反 向代理模式。
如图 当用户访问我们的服务器时,会先通过apache server进行服务转发,然后将每一个单独的服务转发给独立的tomcat服务器,然后由单独的服务器进行处理并且进行回应。
2.配置负载均衡
环境搭建 jdk 1.8,tomcat 8(版本随意,但是需要两个哟),apache 2.4.3 ,mod_jk. (要特别注意是 apache,和mod_jk的版本要一模一样某种会出现异常)
jk的下载地址 http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/
apache-server 安装完成后,可以在浏览器中输入 http://localhost/ 来测试,如果出现 ” It works!”或者有页面 则表示安装成功。 aoache的启动的命令为
httpd -k start
3.安装好上面得到环境后进行配置
3.1对apache24目录下的conf目录下的httpd.conf进行添加
# Load mod_jk2 module 这里为要使用的jk的文件,jk文件下载好后要把它放在 apache目录下的modules中
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties( 引用 workers 配置文件 )
JkWorkersFile conf/workers.properties
# Where to put jk logs(log 文件路径,此路径可以自己创建 )
JkLogFile logs/mod_jk2.log
# Set the jk log level [debug/error/info](log 级别 )
JkLogLevel info
# Select the log format(log 格式 )
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send JSPs for context / to worker named loadBalancer(URL 转发配置,匹配的 URL 才转发到 tomcat 进行处理 )
JkMount /*.jsp controller
# JkMount /*.* loadBalancer
3.2 在conf目录下创建 workers.properties文件
#server 列表,tomcat1,tomcat2为自己的tomcat服务器,这里的tomcat1,tomcat2下面有解释
worker.list = controller,tomcat1,tomcat2
# tomcat1(ajp13 端口号,在tomcat下server.xml配置,默认8009)
worker.tomcat1.port=8009
#tomcat 的主机地址,如不为本机,请填写ip地址
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
#server 的加权比重,值越高,分得的请求越多
worker.tomcat1.lbfactor = 1
# tomcat2
worker.tomcat2.port=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
# controller( 负载均衡控制器)
worker.controller.type=lb
# 指定分担请求的tomcat
worker.controller.balanced_workers=tomcat1,tomcat2
#worker.controller.sticky_session=true
3.3在上面的配置完成之后我们可以修改tomcat的配置了
配置完成之后就可以写一个测试了
这个我们就可以进行测试了,先启动apache 服务,然后把项目加载到每一个tomcat服务中,启动tomcat1,tomcat2,eclipse为例
然后访问 http://localhost/你自己的项目名/测试页面.jsp
这个时候我们就可以看到tomcat1控制台中打印了上面输入的信息,我们刷新一下就可以在tomcat2控制台看到相应的信息,坐到这里我们的tomcat集群就完成了但是只完成负载均衡,这里的session没有实现共享,下面我们来详细的讲一下 session的共享
4. session共享配置
这个时候需要在tomcat1和tomcat2中进行配置了下面的配置在两个tomcat服务器的server.xml文件中都要进行修改
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001" //这里的端口要注意,两个tomcat的端口不能一样哟
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"
waitForAck="true"/>
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
Engine 增加 jvmRoute 属性设置, jvmRoute 的值来自于 workers.properties 文件所设置的服务器名称。
然后在test页面中进行添加测试代码
最后一步在web.xml中加入
配置完成。
依次启动apache,tomcat1,tomcat2服务器
刷新页面在页面中输入名称和值,会发现
然后在刷新一下页面
两个tomcat服务确实实现session共享,我们把8080端口先关闭
然后刷新页面
这就说明了再次说明了集群下的服务器一个宕机了,项目还是进行访问
再次开启8080端口的tomcat服务,然后刷新页面
还可以继续得到请求。
总结
. Mod_JK2负载均衡与故障复原,决定把Apache httpd当成web服务器,而且使用mod_jk2将请求传送给Tomcat,则可以使用mod_jk2的负载均衡与容错功能。在集群系统中,带有 mod_jk2的Apache httpd可以做的事情包括:
A 将请求分配至一或多个Tomcat实例上你可以在mod_jk2的workers.properties文件中,设定许多Tomcat实例,并赋于每个实例一个lb_factor值,以作为请求分配的加权因子。
B. 侦测Tomcat实例是否失败当Tomcat实例的连接器服务不再响应时,mod_jk2会及时侦测到,并停止将请求送给它。其他的Tomcat实例则会接受失效实例的负载。
C. 侦测Tomcat实例在失效后的何时恢复因连接器服务失效,而停止将请求分配给Tomcat实例之后,mod_jk2会周期性地检查是否已恢复使用性,并自动将其加入现行的Tomcat实例池中。
其实无论是分布式,数据缓存,还是负载均衡,无非就是改善网站的性能瓶颈,在网站源码不做优化的情况下,负载均衡可以说是最直接的手段了。其实抛开这个名 词,放开了说,就是希望用户能够分流,也就是说把所有用户的访问压力分散到多台服务器上,也可以分散到多个tomcat里,如果一台服务器装多个 tomcat,那么即使是负载均衡,性能也提高不了太多,不过可以提高稳定性,即容错性。当其中一个主tomcat当掉,其他的tomcat也可以补上, 因为tomcat之间实现了Session共享。待tomcat服务器修复后再次启动,就会自动拷贝所有session数据,然后加入集群。这样就可以不 间断的提供服务。如果要真正从本质上提升性能,必须要分布到多台服务器。
以上的测试为在一台服务器上进行测试,多台服务器的测试也可以实现,不过文中的ip就要进行对应的更改了.
只要思想不滑坡,办法总比困难多!