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(因爲端口號不一樣,也就導致訪問地址不一樣了),這樣就導致無法查看的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章