在我的AWS账户中,我目前有一个网络负载均衡器(TCP(,指向2个可用区(Web服务器(上的两个Ec2实例,每个实例都有一个tomcat正在运行,这指向一个Ec2实例,它是应用程序服务器/数据库。
在 NLB 上,启用了粘性会话,因此当我在单个选项卡上从 Chrome 访问网络服务器时,一切正常,我的所有用户流量都发送到单个网络服务器。当我打开一个新选项卡时,似乎启动了一个新会话,我的用户流量可以发送到网络服务器 1 或网络服务器 2。如果将其发送到另一个 Web 服务器,系统会要求我再次登录。目标是通过一个 Web 服务器路由用户的所有流量。
有谁知道为什么 AWS 网络负载均衡器上的粘性会话无法按预期工作?或者我误解了它。
摘自 Elastic Load Balancing 的工作原理:
使用网络负载均衡器时,接收连接的负载均衡器节点使用以下过程:
使用流哈希算法从默认规则的目标组中选择一个目标。它基于以下算法:
- 协议
- 源 IP 地址和源端口
- 目标 IP 地址和目标端口
- TCP 序列号
在连接的生命周期内将每个单独的 TCP 连接路由到单个目标。来自客户端的 TCP 连接具有不同的源端口和序列号,并且可以路由到不同的目标。
我怀疑,当您打开另一个选项卡时,它可能正在从其他端口发送流量,从而导致粘性失败。坦率地说,我不确定粘性在第 4 层中如何工作,因为它无法使用 cookie 来记住粘性。它当然没有"用户"的概念,因为第 4 层不能使用 cookie,因此无法再次识别用户。
只要您没有为侦听器设置 TLS,NLB 的粘滞就应该可以工作。
https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#sticky-sessions
请注意,负载平衡基于简单的 IP 地址路由工作。因此,如果您的客户端都位于相同的地址块(即NAT路由(后面,那么这将导致不平衡。