负载均衡-Session处理策略

来源:互联网 发布:got7直播软件 编辑:程序博客网 时间:2024/06/06 03:09

问题描述

先来了解一下Session是什么

Session在计算机中,被称为"会话控制".Session对象储存特定用户回话所需的属性及配置信息.这样,当用户在应用程序的web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户的会话中一种存在下去.

问题深入

在Tomcat中,Session实际上就是我们在内存中的一段空间.当我们的用户要在服务器上存储一个信息的时候,tomcat会在自己本机的内存空间里开辟一个位置来存储这个信息.多个用户构成一个集合,所以的都是在tomcat自己的内存空间里的,所以说只是存在本机的空间里的.

这里写图片描述

那么在负载均衡的情况下,如上图,如果用户之前访问被分配到tomcat1,这个时候存储在Session中一个值,而后第二次访问被分配到tomcat2这种情况下,按照我们之前的考虑思路,肯定是获取不到相应的Session信息.这就是我们在分布式的负载均衡的情况下Session存在的问题.

通常情况下有3种策略

类似于ip_hash的用户锁定的方式(不容错的方案)

将用户锁定到某一台机器上,比如说把同一个用户的请求锁定到tomcat1上,那么这个用户只能访问tomcat1,那么他的第二次,第三次,第n次访问的都是同一个tomcat,就不会出现之前所说的问题.这种处理方式简单,但是缺乏容错性,如果因为某种原因该台机器挂掉,那么后续的请求转发到其他服务器上,那么用户的session状态就会丢失,就会感知到错误的发生.比如说他突然发现自己本来的登录状态成了未登录状态.缺点虽说是这个样子,是可以接受的.因为它的发生几率还是极低的,考虑到具体的应用场景来说,在某些方面是可以应用的.说它的发生概率低是因为一个正常运行的集群系统,如果说经常会发生服务器挂掉,要么就是你的硬件出了问题,要么就是你的应用出了问题;再者就是要考虑当放生错误的额时候,对用户的业务产生多大的影响.

Session复制(有容错功能的方案)

在集群环境中,当其任何一台服务器上的Session状态或者信息发生改变的时候,在这种情况出现的时候,它会向整个网络里发送广播,通知它的Session改变事件,其他的服务器有接受广播的功能,在接收到消息之后,会将Session进行对应的改变,达到同步的目的.它的优点显而易见,除了容错性之外,还有就是Session同步的功能.但是缺点也挺明显,首先它发送的是网络广播,一台服务器Session的改变就要发送广播,其他的都要发生改变,会对网络造成特别大的压力.尤其是当你集群中的服务器特别多,tomcat特别多,在就是Session的数据量特别大的时候,像这种大批量的网络复制会极大地消耗后端性能,甚至造成网络的阻塞或者瘫痪.所以说该种方案最大的缺陷就是性能的低下甚至会造成一些列的故障.

Sessionfuzhi的实现:

 在tomcat中的server.xml文档中(最后一个connector里的engine模块里,有注释提示)<!-- 基于网络广播的策略,一个节点session变换,其他节点同步复制,节点多或者数据量大时功能性能低下-->    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">        <!--网络通道对象-->        <Channel className="org.apache.catalina.tribes.group.GroupChannel">            <!--接收器对象-->            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto"                port="4000"/>        </Channel>    </Cluster>

在tomcat7以后,server.xml取消Cluster这行注释之后表示tomcat开启了集群功能.tomcat的集群功能配备了发送器,接收器,内容转换器,还有各种监听借口,事件显示器等一系列功能.以上是在tomcat中的要进行修改的,对应的在开发的应用中要在web.xml中添加这么一条配置选项,位置如下图.添加完这两项配置后,这个应用就有了session复制的功能了.

这里写图片描述
补充:
需要说明的是,因为在一台服务器上可能不止有一个tomcat,在配置参数的时候,不要使用默认参数,要自行进行手动配置.首先要考虑的就是端口冲突问题.比如上方的示例,如果一台服务器上有两个tomcat,默认指定不同端口.地址也是一样,因为开启该项功能,如果设置的是auto,会自动选择,如果选择错了,那么也就不能进行.通常服务器有两个网卡,一个是内网网卡,一个是外网的,我们的接收器是绑定在内网上的.因为我们的服务器集群是在内网的,所以接收器自然绑定的是内网的网卡,如果绑错了就会接收不到消息.

原创粉丝点击