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存储(四)相关推荐
- Nginx+Memcached+Tomcat集群配置实践(Sticky Session)
准备工作 创建一个简单的web应用,名为session.其中有两个页面,分别如下所示: 页面login.jsp [html] view plaincopy <%@ page language=& ...
- Nginx+Tomcat 负载均衡集群方案
2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...
- Linux平台上搭建apache+tomcat负载均衡集群
传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...
- 搭建Nginx+Tomcat 负载均衡集群
Nginx+Tomcat 负载均衡集群 一. 实验拓扑: 二. 实验要求: 1. 试验环境: 主机 操作系统 所需软件 Nginx服务器 rhel 6.5 x86_64 nginx-1.6.0.tar ...
- kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区
在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...
- 分布式面试 - 集群部署时的分布式 session 如何实现?
面试题 集群部署时的分布式 session 如何实现? 面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一 ...
- 集群部署时的分布式 Session 如何实现?
面试题 集群部署时的分布式 session 如何实现? 面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一 ...
- 使用Ceph集群作为Kubernetes的动态分配持久化存储
2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...
- Ceph集群搭建及其运用(块存储、ceph文件系统)
一.ceph简介 ceph被称作面向未来的存储, 可以实现的存储方式: 块存储:提供像普通硬盘一样的存储,为使用者提供"硬盘" 文件系统存储:类似于NFS的共享方式,为使用者提供共 ...
最新文章
- 为ASP.NET控件添加常用的JavaScript操作
- 二值网络--Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation
- 洛谷P1182 数列分段Section II 二分答案
- 在可编辑div中插入文字或图片的问题解决思路
- 下载Android源码流程(完整版)
- linux异常 - 无法分配内存
- java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
- wangeditor 不识别html_前端知识(一)认识HTML
- 逻辑运算符 用法解释
- 从零开始的Unity萌导书#1:Hello,Unity!
- 探究Ptcms小说采集规则
- batchplot插件用法_怎么使用Batchplot命令批量打印CAD图纸
- 有关BT5破解wifi密码的流程及当中经历问题的总结——从寻找ISO镜像到破解wifi密码
- Cadence 17.4 PSpice仿真555定时器输出方波
- NPOI导出Excel自适应行高
- 计算机体系架构未来趋势(深度)
- Office2010安装出错(Error1406)
- 用css解决文本折行问题
- 在线下单系统think php,昱杰订单管理系统(ThinkPHP版) v19.0
- 学习opengl官方指南 01 opengl介绍
热门文章
- ITK:计算PCA形状模型
- VTK:PolyData之SelectPolyData
- VTK:Points之ExtractEnclosedPoints
- VTK:几何对象之OpenVRCube
- OpenCV使用Laplacian filtering和距离变换以及Laplacian滤波对重叠对象进行分段的实例(附完整代码)
- OpenGL 基础光照ColorsBasic Lighting
- C++Doubly Linked List双向链表(附完整源码)
- QT的QDesignerPropertySheetExtension类的使用
- C++Opengl绘制三角形源码
- java sortedset_Java类集-SortedSet接口 | 学步园