设为首页 收藏本站
查看: 518|回复: 0

[经验分享] tomcat实现session集群及tomcat+memcached共享session存储(四)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-4 08:24:41 | 显示全部楼层 |阅读模式
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

wKiom1Y47rWwHXdtAABomc438j8891.jpg

说明:前端调度器使用基于http_proxy模块反向代理后端tomcat的session集群。
后端tomcat主机只用DeltaManager会话管理器。
负载均衡配置基于上面的http_balance实现,使用http-1.1与后端tomcat实现通信。
session-cluster配置如下:
在各tomcat节点的配置文件中添加如下配置项:(如下配置可以定义在engin组件内或者host组件内,主要是作用范围的区别!)
[iyunv@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/>
wKioL1Y47yjin1hMAAFYkqjBcMw792.jpg
注意:如果使用mod_jk模块来实现的话需要再tomcat的配置文件中添加<Engin name=”Catalina”jvmRoute=”note01” >,这个jvmRoute的名称要和此主机的jvm的名称一致。
tomcat的session集群实际上也是实现了高可用的功能。

实例七:使用msm(memcache-session-manager)实现tomcat会话存储在session服务器

wKiom1Y47wWSdubEAABrsPDVMfA278.jpg

首先在两个节点主机上安装安装memcached服务
[iyunv@lpw4 tomcat]# yum install memcached

并都启动memcached服务

wKiom1Y47yOg8QuWAANISPeQfhI191.jpg
wKioL1Y472Hw299JAANeujXiorE699.jpg
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>

wKiom1Y470KTGsudAAMXqYEwplA886.jpg
wKioL1Y474CRdi6LAAMKJ7RWS-A028.jpg
前方调度器依然使用nginx调度:配置文件和之前的不变。

测试:在浏览器中输入可以看到无论怎么调度,返回的信息都是由memcached节点返回的信息。

wKiom1Y4723xpm_iAAEcPhagALQ168.jpg
wKioL1Y476rDT74eAAEEo-uR4Ug415.jpg





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-134718-1-1.html 上篇帖子: nginx或httpd实现负载均衡tomcat(三) 下篇帖子: Tomcat的基础知识和一些应用,session cluster和session server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表