使用ALB的粘性连接功能

一、准备环境

创建两个EC2,使用如下Userdata完成开机。

#! /bin/bash
yum install httpd -y
systemctl start httpd
systemctl enable httpd
echo "<h1>Server A</h1>" > /var/www/html/index.html
yum update -y

请修改以上userdata的文字信息分别为A和B两台。于是两个WEB服务器配置完成。

二、启用ALB粘性连接

创建一个ALB负载均衡器,添加2个EC2到Target Group中。

创建完毕后,进入Target Group(目标组)的配置界面中,点击目标组,点击详情标签页,将页面向下滚动,在健康检查的下方可以到找到属性部分,其中可以找到粘性连接。编辑这一组设置,启用粘性连接,为了测试方便,我们设置粘性为60秒。保存窗口完成配置。

三、使用浏览器测试

ALB的粘性连接是依赖ALB自己生成的Cookie的。访问ALB的Endpoint入口,即可打开网页,显示Server A或者Server B。

此时,使用Chrome浏览器,按下F12进入调试模式,点击Application标签页,在左侧的Storage菜单下可以看到Cookie,其中即可看到ELB生成的Cookie。此时,不断使用Ctrl+F5(Windows)或 Command+R(MacOS)刷新浏览器,只要没有超过粘性连接的60秒,访问会始终定向到同一个EC2上。

如果希望将访问请求重定向到另外一个EC2,只要对刚才F12调试窗口内的cookie按鼠标右键,在弹出菜单中选择删除就可以了。此时刷新页面,流量会立刻重定向到另外一个节点。

由此实验可以看到,粘性连接的关键就是ALB自己生成的Cookie。

四、使用curl测试

在某些测试场景下,可能无法使用浏览器发起,而是程序接口发起请求,那么我们可以使用curl工具来验证ALB的粘性连接。使用如下命令直接访问ALB。

curl http://ALB-endpoint

此时多次执行curl,可以看到访问一会获得Server A,再次刷新一般会获得Server B,或者连续刷新多次,会在A和B之间跳跃,由此完全没有看到粘性连接的效果。

这是因为curl模式不启用cookie造成的。为此,需要调整测试方法如下:

curl -c cookiefile http://ALB-endpoint

执行以上命令后,curl返回结果是Server A。此时,在当前目录下,还生成了一个文本文件就是cookie。可以使用cat命令显示cookie的内容。当再次发起访问时候,如果带有相同的cookie,流量就会自动粘性连接到A,如果没有加载上一次访问的cookie,则流量会被视为一次全新访问,再进行一次随机流量分配。

执行以下命令加载上一次访问生成的cookie去请求ALB以验证粘性连接的效果,

curl -b cookiefile http://ALB-endpoint

执行后,此命令将返回Server A,和第一次生成cookie的时候是同一个EC2。

当粘性连接的时间(本文配置为60秒)超出之后,连接就会重新分配。

至此,使用curl访问并测试ALB粘性连接完成。

五、参考资料

ALB的粘性连接设置。

https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/application/load-balancer-target-groups.html#sticky-sessions

完。