9

我有两个使用 NLB 运行的 IIS 服务器。不幸的是我不能使用共享会话服务器,所以每个服务器都使用自己的会话。如何确保来自同一用户的所有请求都转发到同一 IIS 服务器?

4

6 回答 6

21

发现这个并决定与他人分享:

使用客户端亲和性功能。启用客户端关联后,网络负载平衡将所有 TCP 连接定向到同一群集主机。这允许在主机内存中维护会话状态。您可以在网络负载平衡管理器的添加/编辑端口规则对话框中启用客户端关联。选择 Single 或 Class C affinity 以确保只有一个集群主机将处理属于同一客户端会话的所有连接。如果在集群主机上运行的服务器应用程序维护连接之间的会话状态(例如服务器 cookie),这一点很重要。有关网络负载平衡关联的详细信息,请参阅网络负载平衡管理单元中的帮助。

于 2009-05-14T22:40:01.453 回答
3

我认为您正在寻找的是粘性会话。粘性会话是由您的负载均衡器实现的。您可能需要设置一个可以执行粘性会话的外部负载均衡器(BIG-IP、HAProxy 等)。

于 2009-05-14T22:20:18.383 回答
1

只要您的客户不使用分布式代理系统,您就可以轻松做到这一点:

在 NLB 集群的 protieries 中,选项卡“端口规则”您可以选择“过滤模式”和亲和性:您不能选择“无”,因为您没有中央会话。但是,只要 ip 保持不变,“简单”就会将每个用户重定向到同一台服务器。如果您例如 anticiapte AOL 代理服务器,那么“C 类”可能是一个安全的选择(尽管可能会稍微减少负载平衡),因为同一个 C 类网络连接到同一个服务器。

我猜这很容易由 MS 以一种方式实现,即两个主机都知道哪个 ip 是偶数或奇数,或者 C 类网络的哪个三元组是偶数或奇数,并始终根据 IP 地址以相同的方式分配负载

于 2009-05-14T22:29:40.777 回答
0

你为什么想做这个?如果是因为会话状态,那么您应该在一个公共位置设置一个数据库或进程外服务器,并让所有节点都引用它。

于 2009-05-14T22:11:12.087 回答
0

我会考虑一个位于任一服务器前面的反向代理,并记住哪些外部用户正在使用哪些服务器。

我知道(通过这种方式使用)Cherokee支持 IPHash 代理,但我相信还有更多。

于 2009-05-14T22:15:48.487 回答
0

只是为了补充劳埃德的答案,无论如何您都应该避免在负载平衡环境中使用会话。使用 session 的全部目的是避免数据库调用;如果您最终将会话数据存储回数据库,您通常一无所获。

原因是 1. 您现在必须为每个页面加载(检索和存储)进行 2 次数据库调用,以及 2. 数据现在必须经过序列化/反序列化边界。大多数情况下,这最终是一项比仅检索您想要开始的数据更昂贵的操作。

现在,你的实际问题。您确实可以选择将会话数据存储在视图状态中。或者,您可以放弃会话而使用 cookie。如果你走这条路,一定要在出去的时候加密,在收到的时候解密。

于 2009-05-14T22:17:22.227 回答