聊聊分布式应用中负载均衡技术和Session一致性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J080624/article/details/86508119

【1】负载均衡技术

F5 HAProxy LVS Nginx/Apache
硬件设备
功能十分强大
工作在第四/七层
Session保持
并发处理极佳
负载均衡算法多
工作第四层
工作稳定
应用范围广
配置简单
不能做动静分离
安装配置简单
占有内存少
并发处理能力强3W+ 优化下10W+
功能强大 动静分离 反向代理 Lua
工作在第七层(支持的应用少)
不能保持session

F5主要功能

不仅包含负载均衡还包括应用交换、会话交换、状态监控、智能网络地址转换、通用持续性、响应错误处理、IPv6网关、高级路由、智能端口镜像、SSL加速、智能HTTP压缩、TCP优化、第7层速率整形、内容缓冲、内容转换、连接加速、高速缓存、Cookie加密、选择性内容加密、应用攻击过滤、拒绝服务(DoS)攻击和SYN Flood保护、防火墙过滤等功能

OSI网络七层模型
在这里插入图片描述

常见的负载均衡算法

  • 轮询(加权轮询):平均分配;加权轮询如权重大的轮询两次;
  • 随机算法(加权随机):随机分发请求,但是从概率上而言访问基数足够大的情况下,基本等同轮询。
  • 最小连接数:在多个服务器中,与处理连接数(会话数)最少的服务器进行通信的算法。
  • IP哈希算法:根据客户端IP,哈希取模,得到的结果便是要访问的服务器的序号。
  • URL散列:同一URL发往同一服务器。

【2】负载均衡下session不一致情况

如下图所示:
在这里插入图片描述

如果解决负载均衡下session不一致情况呢?
在这里插入图片描述
① 粘纸session–负载均衡算法使用IP哈希,这样同一个IP恒定访问某个服务器。
在这里插入图片描述
IPHASH另外一个有点是不需要session序列化!

② Session复制

在这里插入图片描述

Tomcat自带集群时Tomcat之间Session同步:

 <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="auto"
                      port="4000"
                      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.MessageDispatchInterceptor"/>
          </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.ClusterSessionListener"/>
        </Cluster>

参考Tomcat官网:http://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html

③ Redis/Memcached实现Session共享
在这里插入图片描述

扫描二维码关注公众号,回复: 4948812 查看本文章

pom文件中引入spring-boot-starter-redis和sping-session-data-redis,对redis进行常规配置然后在主程序上使用注解@EnableRedisHttpSession

猜你喜欢

转载自blog.csdn.net/J080624/article/details/86508119
今日推荐