Iis 如何跨多个web服务器维护状态?

Iis 如何跨多个web服务器维护状态?,iis,architecture,web-applications,scalability,Iis,Architecture,Web Applications,Scalability,我是否可以将多个web服务器连接到SQL Server群集,并且仍然可以维护用户的会话 我想到了各种方法。Microsoft站点建议使用response.redirect到“正确”的服务器。虽然我能理解其中的原因,但这似乎有点短视 如果负载平衡器将您发送到当前压力最小的服务器,那么作为一名开发人员,您应该尊重这一点吗 在这种情况下,有什么最佳实践可以遵循吗?如果是这样的话,我希望知道它们是什么,以及了解使用它们的优缺点。虽然您可以在负载平衡器中使用“粘性”会话,但更理想的方法是让您的会话使用状态

我是否可以将多个web服务器连接到SQL Server群集,并且仍然可以维护用户的会话

我想到了各种方法。Microsoft站点建议使用response.redirect到“正确”的服务器。虽然我能理解其中的原因,但这似乎有点短视

如果负载平衡器将您发送到当前压力最小的服务器,那么作为一名开发人员,您应该尊重这一点吗

在这种情况下,有什么最佳实践可以遵循吗?如果是这样的话,我希望知道它们是什么,以及了解使用它们的优缺点。

虽然您可以在负载平衡器中使用“粘性”会话,但更理想的方法是让您的会话使用状态服务器而不是InProc。此时,所有Web服务器都可以指向同一状态服务器并共享会话

MSDN在这个问题上有很多话要说:D

更新:

状态服务器是windows服务器盒上的一项服务,但它会产生单点故障

此外,还可以指定会话到SQL Server的序列化,如果将会话进行了注册,则不会出现单点故障

我不确定状态服务器的工作负载有多“重”,其他人是否有任何指标?

一些选项:

负载平衡器可以配置为具有粘性会话。确保你的应用程序会话超时小于负载平衡器,否则你会被不可预知的结果所影响

您可以使用指定的状态服务器来处理会话。那么他们在哪里被磅反弹就无关紧要了

您可以使用SQL server管理会话

在服务器故障上检查此项。

这可能不是您想要的答案,但是您能消除会话状态的需要吗?我们已经尽了很大的努力对页面本身中请求之间可能需要的任何内容进行编码。这样,我就不必担心整个服务器场的状态,也不必担心必须保留某个可能永远不会回来的人所拥有的东西的可伸缩性问题。

我在这里借鉴了我对Java应用程序服务器的经验,其中一些服务器具有非常复杂的平衡算法

一个合理的一般假设是,“会话亲缘关系”比平衡每个请求更可取。如果我们将初始请求分配给每个具有一定工作负荷知识水平的用户(甚至是随机分配的),并且用户数量不断增加,那么我们最终会有一个合理的行为。记住,我们的目标是给每个用户一个良好的体验,而不是以使用均匀的服务器结束


在服务器出现故障的情况下,我们可以看到我们的请求被移动到别处,我们希望看到我们的会话被转移。有很多方法可以实现这一点(DB中的会话,通过高速消息传递传递的会话状态…。

拥有一个“状态”服务器不仅会导致单点故障,而且还意味着它也可以处理所有服务器上的每个页面请求吗?你如何避开这个问题?负载平衡器?你如何摆脱这个单一的失败点?如果负载平衡器死了,那又怎样?有没有一种切实可行的方法来避免这种情况?至于使用SQL server来管理会话,这会不会带来自身的可伸缩性问题?i、 e.每次页面刷新时都必须从数据库中获取用户数据?我实际上还没有使用SQL server进行管理,所以我不能谈论可伸缩性。我不会只有一磅-我会有一个最小值2,可能多达5(2个prod,2个test,1个dev)@bobthebuilder如果你使用SQLServer,这将是一个很好的分割到第二个db服务器的分割。核心数据在一台数据库服务器上,状态管理在另一台数据库服务器上。我们也考虑过这一点,实际上可能会走这条路,所以我不是不想听这个。只是我还没准备好做那个决定。我希望所有的选择都摆在桌面上,这样我才能做出明智的决定。我认为它对其他开发人员也很有用。好吧,这就引出了关于在原始服务器出现故障或停止服务时传播会话状态的问题。有什么最佳实践可以做到这一点吗?+1,很好的(IMO)答案,我自己也有几乎相同的内容。@BobTheBuilder:一个选择是不要,把它放在下巴上,继续前进。严肃地说,如果它的关键在于,如果服务器崩溃,用户就不应该松动我们原本认为是无效的,那么会话对象不是该数据的正确位置。