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.102-确认发送 4-同步发送 8-异步发送10-在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性2.manager决定如何管理集群的session信息
className-指定实现org.apache.catalina.ha.ClusterManager接口的类,用于信息之间的管理.expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有Session失落效notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否关照session listeners3.Channel是Tomcat节点之间进行通讯的工具。
Channel包括5个组件:Membership、Receiver、Sender、Transport、Interceptor4.Membership掩护集群的可用节点列表。用于检测新增节点及掉线节点
address-组播地址(任意定义组播地址),如果须要阿里云ECS支配tomcat,由于ECS不支持组播,建议改用memcache或redis存储session实现会话保持port-组播端口 (两个tomcat组播端口要同等)frequency-发送心跳(向组播地址发送UDP数据包)的韶光间隔(单位:ms)。默认值为500dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点列表删除。默认值为30005.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包。