如何在一個(gè)tomcat下的幾個(gè)web應(yīng)用之間共享session
我們采取的是集中管理的辦法。主要技術(shù):
1.設(shè)置Context 的crossContext="true",使得各個(gè)web應(yīng)用的servletcontext是可以互訪的
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/SessionManager" reloadable="true" crossContext="true"></Context>
<Context path="/SessionManagerTest1" reloadable="true" crossContext="true"></Context>
<Context path="/SessionManagerTest2" reloadable="true" crossContext="true"></Context>
2.主動(dòng)設(shè)置cookies,設(shè)置jsessionid為被共享的session的id,統(tǒng)一利用requestsessionid在指定的一個(gè)
servletcontext里的一個(gè)map查找對(duì)于的session,需要存取attribute都對(duì)取得的session操作
3.用監(jiān)聽(tīng)器監(jiān)聽(tīng)屬性的失效
Tomcat集群之Session復(fù)制配置 分享
因?yàn)樽罱捻?xiàng)目要用到多web服務(wù)器實(shí)現(xiàn)訪問(wèn)負(fù)載和集群,負(fù)載調(diào)度使用的是LVS,而非apache的負(fù)載調(diào)度,因?yàn)樵诟咴L問(wèn)量和大并發(fā)量的時(shí)候LVS的
性能比APACHE好。然后在web服務(wù)器上是使用tomcat5.5.25做應(yīng)用服務(wù)器,對(duì)于tomcat的集群有兩種方式,這個(gè)主要是針對(duì)
session而言的。一種就是sticky模式,即黏性會(huì)話模式;另外一種就是session復(fù)制模式了。所謂sticky模式就是說(shuō)同一個(gè)用戶的訪問(wèn)
請(qǐng)求都被派送到同一個(gè)tomcat實(shí)例上,這樣我們就無(wú)須在多臺(tái)服務(wù)器之間實(shí)現(xiàn)session共享了,這是其好處,不好的地方就是不能實(shí)現(xiàn)
failureover了,一但用戶訪問(wèn)的機(jī)器掛掉,那么其session就會(huì)丟失。而session復(fù)制模式就可以很好的解決failureover的
問(wèn)題,即使某一臺(tái)web服務(wù)器掛掉了,用戶的請(qǐng)求還會(huì)被負(fù)載到其他的web服務(wù)器上,而且session也被復(fù)制了,這樣對(duì)用戶而言就像是在同一臺(tái)機(jī)器上
操作一樣,不好的地方就是session復(fù)制需要系統(tǒng)資源和網(wǎng)絡(luò)的開(kāi)銷,尤其是當(dāng)web服務(wù)器多的時(shí)候或session里存儲(chǔ)的數(shù)據(jù)量大的時(shí)候,這點(diǎn)將會(huì)
比較的明顯(不過(guò)自己還沒(méi)有做這方面的測(cè)試)。
針對(duì)這兩種方式的弊端和好處,我們可以采用將兩種方式結(jié)合的方式來(lái)達(dá)到更好的效果,那
就是sticky+session復(fù)制模式了。用戶的請(qǐng)求按照
sticky方式被分發(fā)到同一個(gè)web服務(wù)器上,同時(shí)tomcat在后臺(tái)做異步復(fù)制(非同步)session到其他web服務(wù)器,這樣我們使用
sticky的簡(jiǎn)便性,同時(shí)又有了一定的容錯(cuò)能力。
下面我就將自己的tomcat集群配置經(jīng)驗(yàn)跟大家分享一下,呵呵?,F(xiàn)在想來(lái),其實(shí)tomcat的集群配置真的是非常簡(jiǎn)單,幾乎不需要改什么東西了。我今天就在windows上用一臺(tái)機(jī)器來(lái)跑兩個(gè)tomcat實(shí)例,下面是一些基礎(chǔ)條件:
1.兩個(gè)tomcat的目錄分別為:d:\apache-tomcat-5.5.25-node1和d:\apache-tomcat-5.5.25-node2
2.在每個(gè)tomcat目錄下的conf\Catalina\localhost目錄下建立一個(gè)ROOT.xml文件,其內(nèi)容為:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Context docBase="D:/mywebapps/test1"
3 privileged="true" antiResourceLocking="false" antiJARLocking="false" distributable="true">
4 </Context>
3.修改apache-tomcat-5.5.25-node1的connector端口為8091,修改apache-tomcat-5.5.25-node2的connector的端口為8092,這樣是為了避免在同一機(jī)器上同時(shí)啟動(dòng)時(shí)造成訪問(wèn)端口沖突;
4.修改apache-tomcat-5.5.25-node2的Server端口為8006,與apache-tomcat-5.5.25-node1的Server端口8005不一樣,也是避免兩個(gè)tomcat實(shí)例啟動(dòng)時(shí)造成程序端口的沖突問(wèn)題;
5.修改apache-tomcat-5.5.25-node2的AJP/1.3的端口為8019或其他非8009(默認(rèn))的端口,也是為了避免與apache-tomcat-5.5.25-node1的AJP/1.3端口沖突;
這
樣,我們就可以保證每一個(gè)tomcat單獨(dú)啟動(dòng)時(shí)都可以提供D:/mywebapps/test1的web服務(wù),注意是單個(gè)啟動(dòng)哦,然后分別啟動(dòng)
apache-tomcat-5.5.25-node1和apache-tomcat-5.5.25-node2后,輸入如下地址分別進(jìn)行訪問(wèn)你的web
應(yīng)用:
apache-tomcat-5.5.25-node1的訪問(wèn)地址:http://localhost:8091/你的頁(yè)面地址
apache-tomcat-5.5.25-node2的訪問(wèn)地址:http://localhost:8092/你的頁(yè)面地址
如果你的tomcat沒(méi)能成功的提供服務(wù),那么你就需要查看一下是否tomcat部署成功了。注意這里的D:/mywebapps/test1就是你的web應(yīng)用的物理路徑了,可以隨意修改。下面就開(kāi)始對(duì)server.xml文件的配置了。
找到apache-tomcat-5.5.25-node1目錄下的server.xml文件,打開(kāi)并找到配置Engine的位置,我們?cè)谧詈蠹尤?jvmRoute="node1",表示這個(gè)tomcat的實(shí)例名稱為node1。修改前后的對(duì)比如下:
修改前:
<Engine name="Catalina" defaultHost="localhost">
修改后:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
然
后找到Cluster標(biāo)簽,并取消它的注釋即可,無(wú)須做任何修改。同樣,我們修改apache-tomcat-5.5.25-node2下的
server.xml文件,修改jvmRoute="node2",然后也是注釋掉Cluster標(biāo)簽,注意,然后還要修改Cluster標(biāo)簽下的
Receiver標(biāo)簽的tcpListenPort端口號(hào),我們改為4002(默認(rèn)的是4001),這個(gè)是為了避免兩個(gè)tomcat實(shí)例同時(shí)啟動(dòng)時(shí)造成沖
突。
通過(guò)上面的配置后,我們兩個(gè)tomcat已經(jīng)配置完畢,并且可以完成集群任務(wù)了。注意啟動(dòng)的時(shí)候不能直接雙擊其bing目錄下的
startup.bat文件,我們還需要為每一個(gè)tomcat設(shè)置環(huán)境變量,分別在apache-tomcat-5.5.25-node1和
apache-tomcat- 5.5.25-node2的根目錄下編寫一個(gè)bat文件,內(nèi)容如下:
apache-tomcat-5.5.25-node1目錄下的startup_node1.bat內(nèi)容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node1
bin/startup.bat
apache-tomcat-5.5.25-node2目錄下的startup_node2.bat內(nèi)容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node2
bin/startup.bat
然后分別運(yùn)行這兩批處理文件即可正常啟動(dòng)tomcat了。我們先啟動(dòng)node1,雙擊startup_node1.bat啟動(dòng)node1。我們可以在窗口的最上面看到如下的輸出信息:
2008-1-4 19:12:24 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:12:25 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket
信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:12:27 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:12:27 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
信息: Manager []: skipping state transfer. No members active in cluster group.
這表明我們的tomcat集群已經(jīng)正常啟動(dòng)了。然后我們?cè)龠\(yùn)行apache-tomcat-5.5.25-node2目錄下的startup_node2.bat以啟動(dòng)node2。然后我們可以可以在窗口的最上方看到如下的信息輸出:
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket
信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=245203]
2008-1-4 19:16:34 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:16:34 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
警告: Manager [], requesting session state from org.apache.catalina.cluster.mcas
t.McastMember[tcp://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=248203
]. This operation will timeout if no session state has been received within 60 s
econds.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager waitForSendAl
lSessions
請(qǐng)注意node2窗口輸出的不同顏色部分,這個(gè)已經(jīng)表示node2節(jié)點(diǎn)和node2節(jié)點(diǎn)聯(lián)系上了。我們?cè)倩剡^(guò)來(lái)看node1窗口的輸出信息,發(fā)現(xiàn)多出了如下的信息:
2008-1-4 19:16:34 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4002,catalina,192.168.1.227,4002, alive=0]
這
表明node1也已經(jīng)偵聽(tīng)到了node2,兩個(gè)tomcat服務(wù)器已經(jīng)建立了聯(lián)系。然后我們?cè)L問(wèn)node1的一個(gè)地址A,假設(shè)這個(gè)地址A往
session里設(shè)置一個(gè)屬性,然后我們?cè)僭谕淮翱谥性L問(wèn)node2的一個(gè)地址B,假設(shè)B是從session里讀取這個(gè)屬性,我們會(huì)發(fā)現(xiàn)B地址確實(shí)得到
了這個(gè)剛剛我們?cè)趎ode1上設(shè)置進(jìn)去的值。這里要特別注意的是,我們兩個(gè)地址的分別訪問(wèn)必須是在同一個(gè)窗口中,因?yàn)槲覀儧](méi)有做前端的web負(fù)載,所以使
用不同的窗口進(jìn)行訪問(wèn)會(huì)出現(xiàn)不同的session(因?yàn)槎丝谔?hào)不一樣,也就導(dǎo)致訪問(wèn)地址不一樣了),這樣就導(dǎo)致無(wú)法查看的問(wèn)題。
posted on 2009-03-06 14:23
SIMONE 閱讀(4761)
評(píng)論(3) 編輯 收藏 所屬分類:
tomcat