Cluster 对象

目录

简介

Tomcat 集群实现提供了会话复制、上下文属性复制以及集群范围的 WAR 文件部署。虽然 Cluster 配置相当复杂,但默认配置对大多数用户来说开箱即用。

Tomcat Cluster 实现具有很高的可扩展性,因此我们暴露了众多选项,这使得配置看起来很多,但请不要失去信心,相反,您对正在发生的一切拥有巨大的控制权。

安全性

集群实现的编写基于这样一个前提:所有与集群相关的网络流量都使用安全、受信任的网络。在不安全、不受信任的网络上运行集群是不安全的。

为 Tomcat 集群提供安全、受信任的网络有许多选项。这些选项包括

  • 私有局域网 (LAN)
  • 虚拟专用网络 (VPN)
  • IPSEC

EncryptInterceptor 提供了保密性和完整性保护,但它不能防御在不受信任的网络上运行 Tomcat 集群所涉及的所有风险,特别是 DoS 攻击。

Engine 与 Host 的放置

您可以将 <Cluster> 元素放置在 <Engine> 容器或 <Host> 容器内部。
将其放置在 Engine 中,意味着您将在 Tomcat 的所有虚拟主机中支持集群,并共享消息组件。当您将 <Cluster> 放置在 <Engine> 元素内部时,集群会将每个会话管理器的主机名附加到管理器名称中,以便名称相同但位于两个不同主机内部的两个 Context 可以区分开来。

Context 属性复制

要配置 Context 属性复制,只需通过替换您的应用程序 Context 所使用的 Context 实现即可。

<Context className="org.apache.catalina.ha.context.ReplicatedContext"/>

此 Context 扩展了 Tomcat StandardContext,因此基础实现中的所有选项都有效。

嵌套组件

Manager:
会话管理器元素标识了此集群实现中使用的会话管理器类型。此管理器配置与您在常规 <Context> 配置中使用的配置相同。
默认值是 org.apache.catalina.ha.session.DeltaManager,它与 SimpleTcpCluster 实现紧密耦合。其他管理器,例如 org.apache.catalina.ha.session.BackupManager,是/可能是松散耦合的,并且不依赖 SimpleTcpCluster 进行数据复制。

Channel:
Channel 及其子组件都是集群组 IO 层的一部分,它是一个我们昵称为“Tribes”的独立模块。
网络层、消息传递和成员资格逻辑的任何配置和调优都将在 Channel 及其嵌套组件中完成。您可以随时了解更多关于 Apache Tribes 的信息。

Valve:
Tomcat 集群实现使用 Tomcat Valves 来跟踪请求何时进入和退出 Servlet 容器。它使用这些 Valve 来智能地决定何时复制数据,这总是在请求结束时进行。

Deployer:
Deployer 组件是 Tomcat Farm 部署器。它允许您在集群范围内部署和取消部署应用程序。

ClusterListener:
ClusterListener 用于跟踪使用 SimpleTcpCluster 发送和接收的消息。如果您希望跟踪消息,可以在此处添加监听器,或者可以向 Channel 对象添加 Valve。

属性

SimpleTcpCluster 属性

属性描述
className

主要的集群类,目前只有一个可用:org.apache.catalina.ha.tcp.SimpleTcpCluster

channelSendOptions

Tribes 通道发送选项,默认值为 8
此选项用于设置 SimpleTcpCluster 使用的所有消息的标志。该标志决定了消息的发送方式,它是一个简单的逻辑或 (OR) 运算。

int options = Channel.SEND_OPTIONS_ASYNCHRONOUS |
              Channel.SEND_OPTIONS_SYNCHRONIZED_ACK |
              Channel.SEND_OPTIONS_USE_ACK;

一些值包括
Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004
Channel.SEND_OPTIONS_ASYNCHRONOUS = 0x0008
Channel.SEND_OPTIONS_USE_ACK = 0x0002
因此,要使用 ACK 和 ASYNC 消息,标志将是 10 (8+2)
请注意,如果您使用 ASYNC 消息传递,会话的更新消息可能会以与发送顺序不同的顺序由接收节点处理。

各种 channelSendOptions 值在发送节点的吞吐量和发送或接收节点(一个或多个)失败时的复制可靠性之间提供了权衡。以下是一些常见选项。“消息”可以是节点之间发送的任何消息,但这里只考虑会话更改消息。

channelSendOptions="8" / channelSendOptions="async" 就发送方而言,一旦消息被放入发送方队列以传输到其他节点,该消息就被“发送”了。消息可能无法到达任何或所有接收节点,也可能无法在任何已到达的节点上成功处理。此选项在发送方提供最高的吞吐量,但可靠性最低,因为触发请求将在不知道会话复制成功/失败的情况下完成。

channelSendOptions="2" / channelSendOptions="use_ack" 发送方将阻塞当前请求的完成,直到所有接收节点都确认它们已收到消息,但不一定已处理该消息。此选项将导致发送节点上的吞吐量降低,因为消息必须传输并收到确认,但可靠性高于异步模型。

channelSendOptions="6" / channelSendOptions="sync,use_ack" 发送方将阻塞当前请求的完成,直到所有接收节点都确认它们已接收并处理了消息。此选项将具有最低的吞吐量(在这三个选项中),但可靠性最高。

您还可以将这些选项设置为逗号分隔的字符串,例如“async, multicast”,它将被转换为 Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST
有效的选项名称包括“asynchronous”(别名“async”)、“byte_message”(别名“byte”)、“multicast”、“secure”、“synchronized_ack”(别名“sync”)、“udp”、“use_ack”

channelStartOptions

设置集群使用的 <Channel> 对象的启动和停止标志。默认值是 Channel.DEFAULT,它会启动所有通道服务,例如发送器、接收器、成员关系发送器和成员关系接收器。目前有以下标志可用:

Channel.DEFAULT = Channel.SND_RX_SEQ (1) |
                  Channel.SND_TX_SEQ (2) |
                  Channel.MBR_RX_SEQ (4) |
                  Channel.MBR_TX_SEQ (8);

当使用静态成员服务 org.apache.catalina.tribes.membership.StaticMembershipService 时,您必须确保此属性配置为使用默认值。

heartbeatBackgroundEnabled

标志是否在容器后台线程中调用通道心跳。默认值为 false。启用此标志时,请不要忘记禁用通道心跳线程。

notifyLifecycleListenerOnFailure

标志是否在所有 ClusterListener 无法接受通道消息时通知 LifecycleListeners。默认值为 false。