有一个数据中心 - dc1。业务需要在另一个地区设置另一个数据中心 - dc2,并且将来可能会有更多数据中心,例如 dc3。
在数据中心 dc1 内:
- 有两个 Web 服务器,即 WS1 和 WS2。这两个 Web 服务器目前不共享任何内容。预计没有必要在每个 dc 内安装更多 Web 服务器。
- dc1 还具有一个本地负载均衡器,该均衡器已设置了会话粘性。因此,如果用户(比如 u1)登录到 dc1,并且负载均衡器决定将他的第一个请求路由到 WS1,那么从那时起,u1 的所有请求都将路由到 WS1。
- 本地负载均衡器和 Web 服务器对用户不可见。本地负载均衡器监听分配给 Web 服务器 ws1 和 ws2 虚拟集群的虚拟 IP 上的流量。虚拟 IP 是主机名在 DNS 中解析到的 IP。
- 目前没有客户端特定的子域,而是有一个客户端特定的 url(上下文)。例如:www.example.com/client1 和 www.example.com/client2。
鉴于上述情况,当 dc2 接入时,我希望根据客户端在 dc1 和 dc2 之间路由流量。到目前为止,我发现的选项如下。
- 具有客户端特定的子域,例如 client1.example.com 和 client2.example.com,并为每个子域分配我想要将它们路由到的数据中心的虚拟 IP。
或者
- 将 www.example.com 和 www1.example.com 分配给第一个 dc,即 dc1,并将 www2.example.com 分配给 dc2。所有请求将首先路由到 dc1,其中 WS1 和 WS2 将根据 URL 是以 /client1 还是 /client2 结尾,将用户重定向到 www1.example.com 或 www2.example.com。
我需要以下方面的帮助
- 如果我在 dc1 和 dc2 之间设置全局负载均衡器,我还有其他解决方案吗?也就是说,全局负载均衡器可以根据 url 路由流量吗?
- 与 www1 解决方案相比,基于子域的解决方案是否存在缺点?对于 www1 解决方案,我担心它至少在第一次请求时会对 dc1 产生依赖,并且用户会发现他被重定向到不同的 URL。
答案1
您是否希望手动将客户分配到每个 DC,还是只想寻找一种简单的方法来分配负载?如果是后者,基于地理位置的负载平衡通常会为您提供最佳性能。
基于地理位置的负载平衡器几乎总是基于 DNS,这意味着您在 DNS 查找时不会拥有 URL 信息,因此无法做出决定。但是,我见过这样的方案:一个位置的 Web 服务器在检查请求后,如果请求的对象在其他地方能得到更好的服务,则会将 301 重定向发送到另一个位置的服务。
至于基于地理位置的负载平衡,目前有几种 DNS 即服务产品;我推荐 Dynect(http://dyn.com/dns/dynect-managed-dns/)。它们可以进行地理定位和站点监控,并在发生中断时将失效的 VIP 从 DNS 轮换中拉出。
也存在不少基于设备的解决方案,例如 F5 的 GTM 和 Citrix 的 Netscaler,但它们的成本比基于云的解决方案高得多。
基于 DNS 的解决方案的最大缺点是,某些客户端在发生故障转移时无法可靠地刷新其 DNS 缓存。在我工作的站点(一个大型站点)上,我们会看到客户端在从 DNS 中删除其 IP 几天到几周后访问已弃用的 VIP。修复此问题的方法非常奇特,通常依赖于使用路由协议将 VIP 从一个站点“移动”到另一个站点,以及 DNS 更改。