分布式session共享解决方案

2018-11-14  本文已影响0人  守住阳光

        在一般的互联网服务中会采用如下图的服务部署架构。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

上一篇下一篇

猜你喜欢

热点阅读