Tomcat负载均衡和集群环境的搭建(从无到有)
1、环境要求:windowns系统 + tomcat7 + Apache2.4 + mod_jk
2、下载apache2.4:http://httpd.apache.org/download.cgi
3、下载mod_jk:http://tomcat.apache.org/download-connectors.cgi
4、下载tomcat7:http://tomcat.apache.org/download-70.cgi
5、安装apache
5.1、修改conf/httpd.conf的SRVROOT值
修改为具体的路径:(路径可以自定义的,但是一定要明确,且不能包含中文路径)
5.2、安装apache服务
进入Apache24/bin路径下,执行
“httpd.exe -k install -n “自定义服务名””
或者
“httpd.exe -k install”
注意:不指定服务名就是默认的;若指定服务名需要加双引号
5.3、启动Apache2.4,运行bin/ApacheMonitor.exe 文件
5.4、访问:http://localhost/
Apache默认是80的端口(可以更改)
恭喜,apache安装成功
6、对apache配置负载均衡
6.1、取出下载的mod_jk.so, 将其放置到Apache24\modules 文件夹下
6.2、在conf/httpd.conf 最后一行添加配置,指向mod_jk.so
include conf/mod_jk.conf
6.3、在conf文件夹下,新建mod_jk.conf文件,内容如下
#加载mod_jk Module 第2行中的mod_jk.so,就是我们之前放到modules目录下的那个.so文件。这里的名字就根据放进去的实际名字来写。版本不同,名字也就不一样。当然,mod_jk.so这个文件允许自己重命名。重命名后,只要在这里相应的配置上重命名后的名字,不会影响这个插件的功能。 第4行中conf/workers.properties文件也是不存在的,也需要我们自己建立。这个文件的作用是对用于均衡负载的 负载器进行具体的登记。(比如我们用的2个tomcat).换句话说,workers.properties就是对几个worker的登记表。我们的2个tomcat就作为2个worker被登记在这个文件中。而具体要如何进行登记,下面再具体说。 第6行的作用就是配置apache对哪些请求进行转发。这里我按照网络上的教程,配置了对所有的请求的转发。那么,当有请求到达apache时,apache就会根据当时的负载情况,从worker中挑出负载低的那个worker,将这个jsp请求转发给他。(这里需要注意,当部署到tomcat上的项目有更多类型的请求的时候,需要在这里配置更多的请求规则)。而controller会在workers.peroperties中被配置。总的来说,转发规则的格式如下: JkMount + 过滤请求类型 + 处理器 |
6.4、接着,在conf 文件夹下新建workers.properties文件夹,内容如下
worker.list = controller,tomcat1-1,tomcat1-2,tomcat2-1,tomcat2-2 #server 列表
#========tomcat1-1======== worker.tomcat1-1.port=9300 #ajp13 端口号,在tomcat下server.xml配置,默认8009 worker.tomcat1-1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址 worker.tomcat1-1.type=ajp13 #定向包协议 worker.tomcat1-1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多 worker.tomcat1-1.redirect = tomcat1-2
#========tomcat1-2======== worker.tomcat1-2.port=9301 worker.tomcat1-2.host=localhost worker.tomcat1-2.type=ajp13 worker.tomcat1-2.lbfactor = 1 worker.tomcat1-2.redirect = tomcat1-1# 会监听tomcat1-1,如果tomcat1-1挂了,会接替tomcat1-1的工作 worker.tomcat1-2.activation=disabled
#========tomcat2-1======== worker.tomcat2-1.port=9302 worker.tomcat2-1.host=localhost worker.tomcat2-1.type=ajp13 worker.tomcat2-1.lbfactor = 1 worker.tomcat2-1.redirect = tomcat2-2
#========tomcat1-2======== worker.tomcat2-2.port=9303 worker.tomcat2-2.host=localhost worker.tomcat2-2.type=ajp13 worker.tomcat2-2.lbfactor = 1 worker.tomcat2-2.redirect = tomcat2-1 worker.tomcat2-2.activation=disabled
#========controller,负载均衡控制器======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1-1,tomcat1-2,tomcat2-1,tomcat2-2 #指定分担请求的tomcat worker.controller.sticky_session=true #会话是否有粘性,false表示无粘性,同一个回话的请求会到不同的tomcat中处理 worker.controller.sticky_session_force=false #当一个节点蹦了,如果设值为true,那么服务器返回500错误给客户端,如果设值为false,则转发给其他的tomcat,但是会丢失回话信息 |
7、tomcat配置
7.1、修改tomcat/conf/server.xml 文件中的端口
需要修改以下几个端口(建议:每个端口定义好规则,便于以后拓展tomcat服务)
7.2、在tomcat/conf/server.xml 文件中配置集群信息,可用于session共享
在Engine 节点下添加以下代码。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <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="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <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"/> </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> |
7.3、指定<Engine>的属性
原来是:
修改后:
jvmRoute 指定的值是Apache24\conf\workers.properties配置文件中配置的的worker名称
7.4、web项目的session共享
需要在web项目下web.xml的web-app节点下添加<distributable/>
8、重启apache!
因为修改apache配置,需要重启
完成集群部署!!!
如果问题,我会列举几个问题在文件尾部!
测试:
1、启动apache
2、启动tomcat1-1、tomcat2-1
现在请求分给了tomcat2-1
现在我们停止tomcat2-1,结果是
由上图可以知道,tomcat之间已经实现session共享,但是,需要注意的是,这里的sessionId的结构是随机码加上tomcat的jvmRoute 值,如果需要获取sessionId来使用,就需要截取了..
测试完成!!!
问题整理
1、apache启动不起来
建议:通过命令启动,可查看报什么错(我是删除服务,重新注册的。。额,不要笑我)
1.1、端口占用,修改对应的端口
80端口:httpd.conf文件中的所有80端口改成未使用的端口(例如8080);
43的端口:改extra/httpd-ahssl.conf和extra/httpd-ssl.conf中所有的443改成未使用的端口(例如442)。1.2、必须连接有线网络,不能使用无线。
1.3、apache和mod_jk不兼容
2、session 共享问题
2.1、如图
2.2、如图