tomcat实现session集群及tomcat+memcached共享session存储(四)
接博客nginx或httpd實現負載均衡tomcat(三)
tomcat實現會話管理原理及實現:
tomcat管理會話使用的專用的會話管理組件,tomcat的會話管理器有4種:
1、標準會話管理器(StanderdManager)
2、持久會話管理器(PersistentManager可以基于文件存儲(FileStore)或JDBC存儲(JDBCStore))
????????????? 基于JDBC的話就可以實現高可用tomcat的session集群。
1、DeltaManager會話管理器
2、BackupManager會話管理器
?
StanderdManager會話管理原理是:tomcat節點主機會將客戶端的session信息自己保存在主機文件中,默認保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中,當tomcat實例出現故障后能夠從此文件中加載會話信息,而不至于導致信息丟失。
?????? 優點:能夠在一定程度上實現session保存,
?????? 缺點:session會話信息只能夠當前tomcat實例使用,而無法讓其他tomcat實例加載,因此也不具備高可用的功能。
?
?PersistentManager 持久會話管理器原理是:tomcat能夠將session會話信息持久保存在指定的文件中或者數據庫中,但是此中會話管理依然只是能夠加載自己實例的會話信息,而不能夠加載其他實例的會話信息,使用主備模式時的tomcat備用節點可以從共享文件存儲文件或者數據庫中加載此tomcat實例的會話信息,從而實現tomcat的高可用。
?????? cornsync+pacemaker+nfs(mysql)實現tomcat的高可用。
?
DeltaManager會話管理器原理是:tomcat集群使用deltamanager在各節點中通過專門的多播地址來傳遞信息,并通過此多播信道傳遞每一個節點各自的session會話,將其保存在內存中,因此每一個節點都擁有集群中所有每一個節點的session會話信息,當一個節點down掉,可以將用戶的請求重定向到其他節點,因此也能夠實現高可用的功能。是實現session的cluster的方法。
?????? 優點:session信息在每一個節點中保存有所有集群節點的會話信息,不會因為某一個節點出現問題導致客戶端的會話信息丟失。前端可以使用任何調度算法實現負載均衡。
?????? 缺點:因為要使用多播傳遞,所有這種情況下集群的規模不能太大,有數量限制,另一方面,所有的session信息也是保存在內存中的,當出現斷電會其他原因導致所有節點down機是,重啟依舊會丟失所有會話信息。適用大規模集群因此使用的場景很少。
?
3、BackupManager會話管理器原理是:這種集群需要兩個節點互相做主備組,backipmanager管理器會自動管理實現這兩個節點的高可用,而對前端調度器來說這兩個節點被當做一個節點組使用,調度器調度是是調度到不同的組,每組內部自己實現session的高可用,因此每組內的對外的ip地址是在組內兩個主備節點之間流動的,而這種流動是靠此會話管理器來實現的。前端調度器不能使用nginx,可以使用httpd
缺點:部署拓撲結構難,因此只有在小規模的集群中偶爾使用。
?
?
各種會話管理器實現的配置方法:
標準會話管理器(StandardManager):
<ManagerclassName="org.apache.catalina.session.StandardManager"
????????maxInactiveInterval="7200"/>
?
默認保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。
?
maxActiveSessions:最多允許的活動會話數量,默認為-1,表示不限制;
maxInactiveInterval:非活動的會話超時時長,默認為60s;
pathname:會話文件的保存目錄;
?
持久會話管理器(PersistentManager):
將會話數據保存至持久存儲中,并且能在服務器意外中止后重新啟動時重新加載這些會話信息。持久會話管理器支持將會話保存至文件存儲(FileStore)或JDBC存儲(JDBCStore)中。
?
保存至文件中的示例:
<ManagerclassName="org.apache.catalina.session.PersistentManager"
? saveOnRestart="true">
? <Store className="org.apache.catalina.session.FileStore"
???directory="/data/tomcat-sessions"/>
</Manager>
?
每個用戶的會話會被保存至directory指定的目錄中的文件中,文件名為<session id>.session,并通過后臺線程每隔一段時間(checkInterval參數定義,默認為60秒)檢查一次超時會話。
?
保存至JDBCStore中的示例:
<ManagerclassName="org.apache.catalina.session.PersistentManager"
? saveOnRestart="true">
? <StoreclassName="org.apache.catalina.session.JDBCStore"
???driverName="com.mysql.jdbc.Driver"
???connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>
</Manager>
?
?
不論是標準會話管理區還是持久會話管理器,它所能加載的都是自己的session保存的會話信息,而不能實現加載其他的tomcat保存的會話信息,要實現能夠加載其他tomcat主機的session會話信息,需要使用到tomcat的session復制功能或者使用共享存儲來保持所有tomcat主機的會話信息。
?
實例六:設置后端tomcat服務器的session集群以實現共享session。
?
?
說明:前端調度器使用基于http_proxy模塊反向代理后端tomcat的session集群。
后端tomcat主機只用DeltaManager會話管理器。
負載均衡配置基于上面的http_balance實現,使用http-1.1與后端tomcat實現通信。
session-cluster配置如下:
在各tomcat節點的配置文件中添加如下配置項:(如下配置可以定義在engin組件內或者host組件內,主要是作用范圍的區別!)
[root@tomcat1 conf]# vim server.xml
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"
???????????????? channelSendOptions="8">
?
?????????<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
??????????????????expireSessionsOnShutdown="false"
??????????????????notifyListenersOnReplication="true"/>
?
?????????<Channel className="org.apache.catalina.tribes.group.GroupChannel">
???????????<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
???????????????????????address="228.0.1.9"
??????????????????????? port="45564"
???????????????????????frequency="500"
??????????????????????? dropTime="3000"/>
???????????<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
?????????????????????address="172.16.249.204"
????????????????????? port="4000"
????????????????????? autoBind="100"
????????????????????? selectorTimeout="5000"
?????????????????????maxThreads="6"/>
?
???????????<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
????????????? <TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
???????????</Sender>
???????????<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
???????????<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
?????????</Channel>
?
?????????<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
???????????????? filter=""/>
?????????<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
?
?????????<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
???? ???????????????tempDir="/tmp/war-temp/"
???????????????????deployDir="/tmp/war-deploy/"
???????????????????watchDir="/tmp/war-listen/"
???????????????????watchEnabled="false"/>
?
?????????<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
???????</Cluster>
?
然后在webapp的目錄下修改WEB-INF/web.xml文件(也可以修改默認的web.xml文件)
添加中添加
???????????????????? <distributable/>
注意:如果使用mod_jk模塊來實現的話需要再tomcat的配置文件中添加<Engin name=”Catalina”jvmRoute=”note01” >,這個jvmRoute的名稱要和此主機的jvm的名稱一致。
tomcat的session集群實際上也是實現了高可用的功能。
?
實例七:使用msm(memcache-session-manager)實現tomcat會話存儲在session服務器
?
?
首先在兩個節點主機上安裝安裝memcached服務
[root@lpw4 tomcat]# yum install memcached
?
并都啟動memcached服務
tomcat要先配置使用memcached的作為session服務需要安裝以下幾個軟件包:
注意:這里需要根據tomcat的安裝版本選擇相應的軟件包版本:
javolution-5.4.3.1.jar
memcached-session-manager-1.8.3.jar
memcached-session-manager-tc8-1.8.3.jar
msm-javolution-serializer-1.8.3.jar
spymemcached-2.11.1.jar
?
將這些包復制在tomcat的lib目錄下
然后開始配置tomcat
修改tomcat的主配置文件server.xml文件,在自定義的host組件的中添加以下內容:
??????????????? <Context path="webapp"docBase="/myweb/webapp/Root" reloadable="true" >
???????????????????????? <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
???????????????????????memcachedNodes="n1:172.16.249.204:11211,n2:172.16.249.203:11211"
???????????????????????failoverNodes="n1"
???????????????????????requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
???????????????????????transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
?????????????? </Context>
前方調度器依然使用nginx調度:配置文件和之前的不變。
?
測試:在瀏覽器中輸入可以看到無論怎么調度,返回的信息都是由memcached節點返回的信息。
?
?
?
轉載于:https://blog.51cto.com/qikexing/1709452
總結
以上是生活随笔為你收集整理的tomcat实现session集群及tomcat+memcached共享session存储(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码:显示查询的日历
- 下一篇: 301重定向的实现方法