这是Tomcat群集系列的第三部分。 在本文中,我们将讨论如何在tomcat集群环境中设置会话复制。 会话复制使群集环境具有高可用性和完整的故障转移功能。

[查看下面的视频以获得更好的理解]

在我之前的文章中,我们讨论了有关设置简单负载均衡器以及如何制作会话亲和力概念的内容。

如何在tomcat中设置会话复制

在进行会话复制之前,我们需要了解2个重要概念

  • 多播
  • Tomcat中的会话管理器

多播

多播是将单个消息传输到选定的一组收件人。 在此,tomcat群集使用多播来标识群集中那些实例的实例。

集群2种类型

  • 静态Tomcat集群
  • 动态Tomcat集群

静态集群中 ,不需要多播,因为我们每个Tomcat都静态定义/配置了其他实例。 但是动态集群我们没有定义任何东西。 因此,该群集中的每个tomcat都如何识别其他tomcat实例。

因此,这里使用多播概念。 每个tomcat首先加入单个组播组 。 并定期发送心跳信号。 因此其他tomcat实例接收到这些信号并将该成员添加到群集中。

Tomcat中的会话管理器

会话管理器用于创建和管理代表应用程序的会话。 在Servlet规范中request.getSession(); 提到了容器(tomcat)负责创建会话。 在这里,tomcat为此使用了会话管理器。

会话管理器4种类型

  • 标准经理
  • 永久经理
  • 台达经理
  • 备份管理器

标准经理

它是tomcat使用的默认管理器。 即使在Web应用程序中未提及我们,tomcat也使用此管理器来管理会话。 如果您要自定义此标准管理器,则在context.xml文件中添加<Manager>标记。

<Manager className=“org.apache.catalina.session.StandardManager” />

在这里org.apache.catalina.session.StandardManager是标准管理器的完全限定的类名。

恒久经理

该管理器将在一段时间后将会话信息存储到持久位置。 这里有两种类型的商店。

  • 文件存储
  • JDBC存储

文件存储有助于将所有会话信息存储在基础文件系统(本地HDD或共享文件系统,例如NFS等)的单独文件中。

JDBC Store帮助将会话信息存储到关系数据库。

因此,使用Persistent Manager,我们可以实现tomcat集群。 但它不是实时交换的。 它在一定时间间隔后推送信息。 因此,如果在该时间间隔之前发生了任何严重的事件(崩溃),则内存中的会话数据将消失。

三角洲经理

在这篇文章中,我们将使用该管理器。 它会将会话复制到所有其他实例。 因此,该经理通常使用集群环境。 但不适用于大型集群。

备份管理器

该管理器通常使用集群环境。 它像三角洲马槽。 但它将完全复制到另一个实例(备份实例)。 它的作用就像一个实例是Primary,另一个实例是Backup一样。

在Tomcat群集中进行会话复制的步骤

在这里,我将从上次会话亲和性职位中我刚离开的地方继续。 因此,请检查该帖子并确保正确设置了jumRoute。 所以步骤是

  1. 启用多播路由
  2. 在conf / server.xml文件中为所有实例添加<Cluster>条目。
  3. 启用可分发的Web应用程序

1.启用多播路由

在Linux环境中,大多数系统内核都能够处理多播地址。 但是我们需要在内核路由表中添加路由条目。

sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

eth0是我的以太网接口。 因此,请根据您的界面进行更改

在多播地址中属于D类地址范围(224.0.0.0至239.255.255.255)。 因此我们通知内核是否有人访问这些地址,然后它通过eth0接口。

2.在conf / server.xml文件中为所有实例添加<Cluster>条目。

这对于tomcat集群非常重要。 在所有tomcat实例中,我们需要在conf / server.xml文件中添加<Cluster>标记。

<Cluster className='org.apache.catalina.ha.tcp.SimpleTcpCluster'/>

我们可以在<Engine>标签或<Host>标签内添加此<Cluster>标签。

这里的SimpleTcpCluster是Tomcat Cluster的实现

这个标签看起来很简单,但是里面有很多标签。 如果我们省略,则采用默认值。 如果要进行任何定制(例如更改多猫地址,接收地址端口),则需要使用完整的<Cluster>标签

这是完整的<Cluster>

<Cluster className='org.apache.catalina.ha.tcp.SimpleTcpCluster'channelSendOptions='8'><Manager className='org.apache.catalina.ha.session.DeltaManager'expireSessionsOnShutdown='false'notifyListenersOnReplication='true'/><Channel className='org.apache.catalina.tribes.group.GroupChannel'><Membership className='org.apache.catalina.tribes.membership.McastService'address='228.0.0.4'
port='45564'frequency='500'dropTime='3000'/>
<Sender className='org.apache.catalina.tribes.transport.ReplicationTransmitter'><Transport className='org.apache.catalina.tribes.transport.nio.PooledParallelSender'/></Sender><Receiver className='org.apache.catalina.tribes.transport.nio.NioReceiver'address='auto'port='4000'autoBind='100'selectorTimeout='5000'maxThreads='6'/><InterceptorclassName='org.apache.catalina.tribes.group.interceptors.TcpFailureDetector'/><InterceptorclassName='org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor'/></Channel>
<Valve className='org.apache.catalina.ha.tcp.ReplicationValve' filter=''/><Valve className='org.apache.catalina.ha.session.JvmRouteBinderValve'/><ClusterListener className='org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener'/><ClusterListener className='org.apache.catalina.ha.session.ClusterSessionListener'/></Cluster>

检查我的示例conf / server.xml文件(以供参考)

这里的大多数代码是样板代码。 只需复制并粘贴。 如果我们需要我们可以自定义。 例如,我们可以更改multicat地址和端口号。

<Manager className='org.apache.catalina.ha.session.DeltaManager'/>

在这里,Manager标签定义了增量管理器。 增量管理器意味着复制到所有实例。

<Channel className='org.apache.catalina.tribes.group.GroupChannel'>

Tomcat集群使用Apache Tribes通信框架。 该组通信框架负责动态成员资格(使用多播),使用单播(正常TCP连接)发送和接收会话增量信息。

<Membership className='org.apache.catalina.tribes.membership.McastService'address='228.0.0.4'port='45564'frequency='500'dropTime='3000'/>

这是成员资格定义。 这里的地址是多播地址。 我们可以选择D类地址范围(224.0.0.0至239.255.255.255)中的任何地址以及任何端口号。

每个tomcat都会以周期性( 频率 )间隔将心跳信号发送到多播地址。 加入了组播地址的所有其他tomcat,它们可以接收这些信号并将成员资格添加到群集。 如果热跳动信号不能从任一tomcat恢复某个特定间隔( dropTime ),则我们需要考虑tomcat失败。

注意:-

属于群集的所有tomcat实例应具有相同的多播地址和端口号。

<Sender className='org.apache.catalina.tribes.transport.ReplicationTransmitter'><Transport className='org.apache.catalina.tribes.transport.nio.PooledParallelSender'/></Sender>

在这里,发件人使用PooledParallelSender拥有池化连接以使用并发发送会话信息。 因此,它可以加快会话复制过程。

<Receiver className='org.apache.catalina.tribes.transport.nio.NioReceiver'address='auto'port='4000'autoBind='100'selectorTimeout='5000'maxThreads='6'/>

在这里,我们定义了Receiver可以绑定并用于接收会话复制信息的端口。 这里有两个属性很重要。 地址和端口。 这里的地址是您的系统IP地址,端口是任何未使用的端口。 在这里address ='auto'会自动选择系统IP地址。

我们有一些拦截器。

TcpFailureDetector-确保实例已死。 在某些情况下,多播消息被延迟,所有的tomcat实例都认为tomcat已死。 但是此拦截器使tcp单播到失败的tomcat,并确保实例实际上是否失败

另一个重要的侦听器是JvmRouteSessionIDBinderListener,我们将在后面讨论。

3.启用可分发的Web应用程序

我们需要使我们的Web应用程序可分发。 它在web.xml文件中的简单添加<distributable />标签。 根据servlet规范web.xml中的<distributable />标签,提到了考虑此应用程序的任何容器都可以在分布式环境中工作。

注意:

Web应用程序中的所有会话都必须可序列化。

对所有tomcat实例执行以下步骤,然后启动tomcat和httpd服务器。 在我的github存储库中检查我的配置或获取ZIP

这是我的配置。 所有3个tomcat实例都在增量管理器中配置,并且我部署了分布式Web应用程序。 所有tomcat都使用多播来维护成员资格。

现在,客户端发出请求并首先执行tomcat流程并创建会话,然后如下所示

然后,tomcat 1负责使用Apache部落组通信框架将会话复制到所有实例。

现在,所有tomcat实例都具有会话的确切副本。 因此,如果tomcat 1崩溃或关闭,那么其他任何tomcat仍然可以处理请求[请参见下面的视频]

我们像以前的文章一样使用会话亲和力。 基于该cookie id包含tomcat名称(工作人员名称)。 因此,当第一个tomcat1返回会话ID时,以tomcat1结尾。 但是当tomcat 1失败并且tomcat 2负责所有进一步的请求时。 但是会话ID仍包含tomcat1。 因此它使负载均衡器变得困难。 因为tomcat1已关闭。 然后负载均衡器选择其他任何tomcat。 但实际上tomcat2负责。 因此我们需要在会话ID中反映这些更改。

发生故障时,JvmRouteSessionIDBinderListener会将客户端会话ID更改为tomcat2,因此负载均衡器重定向到tomcat2,而不会造成混乱。

检查git hub中是否有所有配置文件,并且可以使用tomcat群集设置。 或者你可以下载为ZIP

相关链接:

  • Apache Tomcat群集文档

屏幕投射:

http://www.youtube.com/watch?feature=player_embedded&v=cYBdaeNeXbY

参考: Tomcat群集系列第3部分:来自Ramki Java Blog博客的JCG合作伙伴 Rama Krishnan的会话复制 。

翻译自: https://www.javacodegeeks.com/2012/11/tomcat-clustering-series-part-3-session-replication.html

Tomcat群集系列第3部分:会话复制相关推荐

  1. tomcat 8 群集_Tomcat群集系列第3部分:会话复制

    tomcat 8 群集 这是Tomcat群集系列的第三部分. 在本文中,我们将讨论如何在tomcat集群环境中设置会话复制. 会话复制使群集环境具有高可用性和完整的故障转移功能. [查看下面的视频以获 ...

  2. payara 创建 集群_高可用性(HA),会话复制,多VM Payara群集

    payara 创建 集群 抽象 在研究如何创建高可用性(HA)时,我发现了会话复制,多机处理的Payara / GlassFish群集,无法在单个参考中找到所需的一切. 我认为这将是一个普遍的需求并且 ...

  3. 高可用性(HA),会话复制,多VM Payara群集

    抽象 在研究如何创建高可用性(HA)时,我发现了会话复制的多机Payara / GlassFish群集,无法在一个参考中找到所需的一切. 我认为这将是一个普遍的需求并且很容易找到. 不幸的是,我的假设 ...

  4. Tomcat原理系列之四:Tomat如何启动spring(加载web.xml)

    Tomcat原理系列之四:Tomat如何启动spring 熟悉的web.xml ContextLoaderListener Tomcat的初始化StandardContext.startInterna ...

  5. 47.nginx+tomcat群集

    nginx+tomcat群集 Tomcat服务是一个免费的开源web应用服务,属于轻量级应用服务器,一般用于中小型网络,tomcat通常作为一个Servlet和JSP容器单独运行在后端. 环境部署:一 ...

  6. 四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列

    转载自   四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列 俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节 ...

  7. 补习系列(15)-springboot 分布式会话原理

    目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope ...

  8. Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享

    ### keepalived配置 ### nginx安装培训 - 安装nginx ``` cpp yum install nginx -y ``` - 调整nginx配置文件 ``` cpp [roo ...

  9. centos下搭建nginx+tomcat实现集群负载与session复制

    第一章 测试环境说明 1.1 系统说明 系统均选用最小化安装的centos 5.7 1.2 软件说明 nginx-0.8.55 pcre-8.13 apache-tomcat-6.0.35  jdk- ...

最新文章

  1. shell实例第15讲:俄罗斯方块游戏
  2. Solr相似度算法一:Lucene TF-IDF 相关性算分公式
  3. 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】
  4. restful java客户端_如何在Java客户端调用RESTful服务
  5. android subString
  6. 图像类似度測量与模板匹配总结
  7. 国内大厂在移动端跨平台的框架接入分析
  8. Swift开发之简单计算器项目
  9. 使用腾讯云短信SDK发送验证码
  10. Andriod 对号错号
  11. Moebius for SQL Server
  12. Cesium 源码解析 Model(二)
  13. 用SDK包开发K66FX18学习笔记(2)
  14. 使用Android SwipeRefreshLayout了解Android的嵌套滑动机制
  15. Palindromic Tree——回文树(回文自动机)
  16. [分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享
  17. 请移驾ray7hu.com
  18. zoj 1010 Area【线段相交问题】
  19. 如何在CSDN中分享自己写的代码
  20. java.lang.AbstractMethodError: org.apache.tomcat.websocket.server.WsSessionListener.sessionCreated(L

热门文章

  1. jQuery取消绑定事件
  2. javascript的Promis对象
  3. 电商产品的购物车,这些细节你注意了吗?
  4. Ubuntu文件系统根目录磁盘空间不足
  5. 只需百行代码,Python带你玩转汉服圈
  6. python下载找不到路径_python安装后的目录在哪里
  7. 橱柜也可以这样美!!
  8. 2020 Java工程师面试题汇总
  9. SpringBoot使用SpringSecurity,使用oauth2登录,使用自定义/uaa/oauth/token报错解决
  10. js对数值取整数和小数的方法总结