Windows下搭建Tomcat集群的配置详解
《 Windows下搭建Tomcat集群基礎(chǔ)入門詳解?》
前言
在搭建 《 Apache + Tomcat 實(shí)現(xiàn)Web服務(wù)器集群 》 前我們還需要實(shí)現(xiàn) Tomcat集群實(shí)現(xiàn)Session復(fù)制 ,這樣用戶只需要登錄一次即可,就不用每次請(qǐng)求都需要登錄了,這兒使用的是兩個(gè) Tomcat 節(jié)點(diǎn)實(shí)現(xiàn)集群及節(jié)點(diǎn)間 Session 的復(fù)制。
首先我們需要找到 Tomcat 的配置文件 “ server.xml ?” ,在其中找到 <Engine> 節(jié)點(diǎn),在該節(jié)點(diǎn)下添加一個(gè) <Cluster className =“org.apache.catalina.ha.tcp.SimpleTcpCluster”/> 節(jié)點(diǎn),
關(guān)于 Tomcat 集群的默認(rèn)配置如下:
配置簡(jiǎn)述:
1、組播地址為 228.0.0.4 。
2、組播端口為 45564(端口和地址共同決定了集群成員 status)。
3、廣播的 IP 是 java.net.InetAddress.getLocalHost().getHostAddress()(請(qǐng)確保沒有廣播127.0.0.1,這是一個(gè)常見錯(cuò)誤,如果廣播為 127.0.0.1,集群會(huì)創(chuàng)建失敗喲!)。
4、該 TCP 端口監(jiān)聽復(fù)制消息是在第一個(gè)可用的 socket 服務(wù)器 4000-4100 范圍中。
5、兩個(gè)偵聽配置 ClusterSessionListener 和 JvmRouteSessionIDBinderListener ,在這兒我只使用了 ClusterSessionListener 即可。
6、兩個(gè)攔截器配置為 TcpFailureDetector 和 MessageDispatch15Interceptor。
注意事項(xiàng):
使用上述配置將使用 DeltaManager 復(fù)制 DeltaSession 來啟用 Tomcat 節(jié)點(diǎn)間全部會(huì)話的復(fù)制。也就是將會(huì)話復(fù)制到集群中的所有其他 Tomcat 節(jié)點(diǎn)。
關(guān)于這個(gè) Tomcat 集群配置只使用于較小的群集非常適用,但我們不建議將它用于較大的群集(多個(gè) Tomcat 節(jié)點(diǎn))。
另外,在使用 DeltaManager 時(shí),它將復(fù)制到所有節(jié)點(diǎn),只要在集群的 Tomcat 節(jié)點(diǎn)中配置了集群即使沒有部署應(yīng)用程序的節(jié)點(diǎn)也是復(fù)制/廣播到該節(jié)點(diǎn)。
為了解決這個(gè)問題,需要使用備份管理器。此管理器僅將會(huì)話數(shù)據(jù)復(fù)制到一個(gè)備份節(jié)點(diǎn),并且僅復(fù)制到已部署應(yīng)用程序的節(jié)點(diǎn)。使用備份管理器的缺點(diǎn):和 DeltaManager 的測(cè)試不一樣。?
實(shí)現(xiàn) Tomcat 集群需要滿足基本要求
1、所有的會(huì)話屬性都必須實(shí)現(xiàn) java.io.Serializable 接口。
2、取消 server.xml中 Cluster 元素注釋。
3、如果在集群中自定了 Valve,則請(qǐng)確保該在 server.xml 中定義了 ReplicationValve 元素。
4、如果一個(gè)集群中所有的 Tomcat 實(shí)例在同一臺(tái)服務(wù)器上運(yùn)行,??請(qǐng)確保 server.xml 中 TcpListenPort 屬性對(duì)于每個(gè)實(shí)例都是唯一的,但是在大多數(shù)情況下,Tomcat 可通過自動(dòng)檢測(cè) 4000-4100 范圍內(nèi)的可用端口來解決此問題。
5、必須確保在應(yīng)用程序 web.xml 配置文件中存在 <distributable/> 元素。
6、如果您使用的是 mod_jk 連接器,請(qǐng)確保在引擎中設(shè)置了 jvmRoute 屬性 ( <Engine name="Catalina" jvmRoute="node01" > ),并且 jvmRoute 屬性值與 workers.properties 中所配置 workers 的名稱相同。
7、確保所有節(jié)點(diǎn)具有相同的時(shí)間(如果時(shí)間不一致,這兒有個(gè)代名詞叫時(shí)間戳問題)并與NTP服務(wù)同步。
8、確保您的負(fù)載均衡器配置為具有粘性的會(huì)話模式。
在 Tomcat 中啟用會(huì)話復(fù)制,三種方法實(shí)現(xiàn)會(huì)話相同
1、使用會(huì)話持久性,并將會(huì)話保存到共享文件系統(tǒng)(PersistenceManager + FileStore)
2、使用會(huì)話持久性,并將會(huì)話保存到共享數(shù)據(jù)庫(PersistenceManager + JDBCStore)
3、使用內(nèi)存復(fù)制,使用 Tomcat 附帶的 SimpleTcpCluster(lib / catalina-tribes.jar + lib / catalina-ha.jar)
集群描述
Membership 是使用組播心跳建立的。因此,如果希望細(xì)分 Tomcat 群集,可以通過修改 <Membership> 元素中的多播IP地址或端口來實(shí)現(xiàn)。
心跳包含 Tomcat節(jié)點(diǎn)的IP地址和 Tomcat 監(jiān)聽復(fù)制流量的 TCP 端口。所有數(shù)據(jù)通信都通過 TCP 進(jìn)行的。
ReplicationValve 主要被用來找出當(dāng)請(qǐng)求已經(jīng)完成并開始復(fù)制的會(huì)話,如果有,則只有在會(huì)話發(fā)生改變時(shí)才會(huì)復(fù)制 session 數(shù)據(jù)(主要通過在會(huì)話上調(diào)用 setAttribute 或 removeAttribute 實(shí)現(xiàn))。
關(guān)于 Tomcat 中 session 數(shù)據(jù)復(fù)制分為同步復(fù)制和異步復(fù)制,這個(gè)會(huì)直接影響集群性能。
在同步復(fù)制模式下,請(qǐng)求不會(huì)返回,直到復(fù)制的會(huì)話通過線路發(fā)送并重新實(shí)例化所有其他群集節(jié)點(diǎn)。
同步與異步配置使用該 channelSendOptions 標(biāo)志并且是一個(gè)整數(shù)值。SimpleTcpCluster/DeltaManager 組合的默認(rèn)值是 “ 8 ”,這個(gè)是異步的。
為了更加方便,channelSendOptions 還可以通過別名來設(shè)置,然后在啟動(dòng)時(shí)將其轉(zhuǎn)換為整數(shù)值。
別名包括:“異步”(別名為“async”),“byte_message”(別名為“字節(jié)”),“多播”,“安全”,“synchronized_ack”(別名為“同步”),“udp” ”。
使用逗號(hào)分隔多個(gè)名稱,例如通過選項(xiàng)的“異步,多播” SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST。
將崩潰后的會(huì)話綁定到故障轉(zhuǎn)移節(jié)點(diǎn)
如果在集群中使用的是 mod_jk 而不是使用 “ 粘性會(huì)話 ”,或者由于某些原因,粘性會(huì)話不起作用,或者您只是簡(jiǎn)單地進(jìn)行故障轉(zhuǎn)移,則需要修改會(huì)話標(biāo)識(shí)即可,因?yàn)樗鞍弦粋€(gè) Tomcat 的 ?worker ?標(biāo)識(shí)(由 jvmRoute 在 <Engine/> 元素中定義)。
為了解決故障轉(zhuǎn)移的問題,需要使用 JvmRouteBinderValve。
使用 JvmRouteBinderValve 重會(huì)話 ID 以確保在故障切換后下一個(gè)請(qǐng)求將保持粘滯狀態(tài)(并且不會(huì)退回到隨機(jī)節(jié)點(diǎn),因?yàn)樵?worker 不再可用)。Valve 重寫同名的 cookie 中的 JSESSIONID 值。如果沒有這個(gè) Valve,在 mod_jk 模塊發(fā)生故障時(shí)將難以確保粘性。
注意:
需要注意的是如果要在 server.xml 中添加自己的 Valve,那么缺省的值不再有效,請(qǐng)確保添加默認(rèn)定義的所有適當(dāng)?shù)?Valve。
提示:
通過屬性 sessionIdAttribute,可以更改包含舊會(huì)話標(biāo)識(shí)的請(qǐng)求屬性名稱。
默認(rèn)屬性名稱是 org.apache.catalina.ha.session.JvmRouteOrignalSessionID。
技巧:
在將節(jié)點(diǎn)終止時(shí),您可以通過 JMX 啟用 mod_jk 轉(zhuǎn)換模式!在所有 JvmRouteBinderValve 備份上設(shè)置為 true,在 mod_jk 上禁用 worker,然后終止該節(jié)點(diǎn)并重新啟動(dòng)它!然后啟用 mod_jk Worker 并再次禁用 JvmRouteBinderValves。這個(gè)用例意味著只有被請(qǐng)求的會(huì)話被遷移。
配置實(shí)例
<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>
將其進(jìn)行分解:
主元素:
在這個(gè)元素中所有的集群細(xì)節(jié)都可以配置。其中 channelSendOptions 是連接到 SimpleTcpCluster 類或調(diào)用 SimpleTcpCluster 的任何對(duì)象所發(fā)送的每個(gè)消息的標(biāo)志。
在 java 文檔中可以查看到發(fā)送標(biāo)志的具體描述,DeltaManager 使用 SimpleTcpCluster 發(fā)送信息。而備份管理器則直接通過通道發(fā)送消息。
管理器配置模板:
<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 中,每個(gè) webapp 的標(biāo)記分布必須使用相同的管理器,因?yàn)樵?Tomcat 中可以為每個(gè) webapp 定義一個(gè)管理器類,
所以可以在一個(gè)集群中使用混合管理器。很顯然,一個(gè)節(jié)點(diǎn)上的應(yīng)用程序的管理器與另一個(gè)節(jié)點(diǎn)上的同一個(gè)應(yīng)用程序的的管理器相對(duì)應(yīng)。
如果沒有為 webapp 指定管理器,并且 webapp 被標(biāo)記為 <distributable /> Tomcat將采用此管理器配置并創(chuàng)建克隆此配置的管理器實(shí)例。?
通信:
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
在 Tomcat 中使用的組通信框架。該元素封裝了與通信和成員邏輯相關(guān)的所有內(nèi)容。
節(jié)點(diǎn)間的組播:
<Membership className="org.apache.catalina.tribes.membership.McastService"address="228.0.0.4"port="45564"frequency="500"dropTime="3000"/>
集群中節(jié)點(diǎn)通過多播的方式完成的。在節(jié)點(diǎn)中還支持靜態(tài)成員使用 StaticMembershipInterceptor,如果想延長(zhǎng)加入的節(jié)點(diǎn)超出多播,
那么必須地址屬性是使用的組播地址,端口是組播端口。這兩者一起創(chuàng)建集群分離。如果想要保證群集和生產(chǎn)群集的高性能,最簡(jiǎn)單的配置是使群集位于與生產(chǎn)群集不同的多播地址/端口組合之上。
成員組通過廣播其自身的 TCP地址/端口 到其他節(jié)點(diǎn),以便節(jié)點(diǎn)之間的通信可以通過TCP完成。
消息接收:
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto"port="5000"selectorTimeout="100"maxThreads="6"/>
在一個(gè)節(jié)點(diǎn)中,發(fā)送和接收數(shù)據(jù)的邏輯已被分解為兩個(gè)功能組件。
該 Receiver 顧名思義就是負(fù)責(zé)接消息的接收。由于節(jié)點(diǎn)的堆棧線程少(其他框架也采用了一種流行的改進(jìn)方法),此組件中只有一個(gè)線程池,它具有 maxThreads 和 minThreads 設(shè)置。
其中 address 屬性是由成員組件向其他節(jié)點(diǎn)廣播的主機(jī)地址。
消息發(fā)送:
該 Sender 顧名思義就是負(fù)責(zé)接消息的發(fā)送,Sender 有一個(gè)shell組件ReplicationTransmitter,但是在子組件 Transport 中完成工作的。一個(gè)節(jié)點(diǎn)中支持 Sender pool,以便消息的并行發(fā)送,使用 NioSender ,也可以實(shí)現(xiàn)消息的濱興發(fā)送。
同時(shí):同時(shí)向多個(gè) Sender 發(fā)送一條消息。
并行:并行向多個(gè) Sender 同時(shí)發(fā)送多條消息。
攔截器:
在節(jié)點(diǎn)中使用堆棧進(jìn)行消息的發(fā)送。在堆棧中的每個(gè)元素都稱為攔截器,其工作方式與 Tomcat servlet 容器中的 Valve 非常相似。
使用攔截器后,其業(yè)務(wù)邏輯可以分解為更易于管理的代碼片斷。常用的三種攔截器:
1、TcpFailureDetector - 通過 TCP 驗(yàn)證集群中的節(jié)點(diǎn)是否掛掉,如果組播中的數(shù)據(jù)包被丟棄,這個(gè)攔截器作用是防止被誤報(bào)(即使該節(jié)點(diǎn)仍然活著并且正在運(yùn)行,但是被誤標(biāo)記為崩潰的節(jié)點(diǎn))。
2、MessageDispatchInterceptor - 將消息分派給線程(thread pool)以便異步消息發(fā)送。
3、ThroughputInterceptor - 輸出簡(jiǎn)單消息流量統(tǒng)計(jì)信息。
注意:攔截器的順序很重要。在 server.xml 中是以堆棧表示的方式。把它們想象成一個(gè)鏈表的形式,頭部是第一個(gè)攔截器,尾部是最后一個(gè)。
集群請(qǐng)求跟蹤:
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
在集群中配置 Valve 來跟蹤對(duì) Web 應(yīng)用程序的請(qǐng)求,在上面已經(jīng)提到了 ReplicationValve 和 JvmRouteBinderValve。
<Cluster> 元素本身不是 Tomcat 中管道的一部分,而是集群將 Valve 添加到其父容器。如果在 <Engine> 元素中配置了 <Cluster> 元素,則需要將 Valve 添加到 Engine 下。?
支持遠(yuǎn)程部署:
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"tempDir="/tmp/war-temp/"deployDir="/tmp/war-deploy/"watchDir="/tmp/war-listen/"watchEnabled="false"/>
Tomcat集群默認(rèn)支持遠(yuǎn)程部署,即可以在其他集群節(jié)點(diǎn)上部署和取消部署應(yīng)用程序。
這個(gè)組件的狀態(tài)處于不斷變化之中,但很快就解決了。Tomcat 5.0 和 5.5 之間的部署方法發(fā)生了變化,此時(shí)該組件的邏輯已更改為部署目錄必須與 webapps 目錄匹配的位置。?
監(jiān)聽器:
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
由于 SimpleTcpCluster 本身是 Channel 對(duì)象的“ 發(fā)送者 ” 和 “ 接收者 ”,因此組件可以將自己注冊(cè)為 SimpleTcpCluster 的監(jiān)聽器。
上面的 ClusterSessionListener 監(jiān)聽器監(jiān)聽 DeltaManager 復(fù)制消息,并將 Delta 應(yīng)用于 Manager,然后將其應(yīng)用于 Session。
理解 Tomcat 集群如何運(yùn)行的
為了便于理解群集如何工作的,這兒使用兩個(gè) Tomcat 實(shí)例 ,即 TomcatA 和 TomcatB 。操作內(nèi)容如下:
1、TomcatA 啟動(dòng)
2、TomcatB 啟動(dòng)(等待 TomcatA 啟動(dòng)完成)
3、TomcatA 收到一個(gè)請(qǐng)求,會(huì)話 S1 被創(chuàng)建
4、TomcatA 崩潰
5、TomcatB 收到會(huì)話請(qǐng)求 S1
6、TomcatA 啟動(dòng)
7、TomcatA 接收到一個(gè)請(qǐng)求,在會(huì)話(S1)上調(diào)用 invalidate
8、TomcatB 接收請(qǐng)求,進(jìn)行新會(huì)話(S2)
9、TomcatA 會(huì)話 S2 由于不活動(dòng)而過期(這兒就需要重新登錄了)
有了一個(gè)大致的提綱后,下面我們進(jìn)行詳細(xì)的介紹:
1、TomcatA 啟動(dòng)
Tomcat 使用標(biāo)準(zhǔn)啟動(dòng)序列啟動(dòng)。當(dāng)創(chuàng)建 Host 對(duì)象時(shí),將與它關(guān)聯(lián)一個(gè)集群對(duì)象。在解析上下文時(shí),如果 web.xml 中定義了 distributable 元素,Tomcat 會(huì)詢問 Cluster 類(在本例中 SimpleTcpCluster )為復(fù)制的 <Context/> 中創(chuàng)建 Manager。
因此,啟用集群后,可以在 web.xml 中設(shè)置可分發(fā)的數(shù)據(jù)集, Tomcat 將為該 <Context/> 創(chuàng)建一個(gè)DeltaManager,而不是一個(gè) StandardManager。群集還將啟動(dòng) Membership ?服務(wù)(多播)和 Replication 服務(wù)(tcp單播)。
2、TomcatB 啟動(dòng)
當(dāng) TomcatB 啟動(dòng)時(shí),它遵循與TomcatA相同的序列。該集群已啟動(dòng)并將建立 membership(TomcatA,TomcatB)。
TomcatB 現(xiàn)在將從群集中已存在的服務(wù)器(在本例中 為TomcatA )請(qǐng)求會(huì)話狀態(tài)。TomcatA 響應(yīng)請(qǐng)求,并且在 TomcatB 開始監(jiān)聽 HTTP 請(qǐng)求之前,status 已從 TomcatA 轉(zhuǎn)移到 TomcatB。
如果 TomcatA 沒有響應(yīng),TomcatB 將在60秒后超時(shí),并發(fā)出日志通知。每個(gè) web 應(yīng)用程序的會(huì)話狀態(tài)都被轉(zhuǎn)移到它的 web.xml 中。
注意:為了使會(huì)話有效的復(fù)制,所有的 Tomcat實(shí)例都應(yīng)該配置相同。
3、TomcatA 收到一個(gè)請(qǐng)求,會(huì)話 S1 被創(chuàng)建
對(duì) TomcatA 的請(qǐng)求與沒有會(huì)話復(fù)制的處理方式完全相同。當(dāng)請(qǐng)求完成時(shí),ReplicationValve 會(huì)在將響應(yīng)返回給用戶之前攔截請(qǐng)求。
此時(shí) TomcatA 發(fā)現(xiàn)會(huì)話已被修改,并且它使用 TCP 將會(huì)話復(fù)制到 TomcatB。一旦序列化的數(shù)據(jù)被傳遞到 TCP 邏輯,請(qǐng)求就會(huì)通過 Valve 管道返回給用戶。
對(duì)于每個(gè)請(qǐng)求,整個(gè)會(huì)話都被復(fù)制,這允許在會(huì)話中修改屬性的代碼,而不需要復(fù)制 setAttribute 或 removeAttribute。可以使用 useDirtyFlag 配置參數(shù)來優(yōu)化會(huì)話復(fù)制的次數(shù)。
4、TomcatA 崩潰
當(dāng)TomcatA崩潰時(shí),TomcatB 收到一個(gè)通知,TomcatA 已經(jīng)退出集群。TomcatB 從其成員列表中刪除 TomcatA,TomcatA 將不再收到 TomcatB 發(fā)生的任何更改通知。
負(fù)載均衡器會(huì)將來自 TomcatA 的請(qǐng)求重定向到 TomcatB,并且所有會(huì)話都是最新的。
5、TomcatB 收到會(huì)話請(qǐng)求 S1
TomcatB 將處理請(qǐng)求作為任何其他請(qǐng)求。
6、TomcatA 啟動(dòng)
在 TomcatA 啟動(dòng)之后,在 TomcatA 開始接受新請(qǐng)求并使其可用之前,將遵循上述1)2)所述的啟動(dòng)順序。
TomcatA 將加入集群,并與 TomcatB 聯(lián)系以獲取當(dāng)前所有會(huì)話的狀態(tài)。一旦它收到會(huì)話狀態(tài),它就完成加載并打開它的HTTP / mod_jk端口。
因此,在 TomcatB 接收到會(huì)話狀態(tài)之前,沒有任何請(qǐng)求會(huì)到達(dá) TomcatA。
7、TomcatA 接收到一個(gè)請(qǐng)求,在會(huì)話(S1)上調(diào)用 invalidate
無效的調(diào)用被攔截,并且會(huì)話在無效會(huì)話中排隊(duì)。當(dāng)請(qǐng)求完成時(shí),不再發(fā)送已更改的會(huì)話,而是向 TomcatB 發(fā)送一條 “ 過期 ” 的消息,并且 TomcatB 也會(huì)使該會(huì)話失效。
8、TomcatB 接收請(qǐng)求,進(jìn)行新會(huì)話(S2)
與步驟3中相同的場(chǎng)景)
9、TomcatA會(huì)話S2由于不活動(dòng)而過期
無效的調(diào)用被攔截,就像用戶會(huì)話無效時(shí)一樣,會(huì)話被無效會(huì)話排隊(duì)。此時(shí),無效會(huì)話將不會(huì)被復(fù)制,直到另一個(gè)請(qǐng)求通過系統(tǒng)并檢查無效隊(duì)列為止。
Membership : 群集 Membership 使用非常簡(jiǎn)單的組播 ping 建立。每個(gè) Tomcat 實(shí)例將定期發(fā)送一個(gè)多播 ping,在 ping 消息中,實(shí)例將廣泛地將其 IP 和 TCP 監(jiān)聽端口進(jìn)行復(fù)制。
如果在集群中一個(gè)實(shí)例在給定的時(shí)間范圍內(nèi)沒有收到這樣的 ping,則該成員被認(rèn)為是死的。非常簡(jiǎn)單,而且非常有效!當(dāng)然,只需要在系統(tǒng)上啟用多播。
TCP Replication : 一旦接收到組播 ping,member 就會(huì)被添加到集群。
在下一個(gè)請(qǐng)求時(shí)復(fù)制,發(fā)送實(shí)例將使用 Host 和 Port 信息并建立一個(gè)TCP Socket。使用這個(gè) Socket,它將發(fā)送序列化后的數(shù)據(jù)。
分布式鎖定和使用框架頁面 : Tomcat 不會(huì)保持會(huì)話實(shí)例在群集中同步。這種邏輯的實(shí)現(xiàn)會(huì)花費(fèi)很多開銷并導(dǎo)致各種問題。
如果在客戶端使用多個(gè)請(qǐng)求同時(shí)訪問同一會(huì)話,則最后一個(gè)請(qǐng)求將覆蓋集群中的其他會(huì)話。
Apache Tomcat 官網(wǎng): https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html
總結(jié)
以上是生活随笔為你收集整理的Windows下搭建Tomcat集群的配置详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32f407igh6学习笔记
- 下一篇: java设计一个排队叫号系统_一个简易的