我可以将多个Web服务器连接到SQL Server群集并仍然维护用户的会话吗?
我想过各种方法。 Microsoft站点建议的是使用response.redirect到“正确”的服务器。虽然我能理解这个的原因,但它似乎有点短视。
如果负载均衡器将您发送到目前处于最小压力下的服务器,那么您当然应该尊重它吗?
在这种情况下是否有任何最佳做法?如果是这样,我会很高兴知道它们是什么以及对使用它们的利弊的任何见解。
答案 0 :(得分:2)
一些选项:
可以将负载均衡器配置为具有粘性会话。确保您的应用会话超时小于负载均衡器,否则您将因不可预测的结果而反弹。
您可以使用指定的状态服务器来处理会话。那么他们被LB反弹的地方无关紧要。
您可以使用SQL Server来管理会话。
在serverfault上检查此项。 https://serverfault.com/questions/19717/load-balanced-iis-servers-with-asp-net-inproc-session
答案 1 :(得分:2)
我从Java App Server的经验中学习,其中一些使用非常复杂的平衡算法。
合理的一般假设是“会话亲和力”比平衡每个请求更可取。如果我们为每个用户分配初始请求,并且具有一定程度的工作负载知识(甚至是随机的),并且人口来了又去了,我们最终会采取合理的行为。请记住,目标是为每个用户提供良好的体验,而不是最终使用均匀使用的服务器!
如果服务器出现故障,我们可以看到我们的请求移动到eleswhere,我们希望看到我们的会话转移。有很多方法可以实现这一点(DB中的会话,通过高速消息传播的会话状态......)。
答案 2 :(得分:0)
虽然您可以在负载均衡器中使用“粘性”会话,但更优化的路径是让会话使用状态服务器而不是InProc。此时,您的所有Web服务器都可以指向相同的状态服务器并共享会话。
http://msdn.microsoft.com/en-us/library/ms972429.aspx MSDN有很多话要说:D
更新:
状态服务器是Windows服务器盒上的服务,但是它会产生单点故障。
此外,您可以指定SQL Server会话的序列化,如果您将其置于养殖场,这不会是单点故障。
我不确定状态服务器的工作量是多么“沉重”,其他人是否有任何指标?
答案 3 :(得分:0)
这可能不是您正在寻找的答案,但是您可以消除会话状态的NEED吗?我们已经竭尽全力在页面本身的请求之间编码我们可能需要的任何内容。这样我就不会担心整个农场的状态或可扩展性问题,不得不挂在可能永远不会回来的人所拥有的东西上。