如何在一個tomcat下的幾個web應用之間共享session
我們采取的是集中管理的辦法。主要技術:
1.設置Context 的crossContext="true",使得各個web應用的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.主動設置cookies,設置jsessionid為被共享的session的id,統一利用requestsessionid在指定的一個
servletcontext里的一個map查找對于的session,需要存取attribute都對取得的session操作
3.用監聽器監聽屬性的失效
Tomcat集群之Session復制配置 分享
因為最近的項目要用到多web服務器實現訪問負載和集群,負載調度使用的是LVS,而非apache的負載調度,因為在高訪問量和大并發量的時候LVS的
性能比APACHE好。然后在web服務器上是使用tomcat5.5.25做應用服務器,對于tomcat的集群有兩種方式,這個主要是針對
session而言的。一種就是sticky模式,即黏性會話模式;另外一種就是session復制模式了。所謂sticky模式就是說同一個用戶的訪問
請求都被派送到同一個tomcat實例上,這樣我們就無須在多臺服務器之間實現session共享了,這是其好處,不好的地方就是不能實現
failureover了,一但用戶訪問的機器掛掉,那么其session就會丟失。而session復制模式就可以很好的解決failureover的
問題,即使某一臺web服務器掛掉了,用戶的請求還會被負載到其他的web服務器上,而且session也被復制了,這樣對用戶而言就像是在同一臺機器上
操作一樣,不好的地方就是session復制需要系統資源和網絡的開銷,尤其是當web服務器多的時候或session里存儲的數據量大的時候,這點將會
比較的明顯(不過自己還沒有做這方面的測試)。
針對這兩種方式的弊端和好處,我們可以采用將兩種方式結合的方式來達到更好的效果,那
就是sticky+session復制模式了。用戶的請求按照
sticky方式被分發到同一個web服務器上,同時tomcat在后臺做異步復制(非同步)session到其他web服務器,這樣我們使用
sticky的簡便性,同時又有了一定的容錯能力。
下面我就將自己的tomcat集群配置經驗跟大家分享一下,呵呵。現在想來,其實tomcat的集群配置真的是非常簡單,幾乎不需要改什么東西了。我今天就在windows上用一臺機器來跑兩個tomcat實例,下面是一些基礎條件:
1.兩個tomcat的目錄分別為:d:\apache-tomcat-5.5.25-node1和d:\apache-tomcat-5.5.25-node2
2.在每個tomcat目錄下的conf\Catalina\localhost目錄下建立一個ROOT.xml文件,其內容為:
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,這樣是為了避免在同一機器上同時啟動時造成訪問端口沖突;
4.修改apache-tomcat-5.5.25-node2的Server端口為8006,與apache-tomcat-5.5.25-node1的Server端口8005不一樣,也是避免兩個tomcat實例啟動時造成程序端口的沖突問題;
5.修改apache-tomcat-5.5.25-node2的AJP/1.3的端口為8019或其他非8009(默認)的端口,也是為了避免與apache-tomcat-5.5.25-node1的AJP/1.3端口沖突;
這
樣,我們就可以保證每一個tomcat單獨啟動時都可以提供D:/mywebapps/test1的web服務,注意是單個啟動哦,然后分別啟動
apache-tomcat-5.5.25-node1和apache-tomcat-5.5.25-node2后,輸入如下地址分別進行訪問你的web
應用:
apache-tomcat-5.5.25-node1的訪問地址:http://localhost:8091/你的頁面地址
apache-tomcat-5.5.25-node2的訪問地址:http://localhost:8092/你的頁面地址
如果你的tomcat沒能成功的提供服務,那么你就需要查看一下是否tomcat部署成功了。注意這里的D:/mywebapps/test1就是你的web應用的物理路徑了,可以隨意修改。下面就開始對server.xml文件的配置了。
找到apache-tomcat-5.5.25-node1目錄下的server.xml文件,打開并找到配置Engine的位置,我們在最后加入 jvmRoute="node1",表示這個tomcat的實例名稱為node1。修改前后的對比如下:
修改前:
<Engine name="Catalina" defaultHost="localhost">
修改后:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
然
后找到Cluster標簽,并取消它的注釋即可,無須做任何修改。同樣,我們修改apache-tomcat-5.5.25-node2下的
server.xml文件,修改jvmRoute="node2",然后也是注釋掉Cluster標簽,注意,然后還要修改Cluster標簽下的
Receiver標簽的tcpListenPort端口號,我們改為4002(默認的是4001),這個是為了避免兩個tomcat實例同時啟動時造成沖
突。
通過上面的配置后,我們兩個tomcat已經配置完畢,并且可以完成集群任務了。注意啟動的時候不能直接雙擊其bing目錄下的
startup.bat文件,我們還需要為每一個tomcat設置環境變量,分別在apache-tomcat-5.5.25-node1和
apache-tomcat- 5.5.25-node2的根目錄下編寫一個bat文件,內容如下:
apache-tomcat-5.5.25-node1目錄下的startup_node1.bat內容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node1
bin/startup.bat
apache-tomcat-5.5.25-node2目錄下的startup_node2.bat內容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node2
bin/startup.bat
然后分別運行這兩批處理文件即可正常啟動tomcat了。我們先啟動node1,雙擊startup_node1.bat啟動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集群已經正常啟動了。然后我們再運行apache-tomcat-5.5.25-node2目錄下的startup_node2.bat以啟動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
請注意node2窗口輸出的不同顏色部分,這個已經表示node2節點和node2節點聯系上了。我們再回過來看node1窗口的輸出信息,發現多出了如下的信息:
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也已經偵聽到了node2,兩個tomcat服務器已經建立了聯系。然后我們訪問node1的一個地址A,假設這個地址A往
session里設置一個屬性,然后我們再在同一窗口中訪問node2的一個地址B,假設B是從session里讀取這個屬性,我們會發現B地址確實得到
了這個剛剛我們在node1上設置進去的值。這里要特別注意的是,我們兩個地址的分別訪問必須是在同一個窗口中,因為我們沒有做前端的web負載,所以使
用不同的窗口進行訪問會出現不同的session(因為端口號不一樣,也就導致訪問地址不一樣了),這樣就導致無法查看的問題。
posted on 2009-03-06 14:23
SIMONE 閱讀(4761)
評論(3) 編輯 收藏 所屬分類:
tomcat