AWS 网络负载均衡器粘性会话不工作

AWS Network Load Balancer Sticky Sessions not working

在我的 AWS 账户中,我目前有一个网络负载均衡器 (TCP) 指向 2 个可用区(Web 服务器)上的两个 Ec2 实例,每个实例都有一个 tomcat 运行 ,这是指向到一个 Ec2 实例,即应用程序 server/database.

在 NLB 上,粘性会话已启用,因此当我在单个选项卡上从 Chrome 访问网络服务器时,一切正常,我的所有用户流量都发送到单个网络服务器。当我打开一个新标签时,似乎开始了一个新会话,我的用户流量可以发送到网络服务器 1 或网络服务器 2。如果它被发送到另一个网络服务器,我会被要求再次登录。目标是让用户的所有流量都通过一个网络服务器路由。

有谁知道为什么 AWS 网络负载均衡器上的粘性会话没有按预期工作?或者我误解了它。

来自How Elastic Load Balancing works

With Network Load Balancers, the load balancer node that receives the connection uses the following process:

Selects a target from the target group for the default rule using a flow hash algorithm. It bases the algorithm on:

  • The protocol
  • The source IP address and source port
  • The destination IP address and destination port
  • The TCP sequence number

Routes each individual TCP connection to a single target for the life of the connection. The TCP connections from a client have different source ports and sequence numbers, and can be routed to different targets.

怀疑,当您打开另一个选项卡时,它可能从另一个端口发送流量,导致粘性失败。坦率地说,我不确定粘性在第 4 层中如何工作,因为它不能使用 cookie 来记住粘性。它当然没有“用户”的概念,因为Layer 4不能使用cookies,所以没有办法再次识别用户。

只要您没有为侦听器设置 TLS,Sticky 与 NLB 就应该可以工作。

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

请注意,负载平衡基于简单的 IP 地址路由。因此,如果您的客户端都位于相同的地址块(即 NAT 路由)之后,那么这将导致不平衡。