<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    szhswl
    宋針還的個(gè)人空間

    Tomcat 5服務(wù)器為集群和SESSION復(fù)制提供了集成的支持。本系列的第一篇文章將為大家提供SESSION持久性以及TOMCAT集群中SESSION復(fù)制的內(nèi)在工作機(jī)制一個(gè)概要認(rèn)識(shí)。我將會(huì)討論SESSION復(fù)制在TOMCAT5中是怎樣進(jìn)行的以及跨越多集群節(jié)點(diǎn)的SESSION持久性的復(fù)制機(jī)制。在第2部分,我會(huì)詳細(xì)討論一個(gè)帶有SESSION復(fù)制功能的TOMCAT集群的安裝例子,并且比較不同的復(fù)制情形。
      
      集群
      
      傳統(tǒng)獨(dú)立服務(wù)器(非集群的)不提供任何失效無(wú)縫轉(zhuǎn)移以及負(fù)載平衡能力。當(dāng)服務(wù)器失敗的時(shí)候,就無(wú)法獲取整個(gè)網(wǎng)站的內(nèi)容,除非服務(wù)器被重新喚起。由于服務(wù)器失效,任何存儲(chǔ)在服務(wù)器內(nèi)存中的SESSION都會(huì)丟失,用戶必須重新登陸并且輸入所有由于服務(wù)器失效丟失的數(shù)據(jù)。
      
    不同的是,作為集群一部分的服務(wù)器則提供了可測(cè)性以及失效無(wú)縫轉(zhuǎn)移能力。一個(gè)集群就是一組同步運(yùn)行并且協(xié)同工作,能提供高可靠性,高穩(wěn)定性以及高可測(cè)性的多服務(wù)器例程。服務(wù)端集群對(duì)客戶端表現(xiàn)出來(lái)似乎就是一個(gè)單獨(dú)的服務(wù)器例程。從客戶端的視角來(lái)看,集群的客戶端和單獨(dú)的服務(wù)器沒(méi)多大不同,但是他們通過(guò)提供實(shí)效無(wú)縫轉(zhuǎn)移和SESSION復(fù)制做到了不間斷服務(wù)以及SESSION數(shù)據(jù)持久性。
      
      集群中的服務(wù)器通訊
      
      集群中的應(yīng)用程序服務(wù)器通過(guò)諸如IP多點(diǎn)傳送(IP multicast)和IP sockets這樣的技術(shù)和其他服務(wù)器共享信息
      
      ●IP多點(diǎn)傳送:主要用于1對(duì)多的服務(wù)器通訊,通過(guò)廣播服務(wù)和 heartbeats消息的可用來(lái)顯示服務(wù)器的有效
      
      ●IP sockets:主要用于在集群的服務(wù)器例程中進(jìn)行P2P服務(wù)器通訊
      
      使用IP多點(diǎn)傳送進(jìn)行一對(duì)多通訊
      
    TOMCAT服務(wù)器使用IP多點(diǎn)傳送在集群中的服務(wù)器例程間進(jìn)行一對(duì)多的通訊,IP多點(diǎn)傳送是一種能夠讓多服務(wù)器向指定IP地址和端口號(hào)進(jìn)行訂閱并且監(jiān)聽(tīng)消息的廣播技術(shù)(多點(diǎn)傳送IP地址范圍從224.0.0.0 到239.255.255.255)。在集群中的每個(gè)服務(wù)器都使用多點(diǎn)傳送廣播特定的 heartbeat消息,通過(guò)監(jiān)視這些 heartbeat消息,在集群中的服務(wù)器例程判斷什么時(shí)候服務(wù)器例程失效。在服務(wù)器通訊中使用IP多點(diǎn)傳送的一個(gè)缺點(diǎn)是他不能保證這些消息被確實(shí)接收到了。例如,一個(gè)應(yīng)用持續(xù)的本地多點(diǎn)傳送緩存滿了,就不能寫(xiě)入新的多點(diǎn)傳送消息,等消息過(guò)了之后該應(yīng)用程序就沒(méi)有被通知到。
      
      使用IP Sockets進(jìn)行服務(wù)器通訊
      
    IP sockets 同樣也通過(guò)了一套在集群中的服務(wù)器間進(jìn)行發(fā)送消息和數(shù)據(jù)的機(jī)制。服務(wù)器例程使用IP sockets 在集群節(jié)點(diǎn)間進(jìn)行HTTP SESSION狀態(tài)的復(fù)制。正確的SOKET配制對(duì)于集群的性能是至關(guān)重要的,基于SOCKET的通訊的效率取決于SOCKET的實(shí)現(xiàn)類(lèi)別(例如:系統(tǒng)使用本地的或者純JAVA SOCKET讀取器實(shí)現(xiàn)),如果服務(wù)器使用純JAVA SOCKET讀取器則要看服務(wù)器例程是否注冊(cè)使用了足夠的SOCKET讀取器線程。
      
      如果想要有最佳的SOCKET性能,系統(tǒng)應(yīng)該注冊(cè)使用本地的SOCEKT而不是純JAVA實(shí)現(xiàn)。這是因?yàn)橄鄬?duì)于基于JAVA的SOCKET實(shí)現(xiàn),本地SOCKET消耗更少的系統(tǒng)資源。雖然 SOCKET讀取器的JAVA實(shí)現(xiàn)是P2P通信中一種可靠而且可移動(dòng)的方法,可是他不能為集群中的重型SOCKET使用提供最好的性能。當(dāng)判斷從 SOCKET是否有數(shù)據(jù)讀取的時(shí)候本地SOCKET讀取器使用了更有效率的方法。使用本地SOCKET讀取器實(shí)現(xiàn),讀取器線程不需要去統(tǒng)計(jì)靜止的 SOCKET:他們僅僅為活動(dòng)的SOCKET服務(wù),并且在一個(gè)給定的SOCKET開(kāi)始活躍起來(lái)時(shí)他們可以立刻捕捉到。而使用純JAVA SOCKET讀取器,線程必須動(dòng)態(tài)的統(tǒng)計(jì)所有打開(kāi)的SOCKET,判斷他們是否包含可讀取的數(shù)據(jù)。換句話說(shuō),SOCKET讀取器總是忙于統(tǒng)計(jì) SOCKET,即使這些SOCKET沒(méi)有數(shù)據(jù)可讀。這些本不應(yīng)該的系統(tǒng)開(kāi)銷(xiāo)降低了性能。
      
      TOMCAT 5中的集群
      
    雖然在TOMCAT5的早些版本中也有集群的功能,但是在稍后的版本中(5。0。19或者更高),集群變的更加模塊組件化。在 server.xml 中集群元素已經(jīng)被重構(gòu),這樣我們可以替換集群的不同部分而不會(huì)影響其他元素。例如,當(dāng)前配置中把成員服務(wù)設(shè)置為多點(diǎn)傳送發(fā)現(xiàn)。這里可以輕易地把成員服務(wù)修改替換為使用TCP或者 Unicast ,而不會(huì)改變集類(lèi)邏輯的其他部分。
      
      其他一些集群元素,例如SESSION管理器,復(fù)制發(fā)送端,復(fù)制接受端也可以被自定義的實(shí)現(xiàn)取代而不影響集群配置的其他部分。同樣,在TOMCAT集群中的任何服務(wù)器組件可以使用集類(lèi)API向集群中的所有成員發(fā)送消息。
      
      SESSION復(fù)制
      
    服務(wù)器集群通常操縱兩種SESSION: sticky sessions和 replicated sessions 。sticky sessions就是存在單機(jī)服務(wù)器中的接受網(wǎng)絡(luò)請(qǐng)求的SESSION,其他集群成員對(duì)該服務(wù)器的SESSION狀態(tài)完全不清楚,如果存有SESSION 的服務(wù)器失敗的話,用戶必須再次登陸網(wǎng)站,重新輸入所有存儲(chǔ)在SESSION中的數(shù)據(jù)。
      
      另一種SESSION類(lèi)型是,在一臺(tái)服務(wù)器中SESSION狀態(tài)被復(fù)制到集群中的其他所有服務(wù)器上,無(wú)論何時(shí),只要SESSION 被改變,SESSION數(shù)據(jù)都要重新被復(fù)制。這就是 replicated session 。 sticky 和 replicated sessions都有他們的優(yōu)缺點(diǎn), Sticky sessions簡(jiǎn)單而又容易操作,因?yàn)槲覀儾槐貜?fù)制任何SESSION數(shù)據(jù)到其他服務(wù)器上。這樣就會(huì)減少系統(tǒng)消耗,提高性能。但是如果服務(wù)器失敗,所有存儲(chǔ)在該服務(wù)器內(nèi)存中的SESSION數(shù)據(jù)也同樣會(huì)消失。如果SESSION數(shù)據(jù)沒(méi)有被復(fù)制到其他服務(wù)器,這些SESSION就完全丟失了。當(dāng)我們?cè)谶M(jìn)行一個(gè)查詢事務(wù)當(dāng)中的時(shí)候,丟失所有已經(jīng)輸入的數(shù)據(jù),就會(huì)導(dǎo)致很多問(wèn)題。
      
      為了支持 JSP HTTP session 狀態(tài)的自動(dòng)失效無(wú)縫轉(zhuǎn)移,TOMCAT服務(wù)器復(fù)制了在內(nèi)存中的SESSION狀態(tài)。這是通過(guò)復(fù)制存儲(chǔ)在一臺(tái)服務(wù)器上的SESSION數(shù)據(jù)到集群中其他成員上防止數(shù)據(jù)丟失以及允許失效無(wú)縫轉(zhuǎn)移。
      
      對(duì)象的狀態(tài)管理
      
      通過(guò)在服務(wù)器上的保存狀態(tài)可以區(qū)分出4種對(duì)象:
      
    ●無(wú)狀態(tài):一個(gè)無(wú)狀態(tài)對(duì)象在調(diào)用的時(shí)候不會(huì)在內(nèi)存中保存任何狀態(tài),因?yàn)榭蛻舳撕头?wù)器端沒(méi)必要保存任何有關(guān)對(duì)方的信息。在這種情況下,客戶端會(huì)在每次請(qǐng)求服務(wù)器時(shí)都會(huì)發(fā)送數(shù)據(jù)給服務(wù)器。SESSION狀態(tài)被在客戶端和服務(wù)器端來(lái)回發(fā)送。這種方法不總是可行和理想的,特別是當(dāng)傳輸?shù)臄?shù)據(jù)比較大或者一些安全信息我們不想保存在客戶端的時(shí)候;
      
      ●會(huì)話:一個(gè)會(huì)話對(duì)象在一個(gè)SESSION中只被用于特定的某個(gè)客戶端。在SESSION中,他可以為所有來(lái)自該客戶端的請(qǐng)求服務(wù),并且僅僅是這個(gè)客戶端的請(qǐng)求。貫穿一個(gè)SESSION,兩個(gè)請(qǐng)求間的狀態(tài)信息必須保存。會(huì)話服務(wù)通常在內(nèi)存中保存短暫的狀態(tài),當(dāng)在服務(wù)器失敗的時(shí)候可能會(huì)丟失。SESSION狀態(tài)通常被保存在請(qǐng)求間的服務(wù)器的內(nèi)存中。為了清空內(nèi)存,SESSION狀態(tài)也可以被從內(nèi)存中釋放(就像在一個(gè)對(duì)象CACHE)。在該對(duì)象中,性能和可量測(cè)性都有待提高,因?yàn)楦虏⒉皇潜粏为?dú)的寫(xiě)到磁盤(pán)上,并且服務(wù)器失敗的時(shí)候數(shù)據(jù)也沒(méi)辦法搶救。
      
      ●緩存:緩存對(duì)象在內(nèi)存中保存狀態(tài),并且使用這個(gè)去處理從多客戶端來(lái)的請(qǐng)求。緩存服務(wù)的實(shí)現(xiàn)可以擴(kuò)展到他們把緩存的是數(shù)據(jù)備份保存在后端存儲(chǔ)器中(通常是一個(gè)關(guān)系數(shù)據(jù)庫(kù))。
      
    ●獨(dú)立的:一個(gè)獨(dú)立的對(duì)象在一個(gè)時(shí)間內(nèi)只活躍在集群中的一臺(tái)服務(wù)器上,處理來(lái)自多客戶端的請(qǐng)求。他通常由那些私有的,持久的,在內(nèi)存中緩寸的數(shù)據(jù)支持。他同樣也在內(nèi)存中保持短暫狀態(tài),在服務(wù)器失敗的時(shí)候要重建或者丟失。當(dāng)失敗的時(shí)候,獨(dú)立對(duì)象必須在同一個(gè)服務(wù)器上重起或者移植到另一臺(tái)服務(wù)器上。
      
      (來(lái)源: "Using WebLogic Server Clusters")
      
      SESSION復(fù)制的設(shè)計(jì)考慮事項(xiàng)
      
      網(wǎng)絡(luò)考慮事項(xiàng)
      
    把集群的多點(diǎn)傳送地址和其他應(yīng)用程序隔離是至關(guān)重要的。我們不希望集群配置或者網(wǎng)絡(luò)布局干擾到多點(diǎn)傳送服務(wù)器通信。和其他應(yīng)用程序共享集群多點(diǎn)傳送地址將迫使集群的服務(wù)器例程處理不應(yīng)該的消息,消耗系統(tǒng)內(nèi)存。共享多點(diǎn)傳送地址可能也會(huì)使IP多點(diǎn)傳送緩沖過(guò)載,延遲服務(wù)器 heartbeat 消息傳輸。這樣的延遲可能導(dǎo)致一個(gè)服務(wù)器例程被標(biāo)識(shí)為死亡,僅僅因?yàn)樗?heartbeat 消息沒(méi)有被及時(shí)接收。
      
      編程考慮事項(xiàng)
      
      除了上面提到的網(wǎng)絡(luò)相關(guān)因素,還有些和我們寫(xiě) J2EE 網(wǎng)絡(luò)應(yīng)用程序有關(guān)的設(shè)計(jì)考慮也會(huì)影響SESSION復(fù)制。以下列出了一些編程方面的考慮:
      
      ●SESSION數(shù)據(jù)必須被序列化:為了支持HTTP session 狀態(tài)的內(nèi)存內(nèi)復(fù)制,所有的 servlet 和 JSP session 數(shù)據(jù)必須被序列化,對(duì)象中的每個(gè)域都必須被序列化,這樣對(duì)象被可靠的序列化。
      
    ●把應(yīng)用程序設(shè)計(jì)為冪等的:冪等的的意思就是一個(gè)操做不會(huì)修改狀態(tài)信息,并且每次操作的時(shí)候都返回同樣的結(jié)果(換句話說(shuō)就是:做多次和做一次的效果是一樣的),通常,WEB請(qǐng)求,特別是 HTML forms 都被發(fā)送多次(當(dāng)用戶點(diǎn)擊發(fā)送按紐兩次,重載頁(yè)面多次),導(dǎo)致多次HTTP請(qǐng)求。設(shè)計(jì)SERVLET和其他WEB對(duì)象為冪等的,可以容忍多次請(qǐng)求。詳細(xì)可以去參考設(shè)計(jì)模式“Synchronized Token ”和“Idempotent Receiver ”關(guān)于怎樣設(shè)計(jì)冪等的的應(yīng)用程序。
      
      ●在BUSINESS層存儲(chǔ)狀態(tài):會(huì)話狀態(tài)應(yīng)該使用有狀態(tài)的SESSION BEANS存儲(chǔ)在EJB層,而不是存儲(chǔ)在WEB層的HttpSession。因?yàn)槠髽I(yè)應(yīng)用程序要支持各種類(lèi)型客戶端(WEB客戶端,JAVA應(yīng)用程序,其他EJB),存儲(chǔ)數(shù)據(jù)在WEB層會(huì)導(dǎo)致在客戶端的雙數(shù)據(jù)存儲(chǔ)。因此,有狀態(tài)的SESSION BEAN在這些情況下就被用于存儲(chǔ)SESSION狀態(tài)。無(wú)狀態(tài)的SESSION BEAN要為每次的調(diào)用重構(gòu)造會(huì)話狀態(tài)。這些狀態(tài)可能必須從數(shù)據(jù)庫(kù)中恢復(fù)的數(shù)據(jù)中重編譯。這些缺點(diǎn)失去了使用無(wú)狀態(tài)SESSION BEAN去提高性能和可測(cè)量性的目的,嚴(yán)重的減低了性能。
      
      ●序列化系統(tǒng)消耗:序列化SESSION數(shù)據(jù)在復(fù)制SESSION狀態(tài)的時(shí)候回會(huì)些系統(tǒng)消耗。隨著序列化對(duì)象大小的增長(zhǎng)消耗也越多。最好是保持SE

    實(shí)踐中整理出tomcat集群和負(fù)載均衡
    (一)環(huán)境說(shuō)明
    (1)服務(wù)器有4臺(tái),一臺(tái)安裝apache,三臺(tái)安裝tomcat
    (2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2
    (3)ip配置,一臺(tái)安裝apache的ip為192.168.0.88,三臺(tái)安裝tomcat的服務(wù)器ip分別為192.168.0.1/2/4
    (二)安裝過(guò)程
    (1)在三臺(tái)要安裝tomcat的服務(wù)器上先安裝jdk
    (2)配置jdk的安裝路徑,在環(huán)境變量path中加入jdk的bin路徑,新建環(huán)境變量JAVA_HOME指向jdk的安裝路徑
    (3)在三臺(tái)要安裝tomcat的服務(wù)器上分別安裝tomcat,調(diào)試三個(gè)tomcat到能夠正常啟動(dòng)
    (4)tomcat的默認(rèn)WEB服務(wù)端口是8080,默認(rèn)的模式是單獨(dú)服務(wù),我的三個(gè)tomcat的WEB服務(wù)端口修改為7080/8888/9999
    修改位置為tomcat的安裝目錄下的conf/server.xml
    修改前的配置為
    <Connector port="8080" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" />
    修改后的配置為
    <Connector port="7080" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" />
    依次修改每個(gè)tomcat的監(jiān)聽(tīng)端口(7080/8888/9999)

    (5)分別測(cè)試每個(gè)tomcat的啟動(dòng)是否正常
    http://192.168.0.1:7080
    http://192.168.0.2:8888
    http://192.168.0.4:9999
    (三)負(fù)載均衡配置過(guò)程
    (1)在那臺(tái)要安裝apache的服務(wù)器上安裝apache2.0.55,我的安裝路徑為默認(rèn)C:\Program Files\Apache Group\Apache2
    (2)安裝后測(cè)試apache能否正常啟動(dòng),調(diào)試到能夠正常啟動(dòng)http://192.168.0.88
    (3)下載jk2.0.4后解壓縮文件
    (4)將解壓縮后的目錄中的modules目錄中的mod_jk2.so文件復(fù)制到apache的安裝目錄下的modules目錄中,我的為C:\Program Files\Apache Group\Apache2\modules
    (5)修改apache的安裝目錄中的conf目錄的配置文件httpd.conf,在文件中加LoadModule模塊配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so
    (6)分別修改三個(gè)tomcat的配置文件conf/server.xml,修改內(nèi)容如下
    修改前
    <!-- An Engine represents the entry point (within Catalina) that processes
    every request. The Engine implementation for Tomcat stand alone
    analyzes the HTTP headers included with the request, and passes them
    on to the appropriate Host (virtual host). -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
    -->

    <!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina" defaultHost="localhost">
    修改后
    <!-- An Engine represents the entry point (within Catalina) that processes
    every request. The Engine implementation for Tomcat stand alone
    analyzes the HTTP headers included with the request, and passes them
    on to the appropriate Host (virtual host). -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :-->
    <Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">


    <!-- Define the top level container in our container hierarchy
    <Engine name="Catalina" defaultHost="localhost">
    -->
    將其中的jvmRoute="jvm1"分別修改為jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"

    (7)然后重啟三個(gè)tomcat,調(diào)試能夠正常啟動(dòng)。
    (8)在apache的安裝目錄中的conf目錄下創(chuàng)建文件workers2.propertie,寫(xiě)入文件內(nèi)容如下

    # fine the communication channel
    [channel.socket:192.168.0.1:8009]
    info=Ajp13 forwarding over socket
    #配置第一個(gè)服務(wù)器
    tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名稱(chēng)一致
    debug=0
    lb_factor=1 #負(fù)載平衡因子,數(shù)字越大請(qǐng)求被分配的幾率越高

    # Define the communication channel
    [channel.socket:192.168.0.2:8009]
    info=Ajp13 forwarding over socket
    tomcatId=tomcat2
    debug=0
    lb_factor=1

    # Define the communication channel
    [channel.socket:192.168.0.4:8009]
    info=Ajp13 forwarding over socket
    tomcatId=tomcat3
    debug=0
    lb_factor=1

    [status:]
    info=Status worker, displays runtime information.

    [uri:/jkstatus.jsp]
    info=Display status information and checks the config file for changes.
    group=status:

    [uri:/*]
    info=Map the whole webapp
    debug=0
    (9)在三個(gè)tomcat的安裝目錄中的webapps建立相同的應(yīng)用,我和應(yīng)用目錄名為T(mén)omcatDemo,在三個(gè)應(yīng)用目錄中建立相同 WEB-INF目錄和頁(yè)面index.jsp,index.jsp的頁(yè)面內(nèi)容如下
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.util.*" %>
    <html><head><title>Cluster App Test</title></head>
    <body>
    Server Info:
    <%
    out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
    <%
    out.println("<br> ID " + session.getId()+"<br>");

    // 如果有新的 Session 屬性設(shè)置
    String dataName = request.getParameter("dataName");
    if (dataName != null && dataName.length() > 0) {
    String dataValue = request.getParameter("dataValue");
    session.setAttribute(dataName, dataValue);
    }

    out.print("<b>Session 列表</b>");

    Enumeration e = session.getAttributeNames();
    while (e.hasMoreElements()) {
    String name = (String)e.nextElement();
    String value = session.getAttribute(name).toString();
    out.println( name + " = " + value+"<br>");
    System.out.println( name + " = " + value);
    }
    %>
    <form action="index.jsp" method="POST">
    名稱(chēng):<input type=text size=20 name="dataName">
    <br>
    值:<input type=text size=20 name="dataValue">
    <br>
    <input type=submit>
    </form>
    </body>
    </html>
    (10)重啟apache服務(wù)器和三個(gè)tomcat服務(wù)器,到此負(fù)載 均衡已配置完成。測(cè)試負(fù)載均衡先測(cè)試apache,訪問(wèn)http://192.168.0.88/jkstatus.jsp
    能否正常訪問(wèn),并查詢其中的內(nèi)容,有三個(gè)tomcat的相關(guān)配置信息和負(fù)載說(shuō)明,訪問(wèn)http://192.168.0.88/TomcatDemo/index.jsp看能夠運(yùn)行,
    能運(yùn)行,則已建立負(fù)載均衡。
    (四)tomcat集群配置
    (1)負(fù)載均衡配置的條件下配置tomcat集群
    (2)分別修改三個(gè)tomcat的配置文件conf/server.xml,修改內(nèi)容如下
    修改前
    <!--
    <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
    managerClassName="org.apache.catalina.cluster.session.DeltaManager"
    expireSessionsOnShutdown="false"
    useDirtyFlag="true"
    notifyListenersOnReplication="true">

    <Membership
    className="org.apache.catalina.cluster.mcast.McastService"
    mcastAddr="228.0.0.4"
    mcastPort="45564"
    mcastFrequency="500"
    mcastDropTime="3000"/>

    <Receiver
    className="org.apache.catalina.cluster.tcp.ReplicationListener"
    tcpListenAddress="auto"
    tcpListenPort="4001"
    tcpSelectorTimeout="100"
    tcpThreadCount="6"/>

    <Sender
    className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
    replicationMode="pooled"
    ackTimeout="5000"/>

    <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
    filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

    <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
    tempDir="/tmp/war-temp/"
    deployDir="/tmp/war-deploy/"
    watchDir="/tmp/war-listen/"
    watchEnabled="false"/>

    <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
    </Cluster>
    -->
    修改后
    <!-- modify by whh -->
    <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
    managerClassName="org.apache.catalina.cluster.session.DeltaManager"
    expireSessionsOnShutdown="false"
    useDirtyFlag="true"
    notifyListenersOnReplication="true">

    <Membership
    className="org.apache.catalina.cluster.mcast.McastService"
    mcastAddr="228.0.0.4"
    mcastPort="45564"
    mcastFrequency="500"
    mcastDropTime="3000"/>

    <Receiver
    className="org.apache.catalina.cluster.tcp.ReplicationListener"
    tcpListenAddress="auto"
    tcpListenPort="4001"
    tcpSelectorTimeout="100"
    tcpThreadCount="6"/>

    <Sender
    className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
    replicationMode="pooled"
    ackTimeout="5000"/>

    <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
    filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

    <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
    tempDir="/tmp/war-temp/"
    deployDir="/tmp/war-deploy/"
    watchDir="/tmp/war-listen/"
    watchEnabled="false"/>

    <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
    </Cluster>
    <!-- modify by whh -->
    將集群配置選項(xiàng)的注釋放開(kāi)即可,如上。
    (3)重啟三個(gè)tomcat。到此tomcat的集群已配置完成。

     

    (五)應(yīng)用配置
    對(duì)于要進(jìn)行負(fù)載和集群的的tomcat目錄下的webapps中的應(yīng)用中的WEB-INF中的web.xml文件要添加如下一句配置
    <distributable/>
    配置前
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <display-name>TomcatDemo</display-name>
    </web-app>
    配置后
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <display-name>TomcatDemo</display-name>
    <distributable/>
    </web-app>

    問(wèn):tomcat集群是怎么處理session的阿

    答:在tomcat做集群之后,每個(gè)tomcat之間自動(dòng)根據(jù)tomcat的配置文件中的參數(shù)進(jìn)行session復(fù)制,
    對(duì)于一個(gè)客戶端對(duì)說(shuō),只要是同一個(gè)IP,那它每次上傳的sessionID就是一樣的,



    本文嚴(yán)重抄襲:http://zym-nanako.javaeye.com/blog/147551

    ---------------------------------------------------------------------------------------------------------------------------------
    說(shuō)人之短,乃護(hù)己之短。夸己之長(zhǎng),乃忌人之長(zhǎng)。皆由存心不厚,識(shí)量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
    http://www.tkk7.com/szhswl
    ------------------------------------------------------------------------------------------------------ ----------------- ---------
    posted on 2007-12-11 20:48 宋針還 閱讀(388) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 服務(wù)器

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲乱码无限2021芒果| 亚洲欧好州第一的日产suv| 国产男女爽爽爽爽爽免费视频| 亚洲欧洲日产国码二区首页| 免费观看黄网站在线播放| 猫咪免费人成在线网站 | 亚洲AV中文无码字幕色三| h在线观看视频免费网站| 亚洲成在人线在线播放无码| 亚洲精品自产拍在线观看| 美女视频黄的全免费视频| 男女啪啪免费体验区| 亚洲视频在线一区二区三区| 免费一级毛片女人图片| 精品无码国产污污污免费网站 | 久久久久久亚洲精品成人| 国产无遮挡裸体免费视频| 久久成人a毛片免费观看网站| 亚洲精品色播一区二区 | 亚洲国产成a人v在线| 久久青青草原亚洲av无码| 国内免费高清在线观看| 成人久久免费网站| 色偷偷亚洲第一综合| 91亚洲自偷手机在线观看| 亚洲日本在线观看视频| 无码国产精品久久一区免费| 日韩精品无码免费专区午夜不卡| 亚洲欧美日韩中文二区| 337p日本欧洲亚洲大胆艺术| 亚洲国产精品国产自在在线 | 日韩一级免费视频| 亚洲免费视频网址| 少妇性饥渴无码A区免费 | 亚洲午夜日韩高清一区| 最近最好的中文字幕2019免费| 国产一级a毛一级a看免费人娇| 亚洲私人无码综合久久网| 亚洲精品在线免费观看视频| 久久亚洲国产午夜精品理论片| 免费不卡中文字幕在线|