当 serverfault 处于测试阶段时,我在 StackOverflow 上问了这个问题。再试一次。
我在两个物理上分开的位置有 4 台服务器。每台服务器都运行 Windows Server 2003 Standard 和 Microsoft SQL Server 2005 标准版。
- 数据中心 A 中的服务器 A1 和 A2
- 数据中心 B 中的服务器 B1 和 B2
这些服务器通过互联网上的 VPN 相互连接。
在两个数据中心之间提供高可用性的最佳方法是什么?
我考虑过以下想法。
场景 A
- 数据中心 A 和 B 之间的 DNS 循环
- 通过 VPN 镜像服务器 A1 和 B1 上的数据库
- 服务器 A2 和 B2 将接收日志作为灾难恢复的热备用服务器。
- 所有 Web 服务器都将通过 VPN 将数据库流量指向服务器 A1,直到发生故障转移时,它们将请求定向到 B1
- 服务器将运行 Microsoft Load Balancer 软件。
场景 B
- 服务器 A1 和 A2 上的镜像数据库
- A1 和 A2 将运行 Microsoft Load Balancer 软件
- B1 和 B2 将运行 Microsoft Load Balancer 软件。
- 日志传送到服务器 B1 和 B2 作为数据中心之间手动切换的热备用,如果数据中心 A 出现故障,请更改 DNS 记录以指向数据中心 B。
我是一名 C# 程序员,不是系统设计师,所以我没什么想法。我正在尝试使用我们现有的硬件和数据中心配置。如有必要,我们可以购买硬件负载平衡器。
答案1
我认为,如果您想做这样可靠的事情,又不需要大量的传输费用,那么您就需要在两个数据中心之间建立专用连接(我们这样做,并在互联网上拥有一个具有更高路由成本的备份 vpn 路由,以防专用链路出现问题)。
真正的出发点是列出停机时间的业务成本 - 你需要考虑冷故障转移、温故障转移和热故障转移的成本增加是否合理。如果不了解更多信息,很难就可用的不同选项提供良好的指导。
答案2
我们为客户设置的最便宜的解决方案是多个只读数据库(日志传送通常就足够了) - 然后对于数据库的任何更新,将其发送到主服务器 - 代码中带有主服务器已关闭的“标志”(在停机时自动触发)。如果设置了该标志,我们会以某种用户友好的方式禁止写入。
有时,可以在单个服务器/单个 SQL 服务器上使用类似“admin.example.com”的设置来进行所有更新 - 特别是在您拥有一个进行更新的客户群和一个基本上可以查看客户发布的所有内容的“用户”群的情况下(例如,房地产列表,这种模型非常适合)。
至于使用专用链路而不是 VPN - 如果您位于两个连接良好的数据中心,那么它们之间的流量可能就不那么令人担心了 - 而且流量将小于专用链路。但是,使用 VPN 链路而不是 LAN 时,您会发现性能会显著下降,尤其是当您有一个“聊天式”sql 应用程序(大量小查询)时。专用链路或 VPN 都会出现这种下降,尽管 VPN 倾向于使用 TCP 而不是 UDP,这会使延迟大致增加一倍。
至于 DNS:在每个位置设置 DNS 服务器,这样您就有了冗余 DNS,您可以让每个 DNS 仅指向本地服务器,而不是循环 (这样,如果无法访问一个 DNS 服务器,您就认为该位置的 Web 服务器也已关闭)。否则,只需使用基本循环,您就可以报告关闭位置的“A”记录。
不过,这些事情不仅仅是简单的设置,你需要花一些钱进行规划,才能让一切正常运转。对于第二个地点,我通常会告诉人们预算至少为单个地点成本的 3 倍 - 特别是在规划阶段 - 再加上程序员实施必要更改的时间。
我们有一些更好的选择,我们将客户分散到同一地区的两栋大楼中(Equinix Ashburn (DC) 有几栋大楼)。我们在大楼之间分散运行主干连接 - 这样我们就可以在大楼之间进行故障转移,同时还能享受 LAN 在规划方面的所有优势。如果您只需要 2-8 台服务器,那么找我们这样的人来设置并协助规划将比自己动手要便宜得多。
分割东海岸/西海岸数据中心几乎总是超出拥有 4-8 台服务器的预算/复杂性的人的能力。
祝你好运。
答案3
那么,负载平衡到 EC2 怎么样,其成本会比第二个数据中心更低吗?