美文网首页
分布式session共享解决方案

分布式session共享解决方案

作者: 守住阳光 | 来源:发表于2018-11-14 16:21 被阅读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

    相关文章

      网友评论

          本文标题:分布式session共享解决方案

          本文链接:https://www.haomeiwen.com/subject/ttjjfqtx.html