分布式session共享解决方案
在一般的互联网服务中会采用如下图的服务部署架构。ngnix 作为反向代理和负载均衡服务器,将客户端的请求转发给一组服务节点,达到减轻后端服务压力的作用。但是在这样的部署架构中,必须解决分布式session共享问题,否则会出现,用户登录系统,然后进行某一操作,由于session没有在节点中共享,用户自动登出的问题。
服务部署架构针对session分布式共享,现在有三种解决方案可供使用。
一、粘性session
利用nginx自身提供的轮询策略实现。即将nginx的负载均衡策略设置为ip_hash。
ip_hash负载均衡策略是nginx将访问的客户端的 ip 地址进行hash计算后,将其分配到后端的某个服务节点。当客户端再次请求时,nginx会将请求转发给原来的服务节点。
1、优点
实现简单,对应用无侵入性,无额外开销。
2、缺点
一旦某个web服务器重启或宕机,相对应的session的数据将会丢失,且其对nginx负载均衡的能力进行了弱化。
二、服务器session复制
在支持session复制的web服务器上,通过配置,可以实现将session同步到其他web服务器上,达到每个web服务器上都保存一致的session的目的。
1、优点
对应用无侵入性,重启或宕机不会造成session的丢失。
2、缺点
需要依赖支持session复制的web服务器,在数据量很大的情况下不仅占用网络资源,而且会导致延迟。只适用于web服务器比较少且session数据量少的情况。
3、实现步骤
1、在应用的web.xml上加上<distributable />
2、在tomcat的server.xml配置文件上打开 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"
bind="127.0.0.1" address="228.0.0.4" <!--保留ip,用于广播-->port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto"port="4001"
<!--如果是在同一台机器上的两个tomcat做负载,则此端口则不能重复-->
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>
3、重启tomcat服务即可。
三、session共享机制
使用缓存技术,集中管理所有的session,所有的web服务器都从这个存储介质中存取对应的session,实现session共享。
1、优点
可靠性高,减少了web服务器的资源消耗,服务器重启或宕机不会造成session的丢失。
2、缺点
实现上有些复杂,配置较多,增加了一次从存储介质中获取session数据的开销。
适用于web服务器较多,要求高可用的情况。
3、实现步骤
具体步骤可以参考文章:https://blog.csdn.net/hua1586981/article/details/78132710