默认情况下,ALB会将请求根据默认的路由算法(例如round robin)转发到后端。可以设置粘性会话(sticky session)
,让LB把用户会话和特定后端绑定,这一般适用于有状态的应用,比如服务器上存储了客户端的特定信息。实现的原理是——ALB记录用户的cookie,然后根据cookie转发到特定的后端。
上图中,开启粘性会话后同一个客户端的请求会被路由到特定的服务器上——例如Client 1
的两次请求全被转发到第一个EC2上
ALB支持两种类型的cookie:duration-based cookies
和application-based cookies
,并且在target group
级别开启
如果你的应用设置了cookie,那么可以直接使用它来设置粘性会话,此时粘性会话的生命周期完全根据它来走,当应用的cookie过期后,粘性会话也过期;
如果应用没有设置cookie,则可以设置duration-based cookies
,让ALB来生成一个cookie,然后生存时间由你来指定。
每当有新请求进来时,ALB都会重置两种类型cookie的生存时间
本节我们将测试粘性会话的特性,我们将进行以下步骤:
在EC2页面进入创建Instance。实例的数量更改成3
:
安全组的设置:放通0.0.0.0/0
网段对80端口的访问。
其他的选项保持默认即可,在最后的高级设置部分,使用User data
让EC2安装httpd服务,并将自己的hostname写到index.html
:
#!/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
,选择Instance
类型:
输入Target group的名称:
注册刚才创建的三台Web服务器:
最后点击创建。
在ALB的页面点击创建,输入名称:
Listener
部分,选择上一步创建的Target group
:
点击创建,等待一段时间至ALB完成。
默认ALB没有开启粘性会话,此时刷新ALB会访问到不同的结果:
在target group
页面开启粘性会话:
此时有两个选项Load balancer generated cookie
和Application-based cookie
,在上面我们讲过它们的区别,如果使用Application based cookie
要输入具体的字段名称:
这里我们使用Load balancer generated cookie
即可,然后点击Save changes
:
然后不断刷新浏览器,此时会固定访问到一个页面。
在浏览器抓包,从访问请求里能看到多了AWSALB
cookie字段,ALB基于它来实现粘性会话: