您也可以查看組態參考文件。
群集/會話複製操作指南
重要注意事項
目錄
給心急的人
只要將
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
新增到您的 <Engine>
或 <Host>
元素,即可啟用群集。
使用上述組態將啟用使用 DeltaManager
複製會話增量的全對全會話複製。所謂全對全,是指每個會話都會複製到群集中的所有其他節點。這對於較小的群集來說很有效,但我們不建議用於較大的群集,例如超過 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
中的第一個可用伺服器通訊埠 - 偵聽器已設定為
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 10 容器中執行階段複製,應完成下列步驟
- 所有階段屬性都必須實作
java.io.Serializable
- 取消 server.xml 中
Cluster
元素的註解 - 如果您已定義自訂叢集閥,請確定您已在 server.xml 中 Cluster 元素下定義
ReplicationValve
- 如果您的 Tomcat 執行個體在同一台機器上執行,請確定每個執行個體的
Receiver.port
屬性都是唯一的,在大部分情況下,Tomcat 足夠聰明,可以透過自動偵測範圍 4000-4100 中的可用埠來解決此問題 - 請確定您的
web.xml
具有<distributable/>
元素 - 如果您使用 mod_jk,請確定 jvmRoute 屬性已設定在您的 Engine
<Engine name="Catalina" jvmRoute="node01" >
中,且 jvmRoute 屬性值與 workers.properties 中的 worker 名稱相符 - 請確定所有節點都使用相同時間並與 NTP 服務同步!
- 請確定您的負載平衡器已設定為黏著式階段模式。
負載平衡可透過許多技術達成,如 負載平衡 章節中所述。
注意:請記住,您的階段狀態會由 cookie 追蹤,因此您的 URL 從外部看來必須相同,否則將會建立新的階段。
叢集模組使用 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 來使用主從工作階段複製策略,其中工作階段將僅儲存在一個備份節點。
目前您可以使用網域工作人員屬性(mod_jk > 1.2.8)來建置叢集分割區,並有可能使用 DeltaManager 擁有更具可擴充性的叢集解決方案(您需要為此設定網域攔截器)。為了在全對全環境中降低網路流量,您可以將叢集分割成較小的群組。這可以透過為不同的群組使用不同的多播位址來輕鬆達成。非常簡單的設定會如下所示
DNS Round Robin
|
Load Balancer
/ \
Cluster1 Cluster2
/ \ / \
Tomcat1 Tomcat2 Tomcat3 Tomcat4
在此處要提到的重點是,工作階段複製只是叢集化的開始。另一個用於實作叢集的熱門概念是 farming,亦即,您僅將應用程式部署到一個伺服器,而叢集會將部署分發到整個叢集。這些都是可以使用 FarmWarDeployer(請參閱 server.xml
中的叢集範例)執行的功能
在下一節中,將深入探討工作階段複製如何運作以及如何設定它。
群集資訊
透過多播心跳建立成員資格。因此,如果您希望細分您的叢集,您可以透過變更 <Membership>
元素中的多播 IP 位址或埠來執行此操作。
心跳包含 Tomcat 節點的 IP 位址以及 Tomcat 用於監聽複製流量的 TCP 埠。所有資料通訊都透過 TCP 進行。
ReplicationValve
用於找出請求何時已完成並啟動複製(如果有的話)。只有在工作階段已變更(透過在工作階段上呼叫 setAttribute 或 removeAttribute)時,資料才會被複製。
最重要的效能考量之一是同步與非同步複製。在同步複製模式中,請求不會在複製的工作階段透過網路傳送並在所有其他叢集節點上重新實例化之前傳回。同步與非同步是使用 channelSendOptions
旗標設定的,並且是整數值。SimpleTcpCluster/DeltaManager
組合的預設值為 8,這是非同步的。請參閱 組態參考 以進一步討論各種 channelSendOptions
值。
為了方便,channelSendOptions
可以透過名稱(而非整數)設定,這些名稱在啟動時會轉換為其整數值。有效的選項名稱為:「非同步」(別名「非同步」)、「位元組訊息」(別名「位元組」)、「多播」、「安全」、「同步確認」(別名「同步」)、「UDP」、「使用確認」。使用逗號分隔多個名稱,例如傳遞「非同步、多播」以取得選項 SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST
。
您可以在 傳送旗標(概觀) 或 傳送旗標(javadoc) 上閱讀更多資訊。在非同步複製期間,請求會在資料複製之前傳回。非同步複製會產生較短的請求時間,而同步複製會保證在請求傳回之前複製工作階段。
在當機後將會話繫結到故障轉移節點
如果您正在使用 mod_jk 且未使用固定工作階段,或由於某些原因固定工作階段無法運作,或者您只是正在進行故障轉移,則需要修改工作階段 ID,因為它以前包含先前 Tomcat 的工作人員 ID(如 Engine 元素中的 jvmRoute 所定義)。為了解決這個問題,我們將使用 JvmRouteBinderValve。
JvmRouteBinderValve 會改寫工作階段 ID 以確保下一個請求在故障轉移後仍會保持固定(且不會回退到隨機節點,因為工作人員不再可用)。此閥門會使用相同名稱改寫 cookie 中的 JSESSIONID 值。如果沒有這個閥門,在 mod_jk 模組發生故障時,將難以確保固定性。
請記住,如果您在 server.xml 中新增自己的閥門,那麼預設值就不再有效,請務必新增預設值定義的所有適當閥門。
提示
使用屬性 sessionIdAttribute,您可以變更包含舊會話 ID 的要求屬性名稱。預設屬性名稱為 org.apache.catalina.ha.session.JvmRouteOriginalSessionID。
秘訣
您可以在移除節點到所有備份節點之前,透過 JMX 啟用此 mod_jk turnover 模式!在所有 JvmRouteBinderValve 備份上設定啟用為 true,在 mod_jk 上停用工作人員,然後移除節點並重新啟動!然後啟用 mod_jk 工作人員,並再次停用 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"/>
-->
這是管理員設定範本,如果在 <Context> 元素中未定義管理員,將會使用此範本。在 Tomcat 5.x 中,每個標記為可散發的 Web 應用程式都必須使用相同的管理員,自 Tomcat 以來不再是這樣,您可以為每個 Web 應用程式定義一個管理員類別,以便在叢集中混合管理員。顯然,一個節點應用程式的管理員必須與另一個節點上相同應用程式的相同管理員相應。如果未為 Web 應用程式指定管理員,且 Web 應用程式標記為 <distributable/>,Tomcat 會採用此管理員設定,並建立一個複製此設定的管理員執行個體。
如需更多資訊,請參閱 參考文件
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
頻道元素是 Tribes,這是 Tomcat 內部使用的群組通訊架構。此元素封裝了與通訊和成員資格邏輯相關的所有內容。
如需更多資訊,請參閱 參考文件
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
成員資格是使用多播完成的。請注意,如果您想要將成員資格擴展到多播之外,Tribes 也支援使用 StaticMembershipInterceptor
的靜態成員資格。地址屬性是所使用的多播地址,而埠口是多播埠口。這兩個一起建立叢集分離。如果您想要一個 QA 叢集和一個生產叢集,最簡單的設定是讓 QA 叢集在與生產叢集不同的多播地址/埠口組合上。
成員資格元件會將自己的 TCP 地址/埠口廣播給其他節點,以便節點之間的通訊可以透過 TCP 進行。請注意,正在廣播的地址是 Receiver.address
屬性的地址。
如需更多資訊,請參閱 參考文件
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
在 tribes 中,傳送和接收資料的邏輯已分解成兩個功能元件。Receiver,顧名思義,負責接收訊息。由於 Tribes 堆疊沒有執行緒(現在其他架構也採用的熱門改進),此元件中有一個執行緒池,其中有 maxThreads 和 minThreads 設定。
地址屬性是成員資格元件將廣播給其他節點的主機地址。
如需更多資訊,請參閱 參考文件
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
Sender 元件,顧名思義,負責將訊息傳送給其他節點。Sender 有 shell 元件,即 ReplicationTransmitter
,但實際的工作是在子元件 Transport
中進行的。Tribes 支援擁有傳送者池,以便可以並行傳送訊息,而且如果使用 NIO 傳送者,您也可以同時傳送訊息。
同時傳送表示同一時間傳送一則訊息給多個傳送者,而並行傳送表示同一時間傳送多則訊息給多個傳送者。
如需更多資訊,請參閱 參考文件
<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 容器中的閥門非常類似。使用攔截器,邏輯可以分解成更易於管理的程式碼片段。上面設定的攔截器為
TcpFailureDetector - 透過 TCP 驗證已中斷的成員,如果多播封包遺失,此攔截器會防範誤判,例如將已標記為已中斷的節點視為仍處於運作中。
MessageDispatchInterceptor - 將訊息傳送給執行緒(執行緒池)以非同步傳送訊息。
ThroughputInterceptor - 列印訊息流量的簡單統計資料。
請注意,攔截器的順序很重要。在 server.xml 中定義它們的方式就是它們在通道堆疊中呈現的方式。可以將其視為一個連結清單,其中頭部是第一個攔截器,而尾部是最後一個攔截器。
如需更多資訊,請參閱參考文件
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
叢集使用閥門來追蹤對 Web 應用程式的要求,我們已在上面提到 ReplicationValve 和 JvmRouteBinderValve。<Cluster> 元素本身並非 Tomcat 中管道的一部分,而是叢集將閥門新增到其父容器。如果 <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 之間的部署演算法有所變更,在那個時間點,此元件的邏輯變更為部署目錄必須與 Web 應用程式目錄相符。
如需更多資訊,請參閱參考文件
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
由於 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
)上呼叫失效TomcatB
收到要求,建立新工作階段(S2
)TomcatA
工作階段S2
因閒置而過期。
好的,現在我們有了良好的順序,我們將帶您了解工作階段複製程式碼中確切發生的情況
TomcatA
啟動Tomcat 使用標準啟動順序啟動。當建立 Host 物件時,會將叢集物件與其關聯。當剖析內容時,如果 web.xml 檔案中有可分配元素,Tomcat 會要求叢集類別(在本例中為
SimpleTcpCluster
)為複製的內容建立管理員。因此,在啟用叢集的情況下,在 web.xml 中設定可分配,Tomcat 會為該內容建立DeltaManager
,而不是StandardManager
。叢集類別會啟動成員服務(多播)和複製服務(tcp 單播)。有關架構的更多資訊,請參閱本文檔的後續部分。TomcatB
啟動當 TomcatB 啟動時,它遵循與 TomcatA 相同的順序,只有一個例外。叢集已啟動,並將建立成員資格(TomcatA、TomcatB)。TomcatB 現在將從叢集中已存在的伺服器(在本例中為 TomcatA)請求會話狀態。TomcatA 回應請求,在 TomcatB 開始偵聽 HTTP 請求之前,狀態已從 TomcatA 傳輸到 TomcatB。如果 TomcatA 沒有回應,TomcatB 將在 60 秒後逾時,發出日誌條目,並繼續啟動。會話狀態會傳輸給其 web.xml 中有可分配項的每個 Web 應用程式。(注意:若要有效率地使用會話複製,所有 Tomcat 實例都應設定相同。)
TomcatA
收到要求,建立工作階段S1
。傳入 TomcatA 的請求處理方式與沒有會話複製時完全相同,直到請求完成為止,此時
ReplicationValve
會在回應傳回給使用者之前攔截請求。此時它會發現會話已修改,並使用 TCP 將會話複製到 TomcatB。一旦序列化資料已傳遞給作業系統的 TCP 邏輯,請求就會透過閥門管線傳回給使用者。對於每個請求,整個會話都會被複製,這允許修改會話中屬性的程式碼在不呼叫 setAttribute 或 removeAttribute 的情況下進行複製。可以使用 useDirtyFlag 組態參數來最佳化會話被複製的次數。TomcatA
發生故障當 TomcatA 崩潰時,TomcatB 會收到通知,表示 TomcatA 已從叢集中中斷。TomcatB 會從其成員資格清單中移除 TomcatA,而 TomcatA 將不再收到 TomcatB 中發生的任何變更通知。負載平衡器會將請求從 TomcatA 重新導向到 TomcatB,且所有會話都是最新的。
TomcatB
收到工作階段S1
的要求沒有什麼令人興奮的事,TomcatB 會將請求視為任何其他請求來處理。
TomcatA
啟動在啟動時,在 TomcatA 開始接受新請求並使其可用之前,它將遵循上述 1) 2) 所述的啟動順序。它將加入叢集,與 TomcatB 聯繫以取得所有會話的目前狀態。一旦收到會話狀態,它就會完成載入並開啟其 HTTP/mod_jk 連接埠。因此,在 TomcatA 從 TomcatB 收到會話狀態之前,不會有任何請求傳送至 TomcatA。
TomcatA
收到要求,在工作階段(S1
)上呼叫失效攔截了 invalidate 呼叫,會話會與已失效的會話一起排隊。當請求完成時,它不會傳送已變更的會話,而是傳送「到期」訊息給 TomcatB,而 TomcatB 也會使會話失效。
TomcatB
收到要求,建立新工作階段(S2
)與步驟 3) 中的場景相同
TomcatA
工作階段S2
因閒置而過期。攔截 invalidate 呼叫的方式與使用者使會話失效時相同,會話會與已失效的會話一起排隊。此時,已失效的會話不會被複製,直到另一個請求透過系統並檢查失效佇列為止。
呼! :)
成員資格 叢集成員資格是使用非常簡單的多播 ping 來建立的。每個 Tomcat 實例都會定期發出多播 ping,在 ping 訊息中,實例會廣播其 IP 和 TCP 偵聽埠以進行複製。如果實例在給定的時間範圍內未收到此類 ping,則該成員會被視為已中斷。非常簡單,也非常有效!當然,您需要在系統上啟用多播。
TCP 複製 一旦收到多播 ping,成員便會加入叢集。在下一次複製請求時,傳送實例將使用主機和埠資訊,並建立 TCP socket。使用此 socket,它會傳送序列化資料。我選擇 TCP socket 的原因是因為它內建流量控制和保證傳遞。因此,我知道當我傳送某些資料時,資料會傳遞到目的地 :)
使用框架進行分散式鎖定和頁面 Tomcat 不同步叢集中的會話實例。此類邏輯的實作將會造成過多負擔,並導致各種問題。如果您的用戶端使用多個請求同時存取相同會話,則最後一個請求將覆寫叢集中的其他會話。
使用 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 清單
名稱 | 說明 | MBean 物件名稱 - 引擎 | MBean 物件名稱 - 主機 |
---|---|---|---|
叢集 | 完整的叢集元素 | 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 |
成員 | 代表叢集中的節點 | type=Cluster, component=member, name=${NODE_NAME} | type=Cluster, host=${HOST}, component=member, name=${NODE_NAME} |
ReplicationValve | 此閥門控制對備份節點的複製 | type=Valve,name=ReplicationValve |
type=Valve,name=ReplicationValve,host=${HOST} |
JvmRouteBinderValve | 這是一個叢集備援閥門,用於將會話 ID 變更為目前的 Tomcat jvmroute。 | type=Valve,name=JvmRouteBinderValve, context=${APP.CONTEXT.PATH} |
type=Valve,name=JvmRouteBinderValve,host=${HOST}, context=${APP.CONTEXT.PATH} |
常見問題
請參閱 常見問題集的叢集區段。