会话保持常见问题

更新时间:2017-06-08 19:22:17

Q:会话保持的作用是什么?

将同一客户端的会话请求转发给指定的一个后端服务器处理。

Q:会话保持如何开启?

在您进行负载均衡服务监听配置时就可以选择是否开启会话保持。您可以针对不同的监听配置不同的会话保持策略。会话保持的最长时间是86400秒(24小时)。

1

Q:负载均衡支持什么类型的会话保持?

  • 四层(TCP/UDP协议)服务,负载均衡系统是基于源IP+端口的会话保持。

  • 七层(HTTP/HTTPS协议)服务,负载均衡系统是基于cookie的会话保持。

Q:是否支持针对不同的域名配置不同的会话保持规则?

支持。

您可以通过负载均衡系统提供的重写cookie的会话保持方式来实现这一需求。

HTTP/HTTPS监听可使用植入cookie和重写cookie来进行会话保持。

  • 植入cookie是指由负载均衡服务器来给客户端设置cookie,即HTTP/HTTPS响应报文中插入SERVERID字串和客户配置时指定的超时时间,在此时间内会将同一客户端的请求传入到同一个后端ECS服务器。当客户端浏览器再次用cookie访问时,负载均衡不会传给后端服务器,即插入cookie关键字与值,对后端ECS来说是完全不需要知道的。

  • 重写cookie是指您可以按照自己的需要在后端ECS的HTTP/HTTPS响应中插入cookie关键字与值,后端ECS需要同时维护此cookie的超时时间与生存时间。在此响应报文经过负载均衡时,负载均衡会基于一定规则重写cookie的值字串用于会话保持,当接收到携带cookie关键字与值的请求时,会将此cookie关键字与值传入到初始插入cookie的后端ECS,但cookie值的内容已经与初始相比已经改变。

  • 植入cookie可在控制台上配置1~86400秒。

    2

  • 重写cookie需要您在后端ECS上维护超时时间。

Q:如何分析会话保持字串?

可以在浏览器中用F12查看回应报文中是否含有SERVERID字串或用户指定的关键字,或者运行curl www.xxx.com -c /tmp/cookie123 保存一下 cookie,再用 curl www.xxx.com -b /tmp/cookie123 访问。

Q:为什么有时候会话保持失败?

  • 查看是否在监听配置中已经开启了会话保持功能。

  • HTTP/HTTPS监听在后端服务器返回 4xx 响应码的报文中无法插入会话保持所需cookie。

    解决方法:改用TCP监听,因为TCP监听是以源客户端的IP+端口来做会话保持的,另外后端ECS上也可以插入cookie,并增加cookie的判断来多重保障。

  • 302重定向会改变会话保持中的SERVERID字串。

    负载均衡植入cookie时,如果后端ECS中有回复302重定向的报文,将改变会话保持中的SERVERID字串,导致会话保持失效;

    排查方法:在浏览器端捕抓请求与响应的回复,或用抓包软件抓包后分析是否存在302的响应报文,对比前后报文的cookie中的SERVERID字串是否不同了。

    解决方法:改用TCP监听,因为TCP监听是以源客户端的IP+端口来做会话保持的,另外后端ECS上也可以插入cookie,并增加cookie的判断来多重保障。

  • 会话保持时间设置过小,会话保持时间过小也会导致会话保持失败。

Q:如何使用Linux curl测试负载均衡会话保持?

  1. 创建测试页面。

    在负载均衡所有后端ECS中创建测试页面,如下图所示页面中能显示本机内网IP。内网IP用于判断相应请求被指派到的物理服务器。通过观察该IP的一致性,来判断负载均衡会话保持的有效性。

    8

  2. Linux下curl测试。

    假设负载均衡服务IP地址是 1.1.1.1,创建的测试页面URL为: http://1.1.1.1/check.jsp

    1. 登录用来测试的Linux服务器。

    2. 执行以下命令负载均衡服务器cookie值。

      curl -c test.cookie http://1.1.1.1/check.jsp

      说明:阿里云负载均衡会话保持默认模式是植入cookie,而curl测试默认是不会保存和发送cookie的。所以必须先保存相应的cookie,用于带cookie测试。否则,curl测试结果是随机的,会误认为负载均衡会话保持无效。

    3. 执行以下命令持续测试。

      for ((a=1;a<=30;a++)); 2="" do="" curl="" -b="" 1.cookie="" check.jsp="">/dev/null | grep '10.170.*';sleep 1; done`

      说明: a<=30是重复测试次数,可以按需修改;grep ‘10.170.*’ 是筛选显示的IP信息,根据后端ECS内网IP情况进行相应修改;

    4. 观察上述测试返回的IP,如果是同一台ECS内网IP,则证明负载均衡会话保持有效;反之则证明负载均衡会话保持有问题。