Tomcat集群和session会话同步管理

这两天搭建了一个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的配置了 


第二个的端口一定和要上面的端口一样

配置完成之后就可以写一个测试了

创建一个web项目然后写一个页面,页面中添加

这个我们就可以进行测试了,先启动apache 服务,然后把项目加载到每一个tomcat服务中,启动tomcat1,tomcat2,eclipse为例


然后访问 http://localhost/你自己的项目名/测试页面.jsp

这个时候我们就可以看到tomcat1控制台中打印了上面输入的信息,我们刷新一下就可以在tomcat2控制台看到相应的信息,坐到这里我们的tomcat集群就完成了但是只完成负载均衡,这里的session没有实现共享,下面我们来详细的讲一下 session的共享

4. session共享配置

这个时候需要在tomcat1和tomcat2中进行配置了下面的配置在两个tomcat服务器的server.xml文件中都要进行修改

<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

managerClassName="org.apache.catalina.cluster.session.DeltaManager"

expireSessionsOnShutdown="false"

useDirtyFlag="true"

notifyListenersOnReplication="true">

<Membership

className="org.apache.catalina.cluster.mcast.McastService"

mcastAddr="228.0.0.4"

mcastPort="45564"

mcastFrequency="500"

mcastDropTime="3000"/>

<Receiver

className="org.apache.catalina.cluster.tcp.ReplicationListener"

tcpListenAddress="auto"

tcpListenPort="4001"  //这里的端口要注意,两个tomcat的端口不能一样哟

tcpSelectorTimeout="100"

tcpThreadCount="6"/>

<Sender

className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"

replicationMode="pooled"

ackTimeout="15000"

waitForAck="true"/>

<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"

filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>

</Cluster>

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就要进行对应的更改了.

只要思想不滑坡,办法总比困难多!

猜你喜欢

转载自blog.csdn.net/tmeng521/article/details/80212690