【发布时间】:2009-12-18 23:21:19
【问题描述】:
假设我有一个由六个 IIS 7 Web 服务器组成的网络场,每个服务器运行一个相同的 ASP.NET 应用程序。
它们位于硬件负载平衡器后面(比如 F5)。
负载平衡器能否检测到 ASP.NET 应用程序工作进程何时重新启动并将流量从该服务器转移到工作进程重新启动之后?
【问题讨论】:
标签: asp.net iis load-balancing
假设我有一个由六个 IIS 7 Web 服务器组成的网络场,每个服务器运行一个相同的 ASP.NET 应用程序。
它们位于硬件负载平衡器后面(比如 F5)。
负载平衡器能否检测到 ASP.NET 应用程序工作进程何时重新启动并将流量从该服务器转移到工作进程重新启动之后?
【问题讨论】:
标签: asp.net iis load-balancing
在 IIS 重新启动期间发生的事情实际上是一个翻转过程。一个新的 IIS 工作进程开始接受新的连接,而旧的工作进程继续处理现有的连接。
这意味着,如果您将负载平衡器配置为使用除简单循环之外的平衡算法,它会“自然地”将一些(但不是全部)连接从正在回收的机器上转移出去。例如,使用“最少连接”算法,当服务器回收时,连接往往会停留更长时间。或者,使用性能或延迟算法,回收服务器会突然对负载平衡器显得更慢。
但是,除非您编写一些代码或脚本来明确检测或识别回收,否则您可以做到的最好的事情是——而且在大多数环境中,这实际上也是您所需要的。
【讨论】:
我们使用 Cisco CSS 11501 系列负载平衡器。我们在每台服务器上检查的 keepalive“内容”实际上是一个 PHP 脚本。
service ac11-192.168.1.11
ip address 192.168.1.11
keepalive type http
keepalive method get
keepalive uri "/LoadBalancer.php"
keepalive hash "b026324c6904b2a9cb4b88d6d61c81d1"
active
因为它是一个动态脚本,所以我们可以告诉它检查服务器的各个方面,如果一切顺利,则返回"1",如果不是一切顺利,则返回"0"。
在您的情况下,您可以实现一个类似的检查脚本,如果 ASP.NET 应用程序工作进程正在重新启动(或关闭),该脚本将无法工作。
【讨论】:
这在很大程度上取决于负载均衡器的轮询间隔,来自均衡器的请求必须按顺序失败才能决定转移流量
【讨论】:
默认情况下,IIS 6 和 7 每 1740 分钟重新启动一次应用程序池。它以重叠的方式执行此操作,因此服务不会受到影响。
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
http://forums.iis.net/t/1153736.aspx/1
另一方面,如果出现故障,良好的负载平衡器(我确信 F5 是)可以检测到其中一个 Web 服务器的故障,并将请求发送到其余的、运行良好的 Web 服务器。这是高可用性网络基础架构的关键部分。
【讨论】: