SLB会话保持

本次最佳实践将为您介绍在不同的协议中阿里云均衡负载如何开启会话保持的机制。会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求都会分配到一台机器上。

负载均衡概述

负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。

负载均衡通过设置虚拟服务地址,将添加的同一地域的多台ECS实例虚拟成一个高性能、高可用的后端服务池,并根据转发规则,将来自客户端的请求分发给后端服务器池中的ECS实例。

负载均衡默认检查云服务器池中的ECS实例的健康状态,自动隔离异常状态的ECS实例,消除了单台ECS实例的单点故障,提高了应用的整体服务能力。此外,负载均衡还具备抗DDoS攻击的能力,增强了应用服务的防护能力。

负载均衡由以下三个部分组成:

  • 负载均衡实例(Server Load Balancer instances)

    一个负载均衡实例是一个运行的负载均衡服务,用来接收流量并将其分配给后端服务器。要使用负载均衡服务,您必须创建一个负载均衡实例,并至少添加一个监听和两台ECS实例。

  • 监听(Listeners)

    监听用来检查客户端请求并将请求转发给后端服务器。监听也会对后端服务器进行健康检查。

  • 后端服务器(Backend Servers)

    一组接收前端请求的ECS实例。您可以单独添加ECS实例到后端服务器池,也可以通过虚拟服务器组或主备服务器组来批量添加和管理。

TCP协议会话保持

TCP协议是基于IP地址的会话保持的,即来自同一IP地址的访问请求会转发到同一台后端服务器上。

源地址会话保持机制是一种非常简单但又十分高效的会话保持机制。但是,正是这种简单,又造成负载均衡无法很准确的识别客户端,造成后端服务器负载分配不均匀。比如是当大量的客户端使用相同代理或者使用同一个NAT地址访问服务器资源时,会造成某台服务器的负载分配过高的情况。

操作步骤:

  1. 登录ASCM控制台。

  2. 在顶部导航栏单击产品 > 网络 > 均衡负载SLB

  3. 在左侧导航栏中单击实例 > 实例管理

  4. 找到目标实例,单击操作栏中的监听配置向导

  5. TCP页签下单击高级配置后的修改。

  6. 开启会话保持并设置会话保持超时时间开启会话保持

HTTP/HTTPS协议会话保持

HTTP协议会话保持基于Cookie。负载均衡提供了两种Cookie处理方式:植入Cookie和重写Cookie。

和基于IP地址的会话保持来说,基于Cookie会话保持能够更加精准的识别客户端,避免了大量客户端共享同一个NAT地址访问服务器资源时,源地址会话保持造成的单台服务器负载过高的问题。但是会有更多的限制,第一是基于Cookie会话保持必须是HTTP/HTTPS协议,第二是客户端需要支持Cookie即客户端收到Set-Cookie后下次访问时带指定Cookie来访问服务端,如果不支持则配置后会话保持无法生效。

  • 植入Cookie

    配置植入Cookie时只需要指定Cookie的过期时间。客户端第一次访问时,负载均衡会在返回请求中植入Cookie(即在HTTP/HTTPS响应报文中插入SERVERID),下次客户端携带此Cookie访问,负载均衡服务会将请求定向转发给之前记录到的后端服务器上,流程如下:结构图植入Cookie优点是服务器应用无需关心会话保持,会话保持的所有工作由SLB完成。

  • 重写Cookie

    可以根据需要指定HTTPS/HTTP响应中插入的Cookie。您需要在后端服务器上维护该Cookie的过期时间和生存时间。负载均衡服务发现用户自定义了Cookie,将会对原来的Cookie进行重写,下次客户端携带新的Cookie访问,负载均衡服务会将请求定向转发给之前记录到的后端服务器,流程如下:架构图重写Cookie缺点是需要应用进行改造和SLB产品配合,优点也很明显Cookie的生命周期由应用维护,会话保持更加的灵活,比如一个电商网站,用户没有登录前不需要开启会话保持,登录成功后才开启会话保持,用户注销后又无需会话保持。

    操作步骤:

    1. 登录ASCM控制台。

    2. 在顶部导航栏单击产品 > 网络 > 均衡负载SLB

    3. 在左侧导航栏中单击实例 > 实例管理

    4. 找到目标实例,单击操作栏中的监听配置向导

    5. HTTPHTTPS页签下单击高级配置后的修改。

    6. 开启会话保持Cookie处理方式选择重写CookieCookie名称填写name重写cookie

    用户登录成功或登录成功后进行操作应用设置Cookie值超时时间为1小时,代码如下:

    Cookie cookie=new Cookie(name:"name",value:"");
    cookie.setMaxAge(3600);
    cookie.setPath("/");
    response.addCookie(cookie);

    用户注销后删除Cookie方法,代码如下:

    Cookie cookie=new Cookie(name:"name",value:"");
    cookie.setMaxAge(0);
    cookie.setPath("/");
    response.addCookie(cookie);