Sticky Session - 粘性会话

默认情况下,ALB会将请求根据默认的路由算法(例如round robin)转发到后端。可以设置粘性会话(sticky session),让LB把用户会话和特定后端绑定,这一般适用于有状态的应用,比如服务器上存储了客户端的特定信息。实现的原理是——ALB记录用户的cookie,然后根据cookie转发到特定的后端。

image-20220927205856894

上图中,开启粘性会话后同一个客户端的请求会被路由到特定的服务器上——例如Client 1的两次请求全被转发到第一个EC2上

ALB支持两种类型的cookie:duration-based cookiesapplication-based cookies,并且在target group级别开启

  • 如果你的应用设置了cookie,那么可以直接使用它来设置粘性会话,此时粘性会话的生命周期完全根据它来走,当应用的cookie过期后,粘性会话也过期;

  • 如果应用没有设置cookie,则可以设置duration-based cookies,让ALB来生成一个cookie,然后生存时间由你来指定。

每当有新请求进来时,ALB都会重置两种类型cookie的生存时间

Sticky Session测试

本节我们将测试粘性会话的特性,我们将进行以下步骤:

  1. 创建三个web服务器,它们上面分别输出不同的信息(根据私网IP做区分)
  2. 创建一个ALB,这个ALB将请求转发到这三台服务器上。
  3. 开启粘性会话前,由于ALB使用round robin算法,用户不断刷新页面会看到不同的内容
  4. 开启粘性会话后,用户只能看到特定的内容

创建三台Web服务器

在EC2页面进入创建Instance。实例的数量更改成3

image-20220927211519253

安全组的设置:放通0.0.0.0/0网段对80端口的访问。

其他的选项保持默认即可,在最后的高级设置部分,使用User data让EC2安装httpd服务,并将自己的hostname写到index.html:

image-20220927220506748

#!/bin/bash
# Use this for your user data (script without newlines)
# Installs httpd (Linux 2 version)
yum update -y
yum install -y httpd.x86_64
systemctl start httpd
systemctl enable httpd
echo "Hello World from $(hostname -f)" > /var/www/html/index.html

点击创建。

创建target group

创建一个新的Target group,选择Instance类型:

image-20220927220651511

输入Target group的名称:

image-20220927220709095

注册刚才创建的三台Web服务器:

image-20220927220751504

最后点击创建。

创建ALB

在ALB的页面点击创建,输入名称:

image-20220927220615030

Listener部分,选择上一步创建的Target group

image-20220927220839944

点击创建,等待一段时间至ALB完成。

Sticky session测试

默认ALB没有开启粘性会话,此时刷新ALB会访问到不同的结果:

image-20220927222408673

image-20220928191744501

target group页面开启粘性会话:

image-20220928191857920

此时有两个选项Load balancer generated cookieApplication-based cookie,在上面我们讲过它们的区别,如果使用Application based cookie要输入具体的字段名称:

image-20220928191952610

这里我们使用Load balancer generated cookie即可,然后点击Save changes

image-20220928192003837

然后不断刷新浏览器,此时会固定访问到一个页面。

在浏览器抓包,从访问请求里能看到多了AWSALB cookie字段,ALB基于它来实现粘性会话:

image-20220928192101026