一、配置集群系统的负载平衡器
背景:Windows中,把Apache服务器和两个Tomcat服务器集成,Tomcat1的AJP端口为8009,Tomcat2的AJP端口为8109。(如果两个Tomcat服务器运行在不同的机器上,它们可以使用相同的AJP端口)
以下是Apache和两个Tomcat服务器集成,以及配置负载平衡器的步骤:
1、安装Apache HTTP
2、JK插件mod_jk.so放进<APACHE_HOME>/modules目录
3、<APACHE_HOME>/conf目录下创建workers.properties
#指定Tomcat服务器名单
worker.list = worker1, worker2, loadbalancer
#Tomcat服务器使用的AJP端口
worker.worker1.port = 8009
#Tomcat服务器的ip
worker.worker1.host = localhost
#Tomcat服务器与Apache HTTP服务器之间的通信协议
worker.worker1.type = ajp13
#负载平衡因数(Load Balance Factor)。只有使用了负载平衡器(LoadBalancer)的情况下,才有意义
worker.worker1.lbfactor = 100
worker.worker2.port = 8109
worker.worker2.host = localhost
worker.worker2.type = ajp13
worker.worker2.lbfactor = 100
#负载平衡器
worker.loadbalancer.type = lb
#可被负载平衡器分配工作的Tomat服务器
worker.loadbalancer.balanced_workers = worker1, worker2
#是否一个会话始终访问某一个Tomcat。true是,且不会复制会话;false不是,可复制会话
worker.loadbalancer.sticky_session = false
#把请求转发给集群系统中其他的Tomcat服务器。true不转发,false转发
worker.loadbalancer.sticky_session_force = false
4、修改<APACHE_HOME>/conf/httpd.conf,使用负载平衡器进行转发,在尾部加入:
#使用mod_jk.so重定向动态调用Tomcat服务器
#加载指定的JK插件
LoadModule jk_module modules/mod_jk.so
#指定JK的工作文件
JkWorkersFile conf/workers.properties
#指定JK的日志文件,可以通过这个文件跟踪JK插件的运行过程
JkLogFile logs/mod_jk.log
#指定JK插件的日志级别
JkLogLevel debug
#指定JK插件处理的URL映射信息
JkMount /postgresql-1128/* loadbalancer
5、分别修改两个Tomcat服务器的conf/server.xml文件,使AJP连接器的端口分别为:8009和8019,确保与worker.properties文件中的配置对应;另外,<Engine>元素的jvmRoute属性与worker的名字一致,分别为:worker1和worker2。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina" jvmRoute="worker1">
...
</Engine>
注:为了能同时启动多个Tomcat服务器,至少修改3个"port"使Tomcat之间端口不重复:
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" ... />
<Connector port="8009" protocol="AJP/1.3" ... />
6、分别启动两个Tomcat服务器和Apache HTTP服务器。访问http://localhost:8088/postgresql-1128/hello/id查看当前session id
二、配置集群管理器
前提:通过访问上面的地址,可以看见session id每次都不一样,因为每次请都由不同的Tomcat服务器响应,而这两个Tomcat服务器之间没有进行会话同步。为了解决上面的问题,需要配置集群管理器,使得会话同步,步骤如下:
1、分别修改Tomcat1和Tomcat2的conf/server.xml文件,在<Engine>元素内加入<Cluster>子元素,使Tomcat能够启用集群管理器。
对于大多数Web应用而言,使用默认配置已经足够。
默认配置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
完整配置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="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"
bind="127.0.0.1"
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" />
<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>
2、分别修改Tomcat1和Tomcat2中Web应用的web.xml文件,加入<distributable />元素:
<distributable />
3、分别启动两个Tomcat服务器和Apache HTTP服务器。
详细内容参考《Tomcat与Java Web开发技术详解(第2版)》的<Tomcat与其他HTTP服务器继承>
注意事项:
(1)存放在会话范围中的所有属性都实现了java.io.Serializable接口。(2)集群系统中的Tomcat服务器之间通过组播的形式来通信。如果机器有多个网卡或配置了虚拟网卡,可能会组播失败,导致无法正常复制会话。需要设置bind属性:
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1" ... />
(3)如果集群系统规模较小, 可以采用DeltaManager会话管理器;如果规模很大,可以使用BackupManager。
(4)<Membership>元素的address属性设置组播地址,本次实验设置为228.0.0.4。仅在计算机连在Internet上才能组播,否则无法访问该组播地址。
(5)workers.properties文件中sticky_session和sticky_session_force属性:
sticky_session:默认值为true,为true表示一个会话始终访问集群系统中的某一个Tomcat服务器,集群系统不会进行会话复制。若希望一个浏览器能与多个Tomcat服务器展开同一个会话,则需要设置为false。
sticky_session_force:sticky_session为false时,sticky_session_force对集群系统没什么影响。通常设置值与sticky_session一致。