问题
我正在尝试配置多个 Web 场(用于不同的网站),如下所示NLB+ARR架构. 假设我有 6 台虚拟机:
- 2 个虚拟机的 ARR+NLB 集群。它接收流量并将其转发到内容服务器。带有 HTTP Host 标头条件的 URL 重写规则用于将请求路由到正确的内容服务器。
- 站点 1 内容服务器:2 台虚拟机。托管http://www.mysite1.com/
- 站点 2 内容服务器:2 台虚拟机。托管http://www.mysite2.com/
一切运行正常,我已经测试过两个层级都具有高可用性。
现在,出于某种原因,站点 2 必须以主动/被动模式工作,以便只有 1 个 VM 接收流量,而另一个 VM 用于故障转移。在某种程度上,我想要类似于 NLB 的单主机模式的东西,但用于 ARR。
如何实现这一点?
解决方法
我尝试了几种间接方法来实现所需的行为。
- 负载平衡算法。尝试将轮询权重设置为 1/0。问题是您不能设置为 0。它必须至少为 1。您可以设置 40 亿 + smth / 1,但我不确定这是否能保证没有随机请求进入第二个节点。
- 主机名与服务器的亲和性。在主机名关联性的高级设置中,我只能配置 1 个服务器分配给站点 2。这可以工作,但问题是 2 个 ARR VM 之间的路由表不同步。因此,有时 ARR1 会将流量关联到一个节点,而 ARR2 会关联到另一个节点,这不是主动/被动的。
- 主机名亲和性 + NLB 单主机。作为对之前方法的修改,我还可以将 NLB 切换到单主机模式来解决路由表同步问题。在这种情况下,问题是我也关闭了站点 1 的 ARR 负载平衡。
- 主机名亲和性 + NLB 单主机 + 2 个 IP 地址。如果我将第二个 IP 地址添加到上一个解决方案中,创建 2 个以不同模式工作的 NLB 群集,一切都应该正常工作。问题是我不想为第二个公共 IP 付费。
没有一个解决方案是完美的。
理想解决方案的图像
我真的很想知道如何将 ARR 置于单主机模式,就像 NLB 那样。并让它在节点之间同步路由。
有人知道怎么做吗?或者知道其他方法吗?
答案1
我找到了一种似乎可行的方法,尽管不是完全可行的。它是这样描述的这里。这个想法是使用“服务器变量哈希”负载平衡算法和“HTTP_HOST”作为变量。这样,ARR 的所有实例都会将给定主机映射到同一内容服务器。我已经测试过,如果映射的服务器不工作,它们会回退到另一台可用的服务器。
但是,该解决方案的问题在于您无法控制主机映射到哪个内容服务器,这由哈希函数决定。然而,从某种意义上说,这是正确的 - 如果您担心将任何节点设为活动节点,那么您如何能期望可靠的故障转移?您必须同时确保所有内容服务器。
另一个问题是您不能为每个站点使用多个主机名,因为您可能会将它们映射到不同的服务器上。