接博客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存储(四)相关推荐

  1. Nginx+Memcached+Tomcat集群配置实践(Sticky Session)

    准备工作 创建一个简单的web应用,名为session.其中有两个页面,分别如下所示: 页面login.jsp [html] view plaincopy <%@ page language=& ...

  2. Nginx+Tomcat 负载均衡集群方案

    2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...

  3. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  4. 搭建Nginx+Tomcat 负载均衡集群

    Nginx+Tomcat 负载均衡集群 一. 实验拓扑: 二. 实验要求: 1. 试验环境: 主机 操作系统 所需软件 Nginx服务器 rhel 6.5 x86_64 nginx-1.6.0.tar ...

  5. kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

    在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...

  6. 分布式面试 - 集群部署时的分布式 session 如何实现?

    面试题 集群部署时的分布式 session 如何实现? 面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一 ...

  7. 集群部署时的分布式 Session 如何实现?

    面试题 集群部署时的分布式 session 如何实现? 面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一 ...

  8. 使用Ceph集群作为Kubernetes的动态分配持久化存储

    2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...

  9. Ceph集群搭建及其运用(块存储、ceph文件系统)

    一.ceph简介 ceph被称作面向未来的存储, 可以实现的存储方式: 块存储:提供像普通硬盘一样的存储,为使用者提供"硬盘" 文件系统存储:类似于NFS的共享方式,为使用者提供共 ...

最新文章

  1. 为ASP.NET控件添加常用的JavaScript操作
  2. 二值网络--Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation
  3. 洛谷P1182 数列分段Section II 二分答案
  4. 在可编辑div中插入文字或图片的问题解决思路
  5. 下载Android源码流程(完整版)
  6. linux异常 - 无法分配内存
  7. java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
  8. wangeditor 不识别html_前端知识(一)认识HTML
  9. 逻辑运算符 用法解释
  10. 从零开始的Unity萌导书#1:Hello,Unity!
  11. 探究Ptcms小说采集规则
  12. batchplot插件用法_怎么使用Batchplot命令批量打印CAD图纸
  13. 有关BT5破解wifi密码的流程及当中经历问题的总结——从寻找ISO镜像到破解wifi密码
  14. Cadence 17.4 PSpice仿真555定时器输出方波
  15. NPOI导出Excel自适应行高
  16. 计算机体系架构未来趋势(深度)
  17. Office2010安装出错(Error1406)
  18. 用css解决文本折行问题
  19. 在线下单系统think php,昱杰订单管理系统(ThinkPHP版) v19.0
  20. 学习opengl官方指南 01 opengl介绍

热门文章

  1. ITK:计算PCA形状模型
  2. VTK:PolyData之SelectPolyData
  3. VTK:Points之ExtractEnclosedPoints
  4. VTK:几何对象之OpenVRCube
  5. OpenCV使用Laplacian filtering和距离变换以及Laplacian滤波对重叠对象进行分段的实例(附完整代码)
  6. OpenGL 基础光照ColorsBasic Lighting
  7. C++Doubly Linked List双向链表(附完整源码)
  8. QT的QDesignerPropertySheetExtension类的使用
  9. C++Opengl绘制三角形源码
  10. java sortedset_Java类集-SortedSet接口 | 学步园