黑帽联盟

 找回密码
 会员注册
查看: 1415|回复: 0
打印 上一主题 下一主题

[集群服务] Tomcat 8 server.xml的Cluster标签详解

[复制链接]

295

主题

18

听众

969

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    慵懒
    2024-12-6 00:09
  • 签到天数: 377 天

    [LV.9]以坛为家II

    配置Tomcat集群时,在每个Tomcat节点的server.xml中添加了Cluster标签

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

    其实<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>等同于如下配置(以下是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.ClusterSessionListener"/>
    </Cluster>
    Cluster

    Tomcat集群配置。集群的配置比较复杂,默认的集群配置可以满足一般的开发需求

    常用属性:

    className-指定Cluster使用的类

    channelSendOptions-Cluster发送消息的方式

    channelSendOptions可以设置为2、4、8、10,每个数字代表一种方式

    2 = Channel.SEND_OPTIONS_USE_ACK(确认发送)

    4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送)

    8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送)

    在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此时channelSendOptions设为10

    Manager

    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)

    Channel

    Channel是Tomcat节点之间进行通讯的工具。Channel包括5个组件:Membership、Sender、Transport、Receiver、Interceptor

    Membership

    Membership维护集群的可用节点列表。它可以检查到新增的节点,也可以检查到没有心跳的节点

    常用属性:

    className-指定Membership使用的类

    address-组播地址

    port-组播端口

    frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500

    dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000

    组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。它提高了数据传送效率,减少了骨干网络出现拥塞的可能性


    相同组播地址、端口的Tomcat节点,可以组成集群下的子集群

    Sender

    发送器,负责发送消息

    Sender内嵌了Transport组件,Transport真正负责发送消息

    Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)

    Receiver

    接收器,负责接收消息

    接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)

    常用属性:

    className-指定Receiver使用的类

    address-接收消息的地址

    port-接收消息的端口

    autoBind-端口的变化区间

    如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听

    selectorTimeout-NioReceiver内轮询的超时时间

    maxThreads-线程池的最大线程数

    Interceptor

    Cluster的拦截器

    TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,此时TcpFailureDetector可以拦截到某个节点关闭的信息,并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表

    MessageDispatch15Interceptor-MessageDispatch15Interceptor查看Cluster组件发送消息的方式是否设置为Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。设置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender

    Valve

    Valve可以理解为Tomcat的拦截器

    ReplicationValve-在处理请求前后打日志;过滤不涉及Session变化的请求

    JvmRouteBinderValve-Apache的mod_jk发生错误时,保证同一客户端的请求发送到集群的同一个节点

    Deployer

    同步集群下所有节点的一致性。Deployer没试验成功过。。。

    ClusterListener

    监听器,监听Cluster组件接收的消息

    使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager


    文章转载自:https://blog.csdn.net/flyliuweisky547/article/details/21980825
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部