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

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

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

    posts - 495,comments - 227,trackbacks - 0
    如何在一個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

    FeedBack:
    # re: tomcat下 共享session (摘自網上,沒有具體驗證,如果哪位驗證了,請告知一下謝謝)
    2009-03-06 23:19 | Jie
    關注  回復  更多評論
      
    # re: tomcat下 共享session (摘自網上,沒有具體驗證,如果哪位驗證了,請告知一下謝謝)
    2009-03-07 10:27 | stone2083
    不推薦使用tomcat默認的session機制。
    基于內存的session,無可避免GC帶來的問題,何況在集群環境下,同步開銷太大。
    推薦使用基于memcached,或者database的session。  回復  更多評論
      
    # re: tomcat下 共享session (摘自網上,沒有具體驗證,如果哪位驗證了,請告知一下謝謝)[未登錄]
    2009-06-30 18:48 | ajax
    1.設置Context 的crossContext="true",使得各個web應用的servletcontext是可以互訪的


    這種方法我試了可以
      回復  更多評論
      
    主站蜘蛛池模板: 99久久精品国产亚洲| 亚洲精品白浆高清久久久久久| 91天堂素人精品系列全集亚洲| 99免费精品视频| 亚洲中久无码永久在线观看同| 免费视频成人国产精品网站| 免费日本黄色网址| 羞羞漫画登录页面免费 | 四虎永久在线观看免费网站网址 | 久久久久久久99精品免费| 亚洲综合另类小说色区| a毛片全部播放免费视频完整18| 中文字幕在亚洲第一在线| 成人自慰女黄网站免费大全| 亚洲区小说区图片区QVOD| 久久久国产精品无码免费专区| 亚洲精品免费观看| 国产精品久久久久久久久免费| 亚洲午夜电影在线观看| 午夜网站免费版在线观看| 四虎国产精品成人免费久久| 亚洲日韩精品A∨片无码| 999久久久免费精品播放| 久久综合久久综合亚洲| 免费吃奶摸下激烈视频| 女人隐私秘视频黄www免费| 亚洲理论片在线中文字幕| 天天看免费高清影视| 国产亚洲美女精品久久| 亚洲色爱图小说专区| 69xx免费观看视频| 青青青亚洲精品国产| 亚洲日产无码中文字幕| 在线看片v免费观看视频777| 蜜臀亚洲AV无码精品国产午夜.| 亚洲综合av永久无码精品一区二区| 久久久久免费看成人影片| 亚洲精品无码久久| 亚洲AV午夜成人片| 国产精品美女自在线观看免费| 国产成人精品一区二区三区免费|