Load balancer with apache and tomcat cluster


本篇记录在Windows 2008R2 64bits环境下,基于Apache+Tomcat搭建和配置简单集群。


所用软件和版本如下,都已搜集到度盘这里

  • apache-tomcat-7.0.56-windows-x64.zip
  • httpd-2.2.25-win32-x86-no_ssl.msi
  • probe-2.3.3.zip
  • Wireshark-win64-1.12.1.exe
  • tomcat-connectors-1.2.39-windows-i386-httpd-2.2.x.zip

集群主要作用在高可用(High Availability)和负载均衡(Load Balance)两个方面。

我准备将Apache + Tomcat集群测试环境搭建在两台Windows 2008R2 64bits环境机器上,分别是A(172.16.3.40)和B(172.16.3.41),AB分别搭建Tomcat环境,部署probe.war,安装Wireshark,另外前置机Apache安装在A机器。这样一来,对用户来说,A机器的Apache地址是透明的,用户无需知道也不关心服务到底由谁来提供,接下来正式开始配置集群环境。

配置Apache前置机Load Balancer


在A机器上安装Apache后,启动并测试http://A_IP/80端口首页It works!是否正常打开,确保Apache正常工作。

这里选用mod_jk做负载均衡器,mod_jk默认使用非常简单的Round Robin Scheduling算法分发前端请求。
安装配置mod_jk connector,从这里可下载对应版本,将mod_jk.so拷贝到Apache的modules目录下,接着修改Apache的httpd.conf文件以配置mod_jk(粘贴以下内容到文件末尾并保存退出):

# 确认mod_jk.so文件在Apache的modules目录
LoadModule jk_module modules/mod_jk.so

# 即将创建workers.properties文件到Apache的conf目录
JkWorkersFile conf/workers.properties

JkLogFile     logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel    emerg
# Select the log format
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 %p %q %r %v %U"

# balancer必须与workers.properties文件中worker.list的名字相同
JkMount /* balancer
# stat必须与workers.properties文件中worker.list的名字相同
JkMount /status stat

在Apache的conf目录(与httpd.conf位置相同)创建workers.properties文件,粘贴以下内容,保存退出。

worker.list=balancer,stat

worker.tomcat1.type=ajp13
worker.tomcat1.host=172.16.3.40
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=10

worker.tomcat2.type=ajp13
worker.tomcat2.host=172.16.3.41
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=10

worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2

worker.stat.type=status

此时,重启Apache服务,再次确认http://A_IP/80端口首页It works!是否正常打开,确保Apache正常工作。

搭建Tomcat环境和部署probe


集群中的工作单元,除了权重值和路由标识外,部署的应用必须完全相同。那么,只需先在A机器上搭建Tomcat环境和部署probe后,拷贝到其它两台机器即可。下面开始:

在A机器上安装JDK环境,搭建Tomcat环境后,启动并测试以确保Tomcat正常工作。

接下来,修改tomcat中conf\server.xml配置,请参考:

打开注释并设置jvmRoute,这样Tomcat的SessionId就会长成这样:<Random Value like before>.<jvmRoute>,请注意,这里需要改成tomcatB。

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">

接下来,配置Cluster和广播地址以实现Session Replication,将Cluster配置到Engine中,其中D类(范围:224.0.0.0 to 239.255.255.255)地址,这里是228.0.0.4为广播地址,Windows默认已开启广播,参考以下内容:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
    <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" /> 
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> 
        </Sender>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6" /> 
        <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" /> 
    <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /> 
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" /> 
</Cluster>

最后,在Application的web.xml中,配置<distributable/>标签。

这里以probe.war为例,初次启动tomcat后,在tomcat中webapps下找到解开后的probe,将<distributable/>标签配置到web.xml中,同时,修改tomcat中cong/tomcat-users.xml,增加以下内容:

<role rolename="manager"/>
<role rolename="admin"/>
<user username="admin" password="" roles="admin,manager"/>

将以上内容复制到B机器,并记得修改对应的jvmRoute,启动A和B机器上的tomcat,通过链接http://A_IP/probe访问probe,可测试并验证Tomcat Cluster是否配置成功。

在A机器上安装Wireshark,启动后点击工具栏第一个按钮List the available capture interfaces ...,弹出的对话框中选择对应的网卡,并点击Start按钮,开始监控网络包,Filter中填写ip.addr == B_IP,Apply后可以看到大约每隔0.5秒(默认)的数据包,内容大约如下:

Source: B_IP, Destination: 228.0.0.4, Protocal: UDP, Source port: 45564 Destination port: 45564

需要注意的是:

  • Session-Sticky的局域网内广播有一定开销,当Cluster中机器较多时也容易有Broadcast Storm Problem问题。建议尽量使用Non-Sticky方式。
  • Cluster只能保证服务可用,只有从Application层面满足了Stateless才能实现无缝切换,即Request FailOver

本文参考Tomcat Clustering系列5篇进行测试和实践,有梯子的最好看原版。

就酱,您有任何问题或建议,请给我写邮件


Yinwer /
Published under (CC) BY-NC-SA