Apache2.X + Tomcat 7 实现集群部署以及Session 同步复制
今天先把标题写下来.
文章参照
http://lxiaodao.iteye.com/blog/321000
一、环境说明
1.软件版本
?Apache : apache_2.2.19
?Tomcat: apache-tomcat-7.0.8 (zip版) 2个或 2个以上
?mod_jk:mod_jk-apache-2.0.55.so
?运行环境 :在一台服务器中 。
注意各个版本的匹配问题。 mod_jk 的2.0.55 对应的是Apache2.2.X的版本。
前提条件:
?两个tomcat 配置好相应的端口,以保证都能顺利的启动。 本部署手册的部署针对一台服务器上集群配置。如果你有多台服务器。则不需要修改Tomcat的端口号。只要在相应的配置中加入你的IP地址即可。
例如:
Tomcat1 放置在 D:/cluster/tomcat1 关闭端口 8005 启动端口8090 ajp端口8010
Tomcat2 放置在 D:/cluster/tomcat2关闭端口 8006 启动端口9090 ajp端口9010
?安装好Apache, 如安装在D:/Apache2 目录。
二、负载均衡(loadBlance)配置
?本节内容 主要配置服务器之间作为一个集群组,在服务器启动或者关闭的时候,在集群组中通知 其它机器。以及在客户端请求到来的时候可以通过负载均衡的原则合理的分配请求到不同的机器上,以分担服务器压力。
配置 负载均衡 主要是对Apache 服务器 配置文件的修改。
?打开Apache 目录下 conf/ httpd.conf , 增加内容 Include conf/extra/mod_jk.conf
?打开目录 conf/extra/ 新建文件mod_jk.conf ,内容为
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器 如果要Apache 负责处理静态文件 则此处应该让转发控制中的 /* -> /*.jsp 等等类似的表达式。
JkMount /* controller
?在conf 下 新建文件workers.properties
内容如下:
#========controller,负载均衡控制器========
worker.list=controller,tomcat1,tomcat2
worker.controller.type=lb
#========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=9010
#ajp13 端口号,在tomcat下server.xml配置,
worker.tomcat2.host=localhost
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#server的加权比重,值越高,分得的请求越多
worker.controller.balanced_workers=tomcat1,tomcat2
#指定分担请求的tomcat
worker.controller.sticky_session=false
#worker.controller.sticky_session=1
?将mod_jk-apache-2.0.55.so 改名为上面定义的mod_jk.so 放置到 /modules,文件夹下。
如此集群基本配置完成。
如果还需要虚拟主机的配置 ,可以打开虚拟主机修改对应的端口号 等等。
如果只是配置负载均衡还不够,也就是说如果一个Tomcat拥有的Session ,另外一个Tomcat不能共享 ,所以用户信息就会丢失。
三、配置集群(Session 同步)配置
?本节 内容主要讲述如何配置Session 同步,以保证多台服务器之间共同享有相同的Session。不至于在某一台服务器宕机以后,其它服务器中用户信息不至于丢失。
?在两个Tomcat的web.xml 文件中,在</web-app>前添加<distributable/>
?修改Tomcat的配置文件Server.xml
其中Engine 中增加JvmRoute 对应workers.properties中的tomcat1和tomcat2
Ajp通信用的端口范围为 40000 -40100 之间。只要设置两台tomcat不一样并且在这个范围内就可以。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="8"/> -->
<!-- -->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<!-- timeout="60000"-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
部署好以后就可以开始测试一下两台服务器之间是否可以共享一个Session