网站首页 > 技术教程 正文
什么是会话保持
会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。
Http协议是一种无状态协议,所以需要使用Session机制来保存用户的状态,比如登录状态、常用信息等。
Session用于保存一次会话的相关信息,可以实现在多个页面之间共享这些数据。
例如:你打开淘宝登录了个人账号,即使你浏览了再多的店铺宝贝,切换了很多的页面,用户名是不变的,这个就是Session起的作用。直到你关闭浏览器,Session被销毁,才会清除掉之前的登录记录。
今天和大家分享“Nginx+tomcat实现负载均衡的会话保持”就是实现:如果网站某个负载节点挂掉,请求被分配到新节点Session也会同步过来,实现会话保持,由此保证用户无感知的浏览。
实现原理
- 使用Manager对象实现HTTP会话管理
- DeltaManager作为会话管理器
- 用户访问nginx,nginx负载均衡到tomcat,用于Tomcat集群的会话管理器,将所有session会话的改变同步给集群中的每一个节点,实现会话复制。
实验配置
Nginx配置
测试环境单台服务器开了两个tomcat,一台对应8080端口,另一台对应8090端口。
创建TomcatA TomcatB,分别配置tomcat server.xml
复制以下内容到 Engine下
<Engine name="Catalina" defaultHost="localhost">
添加此模块:
<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"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.224.145" port="4001" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="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"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
备注:
1.classname配置tomcat集群在进行信息传递时互相使用什么类来进行传递
- channelsendoptions可以设置为2,4,8.10
- 2-确认发送 4-同步发送 8-异步发送
- 10-在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性
2.manager决定如何管理集群的session信息
- className-指定实现org.apache.catalina.ha.ClusterManager接口的类,用于信息之间的管理.
- expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失效
- notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知session listeners
3.Channel是Tomcat节点之间进行通讯的工具。
- Channel包括5个组件:Membership、Receiver、Sender、Transport、Interceptor
4.Membership维护集群的可用节点列表。用于检测新增节点及掉线节点
- address-组播地址(任意定义组播地址),如果需要阿里云ECS部署tomcat,因为ECS不支持组播,建议改用memcache或redis存储session实现会话保持
- port-组播端口 (两个tomcat组播端口要一致)
- frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500
- dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为3000
5.Receiver : 接收器
- address-接收消息的地址(默认auto,但是在虚拟机上开启tomcat会报错,建议配置本机IP地址)
- port-接收消息的端口(如果在一台服务器配置多个tomcat,需区分开端口)
- autoBind-端口的变化区间
如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听
- selectorTimeout-NioReceiver 轮询超时时间
- maxThreads-线程池的最大线程数
6.sender:发送器负责发送消息
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel>
7.Valve :过滤器
8.Deployer:同步集群下的所有节点的一致性
9.ClusterListener : 监听器,监听Cluster组件接收的消息,使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager
配置web.xml
在web.xml中添加属性,用于告诉web容器,该项目属于分布式项目
<distributable/> 添加标签到web项目WEB-INF目录
会话保持验证
webapps/ROOT/index.jsp 创建测试页面获取sessionID
tomcatA <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("TomcatA","TomcatA"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> tomcatB <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="red">TomcatB</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("TomcatB","TomcatB"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
浏览器访问验证
总结:
tomcat实现会话保持有多种实现方式,这里只介绍了Manager对象实现,优点是利用tomcat自身集群session复制实现会话保持配置方便,缺点是像阿里云ECS这种不支持组播就无法用这种方式实现了。也可以使用memcache或redis存储session会话,但这个要下载tomcat版本相对应的memcache jar包。
猜你喜欢
- 2024-10-13 minio分布式集群的搭建(minio分布式存储现在已弃用)
- 2024-10-13 Spring Cloud Alibaba——docker-compose搭建nacos1.4.0集群
- 2024-10-13 nginx负载均衡http flink集群端口配置的完整的nginx.conf文件
- 2024-10-13 Nginx负载均衡(nginx负载均衡有哪几种方式)
- 2024-10-13 Nacos集群搭建(nacos集群搭建打开网页提示未找到请求怎么回事)
- 2024-10-13 K8S云管理平台集群配置说明(k8s部署consul集群)
- 2024-10-13 一线开发大牛教你如何使用Kubernetes部署分布式集群
- 2024-10-13 Nginx、Keepalived高可用集群解决方案,安装配置
- 2024-10-13 集群部署看过来,低代码@AWS智能集群的架构与搭建方案
- 2024-10-13 基于Linux自己初步搭建Kubernetes(k8s)集群基础,详细教程
你 发表评论:
欢迎- 最近发表
-
- Oracle 在其新的 Linux 内核中引入了热补丁功能
- CentOS 7.6下安装Oracle 11.2.0.4
- ORACLE体系 - 2(oracle体系讲解)
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- Hadoop自学系列集(二) ---- CentOS下安装JDK
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 搭建Oracle数据库服务器(oracle服务器创建用户)
- OGG同步到Kafka(oggforbigdata到kafka)
- oracle是什么软件?(oracle是干什么用的)
- 脚本化修改Oracle用户的密码以及执行sql(增删改查等)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)