简易操作
只需添加
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
到<Engine>或<Host>元素中就可以启用聚类。
使用上述配置将启用使用 DeltaManager 复制会话增量的 all-to-all 会话复制。 All-to-all 是指每个会话都会复制到集群中的所有其他节点。 这适用于较小的集群,但不建议将其用于较大的集群(超过 4 个节点左右)。 此外,在使用 DeltaManager 时,Tomcat 会将会话复制到所有节点,甚至是未部署应用程序的节点。
要解决此问题,需要使用 BackupManager。 BackupManager 仅将会话数据复制到一个备份节点,并且仅复制到部署了应用程序的节点。 一旦有一个使用 DeltaManager 运行的简单集群,可能会想随着集群中节点数量的增加而迁移到 BackupManager。
以下是一些重要的默认值:
-
组播地址为 228.0.0.4
-
多播端口为 45564(端口和地址共同确定群集成员资格)
-
广播的 IP 是
java.net.InetAddress.getLocalHost().getHostAddress()
(确保没有广播 127.0.0.1,这是一个常见的错误) -
侦听复制消息的 TCP 端口是 4000-4100 范围内的第一个可用服务器套接字
-
Listener 配置了 ClusterSessionListener
-
配置了两个拦截器:
TcpFailureDetector
和MessageDispatchInterceptor
以下是默认集群配置:
<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.MessageDispatchInterceptor"/>
</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>
我们将在本文档后面更详细地介绍此部分。
安全
集群实现的编写基础是,所有与集群相关的网络流量都使用一个安全、可信的网络。 在不安全、不受信任的网络上运行集群是不安全的。
有许多选项可用于提供安全、可信的网络以供 Tomcat 集群使用。包括:
-
专用局域网
-
虚拟专用网络 (VPN)
-
IPSEC
EncryptInterceptor 提供机密性和完整性保护,但它并不能防止 与在不受信任的网络上运行 Tomcat 集群相关的所有风险,特别是 DoS 攻击。
集群基础知识
要在 Tomcat 容器中运行会话复制,应完成以下步骤:
-
所有会话属性都必须实现
java.io.Serializable
-
取消server.xml文件中 Cluster 元素的注释
-
如果已定义自定义 cluster valves,请确保在 server.xml 中的 Cluster 元素下也定义了 ReplicationValve
-
如果 Tomcat 实例在同一台计算机上运行,请确保每个实例的 Receiver.port 属性都是唯一的,在大多数情况下,Tomcat 足够聪明,可以通过自动检测 4000-4100 范围内的可用端口来自行解决此问题
-
确保 web.xml 具有 <distributable/> 元素
-
如果使用 mod_jk,请确保在引擎 <Engine name=“Catalina” jvmRoute=“node01” >中设置 jvmRoute 属性,并且 jvmRoute 属性值与 workers.properties 中的工作程序名称匹配
-
确保所有节点具有相同的时间并与 NTP 服务同步
-
确保载均衡器配置为粘性会话模式。
可以通过多种技术实现负载平衡,如 负载平衡 一章所示。
注意:请记住,会话状态是由 Cookie 跟踪的, 因此 URL 必须从外部看起来相同,否则将创建一个新会话。
Cluster 模块使用 Tomcat JULI 日志记录框架,因此可以通过常规 logging.properties 文件配置日志记录。
要跟踪消息,可以在注册表项上启用日志记录:org.apache.catalina.tribes.MESSAGES
。
概述
要在 Tomcat 中启用会话复制,可以遵循三种不同的路径来实现完全相同的效果:
-
使用会话持久性,并将会话保存到共享文件系统 (PersistenceManager + FileStore)
-
使用会话持久性,并将会话保存到共享数据库 (PersistenceManager + JDBCStore)
-
使用内存中复制,使用 Tomcat 附带的 SimpleTcpCluster (lib/catalina-tribes.jar + lib/catalina-ha.jar)
Tomcat 可以使用 DeltaManager 执行会话状态的全对多复制,或者使用 BackupManager 只执行到一个节点的备份复制。多对多复制是一种仅在集群较小时才有效的算法。 对于较大的集群,应该使用 BackupManager 来使用主从会话复制策略,其中会话将仅存储在一个备份节点上。
目前,可以使用 domain worker 属性(mod_jk > 1.2.8)来构建集群分区, 并有可能通过 DeltaManager 获得更具可扩展性的集群解决方案(需要为此配置域拦截器)。 为了在全对全环境中保持网络流量较低,可以将集群拆分为更小的组。 这可以通过为不同的组使用不同的组播地址来轻松实现。一个非常简单的设置如下所示:
DNS Round Robin
|
Load Balancer
/ \
Cluster1 Cluster2
/ \ / \
Tomcat1 Tomcat2 Tomcat3 Tomcat4
这里需要提到的是,会话复制只是集群的开始。另一个用于实现集群的流行概念是 farming, 即只将应用程序部署到一台服务器,集群将在整个集群中分配部署。 这是 FarmWarDeployer 可以包含的所有功能(server.xml 中的集群示例)
在下一节中,将更深入地介绍会话复制的工作原理以及如何配置它。
集群信息
成员资格是使用多播检测信号建立的。 因此,如果希望细分集群,可以通过更改元素中的多播 IP 地址或端口来实现<Membership>。
检测信号包含 Tomcat 节点的 IP 地址和 Tomcat 侦听复制流量的 TCP 端口。 所有数据通信都通过 TCP 进行。
ReplicationValve 用于了解请求何时完成并启动复制(如果有)。 仅当会话已更改时(通过在会话上调用 setAttribute 或 removeAttribute),才会复制数据。
最重要的性能注意事项之一是同步复制与异步复制。 在同步复制模式下,请求不会返回,直到通过网络发送复制的会话并在所有其他集群节点上重新实例化。 同步与异步是使用 channelSendOptions 标志配置的,它是一个整数值。 SimpleTcpCluster/DeltaManager 组合的默认值为 8,这是异步的。 有关各种 channelSendOptions 值的更多讨论,请参阅配置参考。
为方便起见,可以通过名称而不是整数来设置 channelSendOptions,然后在启动时将其转换为其整数值。
有效的选项名称为:“asynchronous”(别名“async”)、“byte_message”(别名“byte”)、
“multicast”、“secure”、“synchronized_ack”(别名“sync”)、“udp”、“use_ack”。
使用逗号分隔多个名称,例如,将选项 SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST
。
可以在 send flag(overview) 或 send flag(javadoc) 上阅读更多内容。 在异步复制期间,在复制数据之前返回请求。异步复制可缩短请求时间,而同步复制可保证在请求返回之前复制会话。
崩溃后将会话绑定到故障转移节点
如果使用的是 mod_jk 但不使用粘性会话,或者由于某些原因粘性会话不起作用,或者只是在进行故障转移, 则需要修改会话 ID,因为它以前包含上一个 tomcat 的工作程序 ID(由 Engine 元素中的 jvmRoute 定义)。 为了解决这个问题,将使用 JvmRouteBinderValve。
JvmRouteBinderValve 重写会话 ID,以确保在故障转移后, 下一个请求将保持粘性(并且不会回退到随机节点,因为 worker 不再可用)。 该Valve将 cookie 中的 JSESSIONID 值改写为同名。 如果没有这个 Valve,将更难确保 mod_jk 模块发生故障时的粘性。
请记住,如果在 server.xml 中添加自己的Valve, 则默认值不再有效,请确保按照默认值定义添加所有适当的Valve。
提示:
使用属性 sessionIdAttribute,可以更改包含旧会话 ID 的请求属性名称。
默认属性名称为 org.apache.catalina.ha.session.JvmRouteOriginalSessionID
。
技巧: 可以通过 JMX 启用此 mod_jk 周转模式,然后再将节点拖放到所有备份节点! 在所有 JvmRouteBinderValve 备份上设置 enable true, 在 mod_jk 时禁用 worker,然后删除节点并重新启动它。 然后启用 mod_jk Worker 并再次禁用 JvmRouteBinderValves。此用例意味着仅迁移请求的会话。
配置示例
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<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="5000"
selectorTimeout="100"
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.MessageDispatchInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<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 className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
主元素,在此元素内,可以配置所有群集详细信息。channelSendOptions 是附加到 SimpleTcpCluster 类或调用 SimpleTcpCluster.send 方法的任何对象发送的每条消息的标志。发送标志的描述可以在 javadoc 站点上找到。 DeltaManager 使用 SimpleTcpCluster.send 方法发送信息,而备份管理器直接通过通道发送信息。 有关更多信息,请访问参考文档。
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
-->
这是 manager 配置的模板,如果元素中未定义 manager,则将使用<Context>该模板。 在 Tomcat 5.x 中,每个标记为可分发的 Web 应用程序都必须使用相同的管理器,自 Tomcat 以来,情况不再如此, 可以为每个 Web 应用程序定义一个管理器类,以便可以在集群中混合使用管理器。 显然,一个节点的应用程序上的 Manager 必须与另一个节点上同一应用程序上的同一 Manager 相对应。 如果没有为 Web 应用程序指定管理器,并且 Web 应用程序被标记为 <distributable/> Tomcat, 则 Tomcat 将采用此管理器配置并创建一个克隆此配置的管理器实例。 有关更多信息,请访问参考文档。
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
channel 元素是 Tribes,这是 Tomcat 内部使用的组通信框架。 此元素封装了与通信和成员资格逻辑有关的所有内容。 有关更多信息,请访问参考文档。
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
成员资格是使用多播完成的。请注意,如果想将成员资格扩展到多播以外的点, Tribes 还支持使用 StaticMembershipInterceptor 的静态成员资格。 address 属性是使用的多播地址,port 是多播端口。这两者共同创建了集群分离。 如果需要 QA 集群和生产集群,最简单的配置是让 QA 集群位于与生产集群不同的多播地址/端口组合上。
成员资格组件将自身的 TCP 地址/端口广播到其他节点,以便节点之间的通信可以通过 TCP 完成。 请注意,正在广播的地址是 Receiver.address 属性之一。 有关更多信息,请访问参考文档
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
在 tribe 中,发送和接收数据的逻辑被分解为两个功能组件。顾名思义,Receiver 负责接收消息。 由于 Tribes 堆栈是无线程的(其他框架现在也采用了这种流行的改进), 因此此组件中有一个线程池,该线程池具有 maxThreads 和 minThreads 设置。
address 属性是 membership 组件将广播到其他节点的主机地址。 有关更多信息,请访问参考文档
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
顾名思义,发送方组件负责向其他节点发送消息。 发送者有一个 shell 组件 ReplicationTransmitter,但实际完成的工作是在子组件 Transport 中完成的。 部落支持拥有一个发送者池,因此可以并行发送消息,如果使用 NIO 发送者,也可以并发发送消息。
Concurrently 表示同时向多个发件人发送一条消息,而 Parallel 表示同时向多个发件人发送多封消息。 有关更多信息,请访问参考文档
<Channel>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
Tribes 使用堆栈发送消息。堆栈中的每个元素都称为拦截器,其工作方式与 Tomcat servlet 容器中的 valve 非常相似。 使用拦截器,可以将 logic 分解为更易于管理的代码段。上面配置的拦截器是:
-
TcpFailureDetector - 通过 TCP 验证崩溃的成员,如果多播数据包被丢弃,此拦截器可防止误报,即标记为崩溃的节点,即使它仍然处于活动状态并正在运行。
-
MessageDispatchInterceptor - 将消息分派到线程(线程池)以异步发送消息。
-
ThroughputInterceptor - 打印出有关消息流量的简单统计信息。
请注意,拦截器的顺序很重要。在 server.xml 中的定义方式就是在 channel stack 中的表示方式。 把想象成一个链表,head 是第一个最强的拦截器,而 tail 是最后一个。
有关更多信息,请访问参考文档
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
集群使用 Valve 来跟踪对 Web 应用程序的请求,在上面提到了 ReplicationValve 和 JvmRouteBinderValve。 <Cluster> 元素本身不是 Tomcat 中管道的一部分,而是集群将 valve 添加到其父容器中。 如果在<Cluster>元素中配置了元素<Engine>,则气门将添加到引擎中,依此类推。
有关更多信息,请访问参考文档
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
默认的 tomcat 集群支持农场部署,即集群可以在其他节点上部署和取消部署应用程序。 此组件的状态目前处于变化状态,但很快就会得到解决。 Tomcat 5.0 和 5.5 之间的部署算法发生了变化,此时,该组件的逻辑发生了变化,部署目录必须与 webapps 目录匹配。 有关更多信息,请访问参考文档
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
由于 SimpleTcpCluster 本身是 Channel 对象的发送方和接收方, 因此组件可以将自己注册为 SimpleTcpCluster 的侦听器。 ClusterSessionListener 上面的侦听器侦听 DeltaManager 复制消息, 并将增量应用于管理器,而管理器又将其应用于会话。 有关更多信息,请访问参考文档
集群架构
组件级别:
Server
|
Service
|
Engine
| \
| --- Cluster --*
|
Host
|
------
/ \
Cluster Context(1-N)
| \
| -- Manager
| \
| -- DeltaManager
| -- BackupManager
|
---------------------------
| \
Channel \
----------------------------- \
| \
Interceptor_1 .. \
| \
Interceptor_N \
----------------------------- \
| | | \
Receiver Sender Membership \
-- Valve
| \
| -- ReplicationValve
| -- JvmRouteBinderValve
|
-- LifecycleListener
|
-- ClusterListener
| \
| -- ClusterSessionListener
|
-- Deployer
\
-- FarmWarDeployer
运作方式
为了便于理解集群的工作原理,我们将带了解一系列场景。 在此方案中,只计划使用两个 tomcat 实例 TomcatA 和 TomcatB。将介绍以下事件顺序:
-
TomcatA 启动
-
TomcatB 启动(等待 TomcatA 启动完成)
-
TomcatA 收到请求,创建会话 S1。
-
TomcatA 崩溃
-
TomcatB 收到会话 S1 的请求
-
TomcatA 启动
-
TomcatA 收到请求,在会话 (S1) 上调用 invalidate
-
TomcatB 收到新会话的请求 (S2)
-
TomcatA 会话 S2 因不活动而过期。
好了,现在已经有了一个很好的序列,将帮助了解会话复制代码中发生的具体情况。
-
TomcatA 启动
Tomcat 使用标准启动序列启动。创建 Host 对象时,将有一个集群对象与之关联。 解析上下文时,如果 distributable 元素位于 web.xml 文件中, 则 Tomcat 会要求 Cluster 类(在本例中为 SimpleTcpCluster)为复制的上下文创建管理器。 因此,启用集群后,在 web.xml Tomcat 中设置的 distritable(可分发) 将为该上下文创建一个 DeltaManager,而不是 StandardManager。 cluster 类将启动成员资格服务(multicast)和复制服务(tcp unicast)。 本文档中将进一步介绍体系结构。
-
TomcatB 启动
当 TomcatB 启动时,遵循与 TomcatA 相同的顺序,但有一个例外。 集群已启动,并将建立成员资格(TomcatA、TomcatB)。 TomcatB 现在将从集群中已存在的服务器(在本例中为 TomcatA)请求会话状态。 TomcatA 响应请求,在 TomcatB 开始侦听 HTTP 请求之前,状态已从 TomcatA 传输到 TomcatB。 如果 TomcatA 没有响应,TomcatB 将在 60 秒后超时,发出日志条目,然后继续启动。 会话状态将针对其 web.xml 中具有 distributable 的每个 Web 应用程序进行传输。 (注意:要有效地使用 session replication,所有 tomcat 实例都应该配置相同。
-
TomcatA 收到请求,创建会话 S1
进入 TomcatA 的请求的处理方式与没有会话复制的方式完全相同,直到请求完成, 此时 ReplicationValve 将在将响应返回给用户之前拦截请求。 此时,它发现会话已被修改,并使用 TCP 将会话复制到 TomcatB。 一旦序列化数据被移交给操作系统的 TCP 逻辑,请求就会通过 valve 管道返回给用户。 对于每个请求,将复制整个会话,这允许在不调用 setAttribute 或 removeAttribute 的情况下 修改会话中的属性的代码进行复制。useDirtyFlag 配置参数可用于优化会话的复制次数。
-
TomcatA 崩溃
当 TomcatA 崩溃时,TomcatB 会收到一条通知,指出 TomcatA 已退出集群。 TomcatB 从其成员列表中删除 TomcatA,并且 TomcatA 将不再收到 TomcatB 中发生的任何更改的通知。 负载均衡器会将请求从 TomcatA 重定向到 TomcatB,并且所有会话都是最新的。
-
TomcatB 收到会话 S1 的请求
没什么令人兴奋的,TomcatB 会像处理任何其他请求一样处理这个请求。
-
TomcatA 启动
启动时,在 TomcatA 开始接受新请求并使其可用之前,将遵循上述启动顺序。 将加入集群,联系 TomcatB 以获取所有会话的当前状态。 一旦它收到会话状态,它就会完成加载并打开其 HTTP/mod_jk 端口。 因此,在从 TomcatB 收到会话状态之前,不会向 TomcatA 发送任何请求。
-
TomcatA 收到请求,在会话 (S1) 上调用 invalidate
无效调用被拦截,会话与无效会话一起排队。 当请求完成时,它不会发送已更改的会话, 而是向 TomcatB 发送“过期”消息,并且 TomcatB 也会使会话失效。
-
TomcatB 收到新会话的请求 (S2)
与步骤 3 中的场景相同)
-
TomcatA 会话 S2 因不活动而过期。
invalidate 调用的拦截方式与用户使会话失效时的方式相同,并且会话与失效会话一起排队。 此时,在另一个请求通过系统并检查无效队列之前,不会复制失效的会话。
成员资格
群集成员资格是使用非常简单的多播 ping 建立的。 每个 Tomcat 实例都会周期性地发出一个组播 ping,在 ping 消息中, 实例会广播它的 IP 和 TCP 监听端口进行复制。 如果实例在给定时间范围内未收到此类 ping,则该成员被视为已死亡。 非常简单,而且有效。当然,需要在系统上启用多路广播。
TCP 复制
收到多播 ping 后,该成员将添加到集群中。 在下一个复制请求中,发送实例将使用主机和端口信息并建立 TCP 套接字。 使用此套接字,它会发送序列化数据。选择 TCP 套接字的原因是它具有内置的流控制和保证交付。
使用框架的分布式锁定和页面 Tomcat
不会使会话实例在整个集群中保持同步。 这种 logic 的实现会带来很多开销,并导致各种问题。 如果客户端使用多个请求同时访问同一会话,则最后一个请求将覆盖集群中的其他会话。
使用 JMX 监控集群
当使用集群时,监控是一个非常重要的问题。一些集群对象是 JMX MBean
将以下参数添加到启动脚本中:
set CATALINA_OPTS=\
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=%my.jmx.port% \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false
集群 Mbean 列表
名称Name | 说明Description | MBean ObjectName - 引擎 | MBean ObjectName - 主机 |
---|---|---|---|
Cluster集群 |
完整的集群元素 |
type=Cluster |
type=Cluster,host=${HOST} |
DeltaManager |
此管理器控制会话并处理会话复制 |
type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST} |
type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST} |
FarmWarDeployer |
管理将应用程序部署到集群中所有节点的过程 |
不支持 |
type=Cluster, host=${HOST}, component=deployer |
Member成员 |
表示集群中的节点 |
type=Cluster, component=member, |
name=${NODE_NAME} type=Cluster, host=${HOST}, component=member, name=${NODE_NAME} |
ReplicationValve |
此valve控制到备份节点的复制 |
type=Valve,name=ReplicationValve |
type=Valve,name=ReplicationValve,host=${HOST} |
JvmRouteBinderValve |
这是一个集群回退valve,用于将会话 ID 更改为当前的 tomcat jvmroute |
type=Valve,name=JvmRouteBinderValve, context=${APP.CONTEXT.PATH} |
type=Valve,name=JvmRouteBinderValve,host=${HOST}, context=${APP.CONTEXT.PATH} |
常见问题
请参阅 常见问题解答的集群部分。