这是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文件中添加
在这里org.apache.catalina.session.StandardManager是标准管理器的完全限定的类名。
恒久经理
该管理器将在一段时间后将会话信息存储到持久位置。 这里有两种类型的商店。
- 文件存储
- JDBC存储
文件存储有助于将所有会话信息存储在基础文件系统(本地HDD或共享文件系统,例如NFS等)的单独文件中。
JDBC Store帮助将会话信息存储到关系数据库。
因此,使用Persistent Manager,我们可以实现tomcat集群。 但它不是实时交换的。 它在一定时间间隔后推送信息。 因此,如果在该时间间隔之前发生了任何严重的事件(崩溃),则内存中的会话数据将消失。
三角洲经理
在这篇文章中,我们将使用该管理器。 它会将会话复制到所有其他实例。 因此,该经理通常使用集群环境。 但不适用于大型集群。
备份管理器
该管理器通常使用集群环境。 它像三角洲马槽。 但它将完全复制到另一个实例(备份实例)。 它的作用就像一个实例是Primary,另一个实例是Backup一样。
在Tomcat群集中进行会话复制的步骤
在这里,我将从上次会话亲和性职位中我刚离开的地方继续。 因此,请检查该帖子并确保正确设置了jumRoute。 所以步骤是
- 启用多播路由
- 在conf / server.xml文件中为所有实例添加
条目。 - 启用可分发的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文件中为所有实例添加
这对于tomcat集群非常重要。 在所有tomcat实例中,我们需要在conf / server.xml文件中添加
我们可以在
这里的SimpleTcpCluster是Tomcat Cluster的实现
这个标签看起来很简单,但是里面有很多标签。 如果我们省略,则采用默认值。 如果要进行任何定制(例如更改多猫地址,接收地址端口),则需要使用完整的
这是完整的
检查我的示例conf / server.xml文件(以供参考)
这里的大多数代码是样板代码。 只需复制并粘贴。 如果我们需要我们可以自定义。 例如,我们可以更改multicat地址和端口号。
在这里,Manager标签定义了增量管理器。 增量管理器意味着复制到所有实例。
Tomcat集群使用Apache Tribes通信框架。 该组通信框架负责动态成员资格(使用多播),使用单播(正常TCP连接)发送和接收会话增量信息。
这是成员资格定义。 这里的地址是多播地址。 我们可以选择D类地址范围(224.0.0.0至239.255.255.255)中的任何地址以及任何端口号。
每个tomcat都会以周期性( 频率 )间隔将心跳信号发送到多播地址。 加入了组播地址的所有其他tomcat,它们可以接收这些信号并将成员资格添加到群集。 如果热跳动信号不能从任一tomcat恢复某个特定间隔( dropTime ),则我们需要考虑tomcat失败。
注意:-
属于群集的所有tomcat实例应具有相同的多播地址和端口号。
在这里,发件人使用PooledParallelSender拥有池化连接以使用并发发送会话信息。 因此,它可以加快会话复制过程。
在这里,我们定义了Receiver可以绑定并用于接收会话复制信息的端口。 这里有两个属性很重要。 地址和端口。 这里的地址是您的系统IP地址,端口是任何未使用的端口。 在这里address ='auto'会自动选择系统IP地址。
我们有一些拦截器。
TcpFailureDetector-确保实例已死。 在某些情况下,多播消息被延迟,所有的tomcat实例都认为tomcat已死。 但是此拦截器使tcp单播到失败的tomcat,并确保实例实际上是否失败
另一个重要的侦听器是JvmRouteSessionIDBinderListener,我们将在后面讨论。
3.启用可分发的Web应用程序
我们需要使我们的Web应用程序可分发。 它在web.xml文件中的简单添加
注意:
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