有一个简单的场景,其中包含两个 Web 服务器,用于实现冗余和扩展。
但是如何才能使两个 Web 服务器设置完全冗余呢?我能想到两个解决方案;
两个 Web 服务器,一个负载均衡器分散负载。还有一台额外的机器用于负载均衡器。但是负载均衡器如何实现冗余呢?
两台机器,每台都运行 Web 服务器并运行负载平衡器,分散负载。两台机器都有一个 DNS 入口点。不需要额外的机器来进行负载平衡。
你们通常如何解决此类问题?
答案1
如果您仅限于两台服务器,那么使用 DNS 轮询可能会更糟糕,因为每台机器上的负载平衡器都指向对方。传统上,负载平衡器在自己的服务器上单独设置一层,具有自己的冗余和故障转移功能。
答案2
但是,如何才能使两个 Web 服务器设置完全冗余呢?
通常情况下,您不需要。通过无缝故障转移使数据库完全冗余是困难的。而且完全冗余需要额外的硬件,因此在站点规模变大之前通常不会实现。
您必须考虑会话状态-- 用户登录状态、购物车内容等。将如何处理?
如果您的服务是完全无状态的(fx静态文件服务,没有为每个用户进行定制),那么您可以使用DNS Round Robin为您的网站发布2个IP地址,每个服务器一个。
如果你需要对故障转移的处理方式有更多的控制权,你可以考虑两台 Web 服务器,它们通过以下方式共享同一个 IP 地址:Windows NLB或者在 Linux 上使用类似Linux 高可用性,Keepalived等(有几种可能的解决方案)。
答案3
假设有硬件负载平衡器,它们通常可以在主动/被动集群中设置,以便使用其本机配置进行故障转移。如果您使用的是软件负载平衡器(不是 Microsoft NLB),则寻找符合 VRRP 的软件负载平衡器,并使用 VRRP 来处理负载平衡器的故障转移。如果您使用的是 Microsoft NLB,那么它会在横向扩展集群中的所有机器上运行并自动处理机器故障。
答案4
通常有两种方法可以实现高可用性/可扩展性故障转移解决方案。第一种方法是使用循环 DNS 记录上的短 TTL,结合负载平衡器,第二种方法是使用硬件或软件解决方案的心跳监控和 IP 地址故障转移。一些解决方案结合使用这两种方法以提高可靠性。
并不是说你应该投入大量资金来做这件事,而是看看 Zeus 的 ZXTM 和 GLB 解决方案,了解商业解决方案的可能性。我过去曾将它们用在自己的硬件上,效果很好。
值得一提的是,您应该能够通过在 DNS 记录中使用较短的 TTL 来实现相当可靠的效果,然后在丢失 LB 时以编程方式将 DNS 指向备份 Webhead。您可以使用 Zerigo 之类的服务来执行此操作,因为它们提供了一个 API,您可以随时更改记录。如果您希望优化成本,这就是可行的方法。
在 Linux 上似乎有几种解决方案可以实现这一点,其中包括基于 LVS 构建的解决方案:http://www.cyberciti.biz/faq/rhel-centos-fedora-keepalived-lvs-cluster-configuration/,但部署位置可能会受到限制(例如不能在 AWS 上),并且设置、监控和正确实施会产生额外成本。