我们将把 2 个 IIS7 Web 服务器加入到 NLB 中,并发布相同的 Web 服务(每个 Web 服务器一个相同 Web 服务的 2 个实例)。
- 我是否理解正确,NLB 将适用于我的 Web 服务,将 Web 请求委托给一个或另一个实例?
- 如果某个 Web 服务实例不可用(即开始抛出 SOAP 异常或 HTTP 错误),NLB 将如何工作?
- NLB 是否会考虑平均 Web 服务响应时间来决定要委派处理的 Web 服务实例?
先感谢您!
答案1
短的: NLB 并不关心。
NLB 依赖于所有节点查看所有传入流量,然后每个节点丢弃它不感兴趣的任何流量。这是在应用程序看到流量之前 - 它不是基于应用程序的健康状况,不是基于响应时间,不是基于公平性或排队。
NLB 不给予鼠驴应用程序的问题。用户模式问题包括所以用户模式!
只要网络堆栈能够发送和接收 NLB 广播(或多播!),NLB 就会持续接受流量。
更长:国家法律顾问委员会真的不在乎。
NLB 作为第 2 层 NDIS 过滤器运行,并简单地对所有传入流量运行其哈希算法,并接受与其端口规则匹配的位。
每个节点必须看到全部传入流量(由交换机进行多播/广播),每个节点都会丢弃不符合其哈希标准的数据包。
NLB 是一种统计负载均衡器。不是一个关心他人的。
- 您的应用程序抛出 500 次错误对它来说并不重要。
- 它没有意识到你的用户模式监听器进程已经崩溃了。
- 它没有意识到你的应用程序运行得很慢。
它只是。没有。关心。
这最佳情况NLB 失败的原因如下(其中之一):
- 盒子因断电而彻底失效
- 网线被剪断或拔掉
- (可能是由吸尘器产生的)
- (或者 NIC 在火花四溅中爆炸)
- (或被路过的小偷偷走)
- (或任何形式的身体的网络中断)
- 蓝屏
任何这些情况都会阻止网络堆栈处理传入的数据包,并阻止发送“我还活着!”向其他 NLB 节点广播消息,这会导致集群在一小段时间(几秒)内进行内省,找出哪些节点仍然存在,然后重新收敛。
然后,当剩余节点清楚有多少个节点时,它们将再次开始散列,并丢弃任何它们不感兴趣的新数据包。
如果你需要
- 健康监测,
- 谨慎地将负载应用于未充分利用的服务器,
- 和基于响应时间的智能决策
NLB 不是您的解决方案。如果您的应用程序对此没有异议,或者对 NLB 有足够的了解,可以在应用程序层出现问题时运行 NLB STOP,那么可能就没问题了。但很少有应用程序会这样做(ISA/TMG 就是一个例子)。
好像我之前写过这篇文章这里。
另眼相看 如果您正在寻找低成本(阅读:免费)的基于 Windows 的解决方案,请考虑使用 IIS 7+ 的应用程序请求路由 - 它具有您正在寻找的大多数健康监控功能。
不过,一般来说,您不会在与应用程序相同的盒子上运行它,并且为了实现可用性,您通常希望在 ARR 下运行 NLB,以将负载均衡器的网络级可用性与该级别的应用层智能相结合。
答案2
- 编辑后我的答案适用于通用网络负载平衡,而不是微软的 NLB 服务!
答案实际上取决于您的负载均衡器有多复杂。最简单的设置是负载均衡器以循环方式将请求发送到另一个 Web 服务器,并使用 ping 来确定主机是处于启动状态还是关闭状态。
您可以使用更复杂的健康检查,您的负载平衡服务器在放入负载平衡池之前需要通过这些检查。
要执行健康检查,您通常会在 Web 服务器上配置一个页面,该页面依赖于 Web 服务器运行的所有方面。也许一些 php 会在数据库中查找某些内容,然后如果一切正常,则会在屏幕上显示“OK”。然后,您将配置负载均衡器健康检查以查看此页面并确保它显示“OK”
如果健康检查失败,则检查失败的服务器将从池中移除,并且不会向其发送任何流量。如果所有服务器都失败,通常可以让负载均衡器提供暂存页面。
同样,根据负载平衡器的复杂程度,您可以使用各种负载平衡机制。您确实可以根据服务器负载、与服务器的连接数进行负载平衡,您可以让某些服务器比其他服务器接收更多的负载,您可以拥有“粘性”会话,即同一个客户端始终被发送到同一个 Web 服务器。有很多可能性。