Azure sticky-session/sourceIP 负载平衡和实例探测

Azure sticky-session/sourceIP load balancing and instance probing

我们有一个实例集群 运行 作为 Azure 上的工作者角色。它们包含依赖状态的服务。用户通过 Socket.IO.

连接

我们需要 stickySession,以便客户端可以使用单个实例和 运行 上的服务。如果用户被重新路由到另一个实例,客户端就会中断。

我的问题:

LB 分发模式sourceIP 将允许粘性会话。但前提是平衡实例集不变(实例 added/removed)。当一个实例被探测到不健康时,集合是否会发生变化?这对当前用户意味着什么?他们会被重新路由吗?

什么是 "new user"? SourceIP 使用二元组散列。当探测器标记实例不健康时,我可以依赖坐在同一系统上的客户端未被标记为 "new" 吗?他们仍会被路由到那个实例吗?

最后。是否有任何确定且简单的方法来实现粘性会话?

短篇小说:

任何已经建立的流都会持续存在,除非目的地本身死亡;这仅与新流量有关。 Azure 负载均衡器不支持将所有流从 特定源固定到特定 VM 的能力,而不支持后端池的健康状态,也不支持什么 sourceIP 分配模式。如果那是您所需要的,您可以使用工具库中的另一个工具,或者您可以通过让每个节点到达实际保存状态的任何地方来解决这个问题。

阅读下面的长篇故事了解详情。

长话短说:

创建 Azure 负载均衡器函数时,SDN 堆栈使用协议 header 值来计算哈希。分发模式选择决定使用哪个协议 header 值来计算哈希值:

  • 五元组:源IP,源端口,目的IP,目的端口, 协议
  • 二元组:源IP,目的IP

二元组就是所谓的分配模式sourceIP。由于在评估时目标 IP 始终是 VIP 的 IP,因此只有源 IP 控制哈希。由于不考虑端口号,来自给定源 IP 地址的任何 session 都将产生相同的哈希。

哈希决定了新 session 的着陆点。 session 将在该目的地持续存在,直到流终止。

如果池因为节点变得健康或生病而发生变化,则哈希将发生变化并仅影响新流。

任何已经在进行的 session 都会保留在原处。你只是不能保证给定的源随着时间的推移总是会随着池的变化而最终到达相同的目的地。

这是一个例子:

假设您有一个场景,其中在 LB 配置后面的池中有 VM A、B、C。你打开sourceIP。

来自客户端 X 的第一个 session 进入,登陆 B。只要池保持不变(所有节点保持健康并且有问题的节点未治愈),任何额外的 session来自 X 的 s 也会落在 B 上。

当池因为节点将健康状态从健康变为病态或反之亦然而更改时,来自客户端 X 的新 session 可能会落在 B 以外的节点上。任何 session 已经在 B 上保持在 B.

当然除非 B 本身已经死了,在这种情况下,那些已建立的 sessions 将超时。