tomcat实现session集群及tomcat+memcached共享session存储(四)
接博客nginx或httpd實(shí)現(xiàn)負(fù)載均衡tomcat(三)
tomcat實(shí)現(xiàn)會話管理原理及實(shí)現(xiàn):
tomcat管理會話使用的專用的會話管理組件,tomcat的會話管理器有4種:
1、標(biāo)準(zhǔn)會話管理器(StanderdManager)
2、持久會話管理器(PersistentManager可以基于文件存儲(FileStore)或JDBC存儲(JDBCStore))
????????????? 基于JDBC的話就可以實(shí)現(xiàn)高可用tomcat的session集群。
1、DeltaManager會話管理器
2、BackupManager會話管理器
?
StanderdManager會話管理原理是:tomcat節(jié)點(diǎn)主機(jī)會將客戶端的session信息自己保存在主機(jī)文件中,默認(rèn)保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中,當(dāng)tomcat實(shí)例出現(xiàn)故障后能夠從此文件中加載會話信息,而不至于導(dǎo)致信息丟失。
?????? 優(yōu)點(diǎn):能夠在一定程度上實(shí)現(xiàn)session保存,
?????? 缺點(diǎn):session會話信息只能夠當(dāng)前tomcat實(shí)例使用,而無法讓其他tomcat實(shí)例加載,因此也不具備高可用的功能。
?
?PersistentManager 持久會話管理器原理是:tomcat能夠?qū)?/span>session會話信息持久保存在指定的文件中或者數(shù)據(jù)庫中,但是此中會話管理依然只是能夠加載自己實(shí)例的會話信息,而不能夠加載其他實(shí)例的會話信息,使用主備模式時的tomcat備用節(jié)點(diǎn)可以從共享文件存儲文件或者數(shù)據(jù)庫中加載此tomcat實(shí)例的會話信息,從而實(shí)現(xiàn)tomcat的高可用。
?????? cornsync+pacemaker+nfs(mysql)實(shí)現(xiàn)tomcat的高可用。
?
DeltaManager會話管理器原理是:tomcat集群使用deltamanager在各節(jié)點(diǎn)中通過專門的多播地址來傳遞信息,并通過此多播信道傳遞每一個節(jié)點(diǎn)各自的session會話,將其保存在內(nèi)存中,因此每一個節(jié)點(diǎn)都擁有集群中所有每一個節(jié)點(diǎn)的session會話信息,當(dāng)一個節(jié)點(diǎn)down掉,可以將用戶的請求重定向到其他節(jié)點(diǎn),因此也能夠?qū)崿F(xiàn)高可用的功能。是實(shí)現(xiàn)session的cluster的方法。
?????? 優(yōu)點(diǎn):session信息在每一個節(jié)點(diǎn)中保存有所有集群節(jié)點(diǎn)的會話信息,不會因?yàn)槟骋粋€節(jié)點(diǎn)出現(xiàn)問題導(dǎo)致客戶端的會話信息丟失。前端可以使用任何調(diào)度算法實(shí)現(xiàn)負(fù)載均衡。
?????? 缺點(diǎn):因?yàn)橐褂枚嗖鬟f,所有這種情況下集群的規(guī)模不能太大,有數(shù)量限制,另一方面,所有的session信息也是保存在內(nèi)存中的,當(dāng)出現(xiàn)斷電會其他原因?qū)е滤泄?jié)點(diǎn)down機(jī)是,重啟依舊會丟失所有會話信息。適用大規(guī)模集群因此使用的場景很少。
?
3、BackupManager會話管理器原理是:這種集群需要兩個節(jié)點(diǎn)互相做主備組,backipmanager管理器會自動管理實(shí)現(xiàn)這兩個節(jié)點(diǎn)的高可用,而對前端調(diào)度器來說這兩個節(jié)點(diǎn)被當(dāng)做一個節(jié)點(diǎn)組使用,調(diào)度器調(diào)度是是調(diào)度到不同的組,每組內(nèi)部自己實(shí)現(xiàn)session的高可用,因此每組內(nèi)的對外的ip地址是在組內(nèi)兩個主備節(jié)點(diǎn)之間流動的,而這種流動是靠此會話管理器來實(shí)現(xiàn)的。前端調(diào)度器不能使用nginx,可以使用httpd
缺點(diǎn):部署拓?fù)浣Y(jié)構(gòu)難,因此只有在小規(guī)模的集群中偶爾使用。
?
?
各種會話管理器實(shí)現(xiàn)的配置方法:
標(biāo)準(zhǔn)會話管理器(StandardManager):
<ManagerclassName="org.apache.catalina.session.StandardManager"
????????maxInactiveInterval="7200"/>
?
默認(rèn)保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。
?
maxActiveSessions:最多允許的活動會話數(shù)量,默認(rèn)為-1,表示不限制;
maxInactiveInterval:非活動的會話超時時長,默認(rèn)為60s;
pathname:會話文件的保存目錄;
?
持久會話管理器(PersistentManager):
將會話數(shù)據(jù)保存至持久存儲中,并且能在服務(wù)器意外中止后重新啟動時重新加載這些會話信息。持久會話管理器支持將會話保存至文件存儲(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參數(shù)定義,默認(rèn)為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>
?
?
不論是標(biāo)準(zhǔn)會話管理區(qū)還是持久會話管理器,它所能加載的都是自己的session保存的會話信息,而不能實(shí)現(xiàn)加載其他的tomcat保存的會話信息,要實(shí)現(xiàn)能夠加載其他tomcat主機(jī)的session會話信息,需要使用到tomcat的session復(fù)制功能或者使用共享存儲來保持所有tomcat主機(jī)的會話信息。
?
實(shí)例六:設(shè)置后端tomcat服務(wù)器的session集群以實(shí)現(xiàn)共享session。
?
?
說明:前端調(diào)度器使用基于http_proxy模塊反向代理后端tomcat的session集群。
后端tomcat主機(jī)只用DeltaManager會話管理器。
負(fù)載均衡配置基于上面的http_balance實(shí)現(xiàn),使用http-1.1與后端tomcat實(shí)現(xiàn)通信。
session-cluster配置如下:
在各tomcat節(jié)點(diǎn)的配置文件中添加如下配置項(xiàng):(如下配置可以定義在engin組件內(nèi)或者host組件內(nèi),主要是作用范圍的區(qū)別!)
[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文件(也可以修改默認(rèn)的web.xml文件)
添加中添加
???????????????????? <distributable/>
注意:如果使用mod_jk模塊來實(shí)現(xiàn)的話需要再tomcat的配置文件中添加<Engin name=”Catalina”jvmRoute=”note01” >,這個jvmRoute的名稱要和此主機(jī)的jvm的名稱一致。
tomcat的session集群實(shí)際上也是實(shí)現(xiàn)了高可用的功能。
?
實(shí)例七:使用msm(memcache-session-manager)實(shí)現(xiàn)tomcat會話存儲在session服務(wù)器
?
?
首先在兩個節(jié)點(diǎn)主機(jī)上安裝安裝memcached服務(wù)
[root@lpw4 tomcat]# yum install memcached
?
并都啟動memcached服務(wù)
tomcat要先配置使用memcached的作為session服務(wù)需要安裝以下幾個軟件包:
注意:這里需要根據(jù)tomcat的安裝版本選擇相應(yīng)的軟件包版本:
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
?
將這些包復(fù)制在tomcat的lib目錄下
然后開始配置tomcat
修改tomcat的主配置文件server.xml文件,在自定義的host組件的中添加以下內(nèi)容:
??????????????? <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>
前方調(diào)度器依然使用nginx調(diào)度:配置文件和之前的不變。
?
測試:在瀏覽器中輸入可以看到無論怎么調(diào)度,返回的信息都是由memcached節(jié)點(diǎn)返回的信息。
?
?
?
轉(zhuǎn)載于:https://blog.51cto.com/qikexing/1709452
總結(jié)
以上是生活随笔為你收集整理的tomcat实现session集群及tomcat+memcached共享session存储(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码:显示查询的日历
- 下一篇: 301重定向的实现方法