tomcat 集群 二 集群搭建 负载均衡

举报
lu_zhishen 发表于 2020/12/02 22:28:17 2020/12/02
【摘要】 二、tomcat 集群2.1简介如果网站的访问量特别大,为了提高访问速度,可以将多个tomcat服务器与apache 集成,让他们共同分担servlet/jsp组件任务,从而构成一个tomcat 集群,有点:高可靠性,一个服务器故障,其他的不受影响,高性能计算,负载平衡。本文以同一台机器两个tomcat的集成为例。 2.2 原理1.客户端访问apache,jk 插件的loadbalancer...

二、tomcat 集群

2.1简介

如果网站的访问量特别大,为了提高访问速度,可以将多个tomcat服务器与apache 集成,让他们共同分担servlet/jsp组件任务,从而构成一个tomcat 集群,有点:高可靠性,一个服务器故障,其他的不受影响,高性能计算,负载平衡。

本文以同一台机器两个tomcat的集成为例。

 

2.2 原理

1.客户端访问apachejk 插件的loadbalancer 负责调度tomcat

2.Tomcat上的集群管理器simpletcpcluster 负责tomcat 之间的通信

2.3 准备

下载apache   httpd-2.0.65-win32-x86-no_ssl.msi

Tomcat   apache-tomcat-6.0.39.zip  两份

JK 插件  tomcat-connectors-1.2.40-windows-i386-httpd-2.0.x.zip

2.4 配置

1.安装apache

2.解压两份tomcat,一个是tomcat1 另外一个是tomcat2

3.修改tomcat2 conf/server.xml 文件3处。(如果不是同一台机器不用修改)

<Server port="8105" shutdown="SHUTDOWN">

<Connector port="8180" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" />

<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />

4.Copy mod_jk.so 到 apache modules目录

2.5 配置集群的负载平衡器

apache conf 目录下创建workers.properties 文件,内容如下

 

worker.list=worker1,worker2,loadbalancer

 

worker.worker1.port=8009

worker.worker1.host=localhost

worker.worker1.type=ajp13

worker.worker1.lbfactor=100

 

worker.worker2.port=8109

worker.worker2.host=localhost

worker.worker2.type=ajp13

worker.worker2.lbfactor=100

 

worker.loadbalancer.type=lb

worker.loadbalancer.balanced_workers=worker1,worker2

worker.loadbalancer.sticky_session=false

worker.loadbalancer.sticky_session_force=false

 

其中

worker.loadbalancer.sticky_session=false

worker.loadbalancer.sticky_session_force=false

表示同一个客户端是否一直访问同一个tomcatfalse 表示不同时访问同一个tomcat

 

2.6 修改tomcat 的 httpd.conf 文件

设定jk 相关的参数

末尾添加 

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel debug

JkMount /*.jsp loadbalancer

 

所有的jsp 都走loadbalancer,然后调度具体访问哪一个tomcat服务器。

 

2.7 指定tomcat jvmRoute属性值

Jk workers属性文件 的 loadbalancer 指定某个请求具体走哪一个worker,所以woker 也要与tomcat 进行映射,修改tomcat server.xml engine 元素

Tomcat 1 

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

Tomcat 2

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

 

2.8 测试

修改tomcat 目录webapps 下的root 目录下的index.jsp 文件

body 标签下面添加

Tomcat 1:

<h1>tomcat1</h1>

Sessionid : <%=session.getId() %>

去掉 <%@ page session="false" %>

 

Tomcat  2:

<h2>tomcat1</h2>

Sessionid : <%=session.getId()  %>

去掉 <%@ page session="false" %>

 

重启两个tomcat 和 apache ,同一个浏览器访问http://localhost/index.jsp

会在访问页面轮流显示tomcat1  和 tomcat 2 的字样

 

2.9 问题

同一个浏览器下访问tomcat 返回的sessionid 的值是不相同的,如何修改成相同的。使用集群管理器进行同步复制

 

2.10 启用集群管理器 simpleTcpCluster

修改tomcat1 和 tomcat 2 server.xml 文件,在Engine 元素下面添加Cluster 元素。

<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"

                        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.11 修改web.xml

在 <web-app> 标签下添加 <distributable /> 告知tomcat 服务器在启动的时候创建cluster 的 manager 子元素

 

2.12 测试

重启tomcat 和 apache,访问http://localhost/index.jsp 两次返回的session id 就是一致的了。

 

2.13 其他功能

2.13.1 关闭tomcat http 请求链接

Tomcat 与 其他的 http 服务器集成时,tomcat 主要负责处理http 服务器转发过来的客户请求,通常不直接接受http 请求,为了提高tomcat 的性能,可以关闭http 连接器,注释 

<Connector port="8080" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" />

2.13.2 回话内的所有属性都要实现 java.io.Serializable 接口

2.13.3 设置组播绑定地址

启动tomcat 1 正常,启动tomcat 2 报 skipping state transfer. No members active in cluster group  说名tomcat 2 没有识别到tomcat 1 ,需要修改membership 节点添加 bind 属性,127.0.0.1

 

2.13.4 组播地址

membership  address 属性表示组播地址,设置为228.0.0.4 必修要保证tomcat 所在的机器能连网

 

2.13.5 大规模集群设置

修改DeltaManager 管理器为 BackupManager 管理器

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。