您的位置:首页 > 运维架构 > Tomcat

Tomcat 集群配置(Linux环境)

2017-08-01 02:21 281 查看


Tomcat 集群配置

在生产环境中,加入网站的访问量很大,为了提高访问速度,可以将多个Tomcat服务器与Apache服务器进行集成,在这些Tomcat中各自运行同一个WebApp,由这些Tomcat共同分担 Servlet/JSP 组件任务,这些Tomcat构成一个Cluster集群系统,能够提供高可靠性,高性能计算,负载平衡的优点;
Tomcat 集群需要 JK 插件的支持,其中主要依赖的组件有以下2个:

Loadbalanacer:JK插件上的负载平衡器,负责为集群分配负荷,实现负载平衡;

SimpleTcpCluster:每个Tomcat上的集群管理器,集群上的每个Tomcat通过集群管理器的TCP与其他Tomcat通信,实现HTTP会话的复制;



 

在进行Tomcat集群与Apache集成之前,要先完成Apache,Tomcat,JK插件的下载安装工作,详见:06. Tomcat与Apache集成(Linux环境)

以下是一个 Apache 下 Tomcat 集群的示例操作,为了方便演示,这些Tomcat位于同一个服务器上,同时这两个Tomcat上各自运行一个 helloapp 的JavaWeb应用,系统环境为 Linux;


1、配置集群系统的负载平衡器

1)将JK插件中的 mod_jk_linux.so 复制到 <APACHE_HOME >/moudules 下;
2)在<APACHE_HOME>/conf 下创建文件 workers.properties 文件,添加以下内容:

1
worker.list=worker1,worker2,loadbalancer
2
3
worker.worker1.port=8009       #工作端口
4
worker.worker1.host=localhost   #Tomcat服务器地址
5
worker.worker1.type=ajp13      #JK类型
6
worker.worker1.lbfactor=100      #负载平衡参数
7
8
worker.worker2.port=8109      
9
worker.worker2.host=localhost  
10
worker.worker2.type=ajp13      
11
worker.worker2.lbfactor=100      
12
13
worker.loadbalancer.type=lb
14
worker.loadbalancer.balanced_workers=worker1,worker2
15
worker.loadbalancer.sticky_session=false
16
worker.loadbalancer.sticky_session_force=false
以上文件创建了2个AJP监听器worker:worker1,worker2,分别代表2个Tomcat服务器;其中 lbfactor 参数设置工作符合,在本例中都设置为100,即会分担同样的工作负荷;由于本例中两个Tomcat位于同一个服务器上,所有 port 参数必须设置为不同端口,假如两个Tomcat位于不同服务器,可以使用同一个端口;
本例还配置一个loadbalancer 的 workder,是负载平衡器,具有sticky_session和sticky_session_force 2个主要属性,sticky_session=flase,集群系统会进行会话复制,即一个浏览器客户端可以同多个Tomcat开展同一个会话,此时sticky_session_force对集群系统没什么影响;

sticky_session=true,集群系统不会进行会话复制,即一个浏览器客户端只会同时和一个Tomcat进行会话;此时 sticky_session_force=true,那么集群不会进行会话转移,比如浏览器绑定的会话Tomcat异常终止,会直接返回500;

此时 sticky_session_force=false,那么集群会进行会话转义,比如浏览器绑定的会话Tomcat异常终止,集群会将会话转移到其他Tomcat上;

3)修改<APACHE_HOME>/conf/httpd.conf 文件,在文件末尾添加以下配置:



1

LoadModule jk_module modules/mod_jk_linux.so


2

JkWorkersFile conf/workers.properties   


3

JkLogFile logs/mod_jk.log      


4

JkLogLevel debug


5

JkMount /*.jsp loadbalancer       #JK转发规则


6

JkMount /helloapp/* loadbalancer    #JK转发范围


4)分别修改2个 Tomcat 中 conf/server.xml 文件中的
AJP 连接器端口,确保它们同<APACHE_HOME>/conf/workers.properties 中的配置对应,主要要修改的是 <Connector>
的 AJP port 和 <Engine>的  jvmRoute,如下:

1
#Tomcat1 server.xml 部分
2
<Connector port="8009" protocol="AJP/1.3" />
3
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
4
   
5
#Tomcat2 server.xml 部分
6
<Connector port="8109" protocol="AJP/1.3" />
7
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">  

同时由于已经有Apache负责HTTP解析、接收客户端请求、转发请求,可以关闭Tomcat1,Tomcat2中的HTTP连接器,以提高Tomcat运行性能,即在它们的 server.xml 中间以下部分注释掉:



1

 <!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->


以上为配置负载平衡器的过程;

2、配置集群管理器

以上的配置,无法保证一个客户端访问集群中的一个会话过程中,保持Session ID 不变,要解决这样的问题,还要进行集群管理器的配置
1)分别修改 Tomcat1,Tomcat2 中的 conf/server.xml 文件,在<Engine>中添加<Cluster>,以启动Tomcat的集群管理器,以Tomcat1示例如下:

1
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
2
3
   <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
4
           channelSendOptions="8">
5
6
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
7
            expireSessionsOnShutdown="false"
8
            notifyListenersOnReplication="true"/>
9
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
10
       <Membership className="org.apache.catalina.tribes.membership.McastService"
11
                  bind="127.0.0.1"  
12
                  address="228.0.0.4"
13
                  port="45564"
14
                  frequency="500"
15
                  dropTime="3000"/>
16
       <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
17
                address="auto"
18
                port="4000"
19
                autoBind="100"
20
                selectorTimeout="5000"
21
                maxThreads="6"/>
22
       <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
23
         <Transport  className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
24
       </Sender>
25
   
26
       <Interceptor  className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
27
       <Interceptor  className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
28
      </Channel>
29
30
      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
31
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
32
33
      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
34
               tempDir="/tmp/war-temp/"
35
               deployDir="/tmp/war-deploy/"
36
               watchDir="/tmp/war-listen/"
37
               watchEnabled="false"/>
38
39
      <ClusterListener  className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
40
      <ClusterListener  className="org.apache.catalina.ha.session.ClusterSessionListener"/>
41
42
   </Cluster>   
关于<Cluster>的详细用法可以参考:<CATALINE_HOME>/webapps/docs/cluster-howto.html<CATALINE_HOME>/webapps/docs/config/cluster.html

2)分别修改Tomcat1,Tomcat2中的 helloapp 应用的 web.xml 文件,向其添加一个<distributable>标签;



1

<web-app>


2

   <distributable />


3

   .......


4

</web-app>


当添加了该标签时,每当 Tomcat 启动该应用时,会为它创建 server.xml 中<Cluster>的<Manager>指定的会话管理器;

以上为配置集群管理器的过程,本示例中使用的是 DeltaManager 会话管理器,该管理器能够将一个服务器节点中的会话信息复制到集群上的其他所有服务器节点中,使得Tomcat1,Tomcat2中关于 helloapp 的会话信息是同步的;

DeltaManager 会话管理器适用于规模较小的集群中,如果集群规模比较庞大,适用这个会话管理器会很大地增加网络通信负荷,此时可以更换为 BackupManager 会话管理器,它只会将一个服务器节点中的会话信息备份到集群中其他的服务节点中,在servler.xml中的配置如下:

1
 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
2
           channelSendOptions="8">
3
     <Manager className="org.apache.catalina.ha.session.BackupManager"
4
            expireSessionsOnShutdown="false"
5
            notifyListenersOnReplication="true"
6
            mapSendOptions="6" />
7
    ......
8
 </Cluster>

注意 Tomcat 集群是通过组播的形式通信的,如果Tomcat服务器上有多个网卡,或者使用了虚拟网卡,可能会导致组播失败,此时可以在该Tomcat的 server.xml 中配置<Cluster>的<Membership>,设置该 bind 属性为组播绑定地址(假设组播地址为127.0.0.1),如下:

1

<Membership className="org.apache.catalina.tribes.membership.McastService"


2

         bind="127.0.0.1"  ..../> 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: