配置tomcat 集群

tomcat 集群解决的问题:

1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)

2:如何分发请求到各个应用服务器实现压力分解:(这里的解决方案是用apache做 web服务器)

tomcat 集群配置:

  我是利用apache + mod_JK+ tomcat (两个)在window10上进行配置的;

  首先下载 Apache  http://archive.apache.org/dist/httpd/binaries/win32/

  下载 mod_JK  https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/  到这里找到自己想下载的版本 这里下载的是一个后缀名为.so 的文件

  下载tomcat  链接:https://pan.baidu.com/s/1cWw_KaM1HIaA2uqOo8B-Pw 密码:cfbr 我用的是tomcat8 这里百度云直接分享了。

  我这里下载的只有tomcat 你还需要把jdk也下载并安装,确保tomcat可以正常使用

安装 apache  

  根据提示 一直next 直到看见这步

  这里的名称随便写我这里指示举个例子  

  ctuser.cn

  www.ctuser.cn

  [email protected]

  这样写就可以

  然后在一直next .

  安装完成之后在走下角可以看到点开之后能看到

  

  表示安装成功 ,也可以在浏览器上访问http://localhost:80 出现 It works!也表示安装成功。我的Apache下载到了 c盘下的Apahce/Apache中

 将下载的mod-jk 后缀名为.so 的文件复制粘贴到你刚才下载的Apache中,注意是你自己的安装目录中我这里的目录为C:\Apache\Apache 在这里有个文件名为modules 的文件夹,将将下载的mod-jk 后缀名为.so 的文件复制粘贴 到该文件夹中。

  下载tomcat 

    下载完成后解压到任意目录中

  

  配置相关文件

    首先在C:\Apache\Apache(这是我安装apache 的目录,你们的应该找到自己安装的目录),conf文件下添加文件 mod_jk.conf 

在mod_jk.conf 中添加信息:  

#加载mod_jk Module  这个modules/mod_jk-1.2.31-httpd-2.2.3.so  后面的后缀名为.so 的文件是你刚才复制到modules这里的,你们应找到自己下载的文件名。
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so 

#指定worlers.properties 文件路径
JkWorkersFile conf/workers.properties

#指定那些请求给tomcat处理
JkMount /* controller  

  接着在conf 文件夹下添加文件 workers.properties 

在workers.properties 中添加信息

#server
worker.list = controller

# ==== tomcat1 =====
#ajp13端口号,在tomcat下server.xml 默认为8080
worker.tomcat1.port=7009

#tomcat的主机地址,如果不是本机,请填写ip地址
worker.tomcat1.host=localhost

#协议类型
worker.tomcat1.type=ajp13

#server的加权比重,值越高,分得的请求越多
worker.tomcat1.lbfactor=1

# ==== tomcat2 =====
worker.tomcat2.port=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1

#===controller,负责均衡控制器=====
#负责均衡控制器类型,lbfactor 是负责平衡因数
worker.controller.type=lb

#指定分担请求的tomcat列表
worker.controller.balance_workers=tomcat1,tomcat2


#粘性session(默认是打开的)
workers.controller.sticky_session=false

#设置用于负载均衡的server的session可否共享
worker.controller.sticky_session_force=1

然后在httpd.conf 的末尾添加Include conf/mod_jk.conf 

上面就是配置apache 的相关文件

接下来配置tomcat 

  下载了两个tomcat文件

    在第一个tomcat 中 打开conf目录下的server.xml 文件

      在tomcat 中要修改这几个地方 

      1. 找到 <Server port="8005" shutdown="SHUTDOWN"> 将两个tomcat 的port修改成不一样的即可 我设置的是第一个tomcat 7005,第二个tomcat 9005

      2.找到

      <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443" /> 由于我是一台电脑  两个tomcat 所以要把prot端口设置成不一样的我设置的是第一个tomcat 8090,第二个tomcat 9080

      3.  找到<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 将port修改成不一样的,我设置的是第一个tomcat 7009, 第二个tomcat 9009

      4. 找到<Engine name="Catalina" defaultHost="localhost"> 在后面添加 jvmRoute="tomcat1"  我这里设置的是

        第一个tomcat<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

        第二个tomcat<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

        这里jvmRoute 的名字要跟 在Apache/conf中添加的workers.properies 中 的一样 

          例如 

            第一个tomcat 中 <Engine name="Catalina" defaultHost="localhost" jvmRoute="test1">

            第二个tomcat 中 <Engine name="Catalina" defaultHost="localhost" jvmRoute="test2">

            workers.properies中

              worker.test1.port=7009

              worker.test2.port=9009

            后面所有的都要修改

      5. 找到</Engine>标签 在这个标签内添加信息

        

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<!--
Manager决定如何管理集群的Session信息。Tomcat提供了两种Manager:BackupManager和DeltaManager
BackupManager-集群下的所有Session,将放到一个备份节点。集群下的所有节点都可以访问此备份节点
DeltaManager-集群下某一节点生成、改动的Session,将复制到其他节点。
DeltaManager是Tomcat默认的集群Manager,能满足一般的开发需求
使用DeltaManager,每个节点部署的应用要一样;使用BackupManager,每个节点部署的应用可以不一样.

className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管理.
expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失效
notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知session listeners
maxInactiveInterval-集群下Session的有效时间(单位:s)。
maxInactiveInterval内未活动的Session,将被Tomcat回收。默认值为1800(30min)
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>

<!--
Channel是Tomcat节点之间进行通讯的工具。
Channel包括5个组件:Membership、Receiver、Sender、Transport、Interceptor
-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!--
Membership维护集群的可用节点列表。它可以检查到新增的节点,也可以检查到没有心跳的节点
className-指定Membership使用的类
address-组播地址
port-组播端口
frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500
dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000

注: 组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。
一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。
它提高了数据传送效率,减少了骨干网络出现拥塞的可能性
相同组播地址、端口的Tomcat节点,可以组成集群下的子集群
-->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>

<!--
Receiver : 接收器,负责接收消息
接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)

className-指定Receiver使用的类
address-接收消息的地址
port-接收消息的端口
autoBind-端口的变化区间
如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听
selectorTimeout-NioReceiver内轮询的超时时间
maxThreads-线程池的最大线程数
-->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

<!--
Sender : 发送器,负责发送消息
Sender内嵌了Transport组件,Transport真正负责发送消息
-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<!--
Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
-->
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>

<!--
Interceptor : Cluster的拦截器
TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,
此时TcpFailureDetector可以拦截到某个节点关闭的信息,
并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

<!--
MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为
Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。
设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,
MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<!--
Valve : 可以理解为Tomcat的拦截器
ReplicationValve-在处理请求前后打日志;过滤不涉及Session变化的请求
vmRouteBinderValve-Apache的mod_jk发生错误时,保证同一客户端的请求发送到集群的同一个节点
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<!--
Deployer : 同步集群下所有节点的一致性。Deployer没试验成功过。。。
-->
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<!--
ClusterListener : 监听器,监听Cluster组件接收的消息
使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager
-->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

 

这些粘贴复制即可 ,但是要注意一点 在Receiver 标签中的port 要设置成不一样的 

以上 tomcat 集群配置完成。

将项目打成war包,分别放到两个tomcat的webwebapps中即可。

ps: 有人说需要在项目中web.xml文件中添加 <distrbutable/> 属性,我没有找到是为什么 ?有大神可以告诉我下 -.-

  有什么错误 希望大家告诉我,我好去修改,给大家一个更完整的答案!!!!!!

   

猜你喜欢

转载自www.cnblogs.com/YJMST/p/9044676.html