我们在Azure上有一个作为workerroles运行的实例集群。它们包含依赖于州的服务。用户通过Socket.IO连接。
我们需要stickySessions,以便客户端可以使用单个实例以及在其上运行的服务。如果用户被重新路由到另一个实例,则客户端会中断。
我的问题:
LB分发模式sourceIP将允许粘性会话。但只有平衡实例集不会更改(实例添加/删除)。当一个实例被探测为不健康时,该组是否会发生变化?这对当前用户意味着什么?它们会被重新布线吗?
什么是"新用户"无论如何? SourceIP使用2元组哈希。我可以依靠坐在同一系统上的客户没有被标记" new"探针标记一个不健康的实例?他们还会被路由到那个实例吗?
最后。有没有确定而简单的方法来实现粘性会话?
答案 0 :(得分:3)
任何已经建立的流程都将持续存在,除非目的地本身已经死亡;这只是关于新的流量。 Azure Load Balancer不支持将所有流从特定源固定到特定VM 的能力,而不管后端池的运行状况如何,而不支持sourceIP分发模式。如果这是你需要的,你可以使用武器库中的另一个工具,或者你可以通过让每个节点到达实际保存状态的任何地方来解决这个问题。
详细阅读下面的长篇故事。
创建Azure负载均衡器功能时,SDN堆栈使用协议标头值来计算哈希值。分发模式选择控制用于计算散列的协议标头值:
2元组是所谓的分发模式sourceIP。由于目标IP在评估时始终是VIP的目标IP,因此只有源IP控制散列。并且由于没有考虑端口号,因此来自给定源IP地址的任何会话都将产生相同的哈希。
哈希确定新会话所在的位置。会话将在该目标上持续存在,直到流程终止。
如果池因为节点变得健康或生病而发生更改,则哈希将更改并仅影响新流。
任何正在进行的会话都会保留在原地。您无法保证给定的源始终会随着更改池而在同一目的地结束。
以下是一个例子:
假设你有一个场景,你在LB配置后面的池中有VM的A,B,C。你打开sourceIP。
来自客户端X的第一个会话进入,登陆B.只要池保持不变(所有节点保持健康且病态节点未被修复),来自X的任何其他会话也将落在B上。
当游戏池因健康状况从健康状态变为病态状态或者反之亦然而发生变化时,来自客户端X的新会话可能会落在B以外的节点上.B上已有的任何会话都保留在B上。
除非B本身已经死亡,否则这些已建立的会议将会超时。