叢集物件

目錄

簡介

Tomcat 叢集實作提供 Session 複製、內容屬性複製和叢集範圍的 WAR 檔案部署。雖然 Cluster 組態相當複雜,但預設組態對大多數人來說應該能直接使用。

Tomcat 叢集實作非常具有擴充性,因此我們提供了許多選項,讓組態看起來很複雜,但不要失去信心,相反地,您可以對正在進行的事情有極大的控制權。

安全性

叢集實作基於所有叢集相關網路流量都使用安全、受信任的網路。在不安全、不受信任的網路中執行叢集並不安全。

有許多選項可以為 Tomcat 叢集提供安全、受信任的網路。這些選項包括

  • 私人 LAN
  • 虛擬私人網路 (VPN)
  • IPSEC

EncryptInterceptor 提供機密性和完整性保護,但無法防範在不受信任的網路中執行 Tomcat 叢集的所有風險,特別是 DoS 攻擊。

引擎與主機配置

您可以在 <Engine> 容器或 <Host> 容器中配置 <Cluster> 元素。
將其放置在引擎中,表示您將支援 Tomcat 中所有虛擬主機中的叢集,並共用訊息元件。當您將 <Cluster> 放置在 <Engine> 元素內部時,叢集會將每個會話管理員的主機名稱附加到管理員名稱,以便可以區分具有相同名稱但位於兩個不同主機內的兩個內容。

內容屬性複製

若要設定內容屬性複製,只需透過換出用於應用程式內容的內容實作即可執行此動作。

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

此內容會延伸 Tomcat StandardContext,因此 基本實作 中的所有選項都是有效的。

巢狀元件

管理員:
會話管理員元素會識別此叢集實作中使用的會話管理員類型。此管理員設定與您會在一般 <Context> 設定中使用的設定相同。
預設值為 org.apache.catalina.ha.session.DeltaManager,它與 SimpleTcpCluster 實作緊密結合。其他管理員(例如 org.apache.catalina.ha.session.BackupManager)是/可能是鬆散結合的,且不依賴 SimpleTcpCluster 進行其資料複製。

通道:
頻道及其子元件都是叢集群組 IO 層的一部分,而且是我們暱稱為「Tribes」的模組。
網路層、訊息傳遞和成員資格邏輯的任何組態和調整都將在頻道及其巢狀元件中執行。您隨時可以進一步了解 Apache Tribes

閥門:
Tomcat 叢集實作使用 Tomcat Valves 追蹤請求何時進入和離開 servlet 容器。它使用這些閥門能夠在何時複製資料上做出明智的決策,這總是在請求結束時進行。

部署器:
部署元件是 Tomcat Farm Deployer。它允許您在叢集範圍內部署和取消部署應用程式。

叢集偵聽器:
ClusterListener 用於追蹤使用 SimpleTcpCluster 傳送和接收的訊息。如果您想要追蹤訊息,可以在此處新增一個偵聽器,或者可以將一個閥門新增到頻道物件。

屬性

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)
請注意,如果您使用非同步訊息傳遞,則接收節點有可能以與傳送順序不同的順序處理某個階段的更新訊息。

各種 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。