假设我们有十台服务器,每台服务器都有一个无状态应用程序的副本。
- 用户在浏览器/客户端程序中输入地址。
- dns 服务器返回一个 ip 列表(然而很多人说不应该使用 dns 来提供 HA,尤其是对于非浏览器客户端)
- 因此,旧的浏览器/客户端程序检查第一个 IP,它已关闭,那么...会发生什么?连接失败?
如何解决?虚拟 IP?还有其他机制吗?请给我一些链接或至少一些流行语,以便我可以阅读更多相关信息
编辑:好的,我知道我们应该在集群前面安装一些负载均衡器,但问题又转移到了另一层:如何提供该负载均衡器的 HA?毕竟它可能会宕机
答案1
您混淆了 DNS 和高可用性。跟我重复一遍:DNS 不是故障转移。DNS 不是故障转移。DNS 不是故障转移。
如果您想要实现高可用性和负载平衡,则需要专门用于此的反向代理。最知名的是 haproxy。
答案2
对我来说,在两个以上主机上实现 HA 的最明显的解决方案之一是负载平衡,尽管名称并不暗示 HA。
哪种 LB 最适合您的用例实际上取决于客户端和应用程序的类型,但最常见的选项有三种。
L7 负载平衡。您有一个能够理解所用协议的代理。HTTP 有许多这样的代理。它知道如何检查后端服务器是否处于活动状态。有些代理甚至可以轻松处理错误响应 (500)。代理会保留所有服务器的列表以及活动且运行良好的服务器列表。请求到达后,它会将其转发到其中一个正常的后端服务器。(如果也有 SSL 卸载,这可以与 HTTPS 配合使用。)
L4 负载平衡的工作原理基本相同,但它不是查看每个请求,而是查看每个连接。它不理解协议。因此,即使您使用的是 HTTPS 等临时或加密协议,它通常也能正常工作。
L3 负载平衡采用源 IP 地址(可能还有端口)的哈希值,并根据此哈希值将连接转发到其中一个服务器。即使对于有状态的 UDP 协议也有效。
实现此目的的方法还有很多。但我认为这些是最基本的。
当然,现在您有了另一个 SPOF - 负载平衡器。但由于这三种方法(无 SSL)都不太耗费资源,因此使用 VRRP 之类的东西进行主动/被动配置以在出现问题时进行故障转移是合适的。
HTTP 的 L7 可以通过 Varnish(就我的经验而言,这是一种出色的缓存和 LB 解决方案)、HAProxy、nginx、Apache httpd 等软件来实现。大多数 Web 服务器/代理都可以做到这一点。对于其他协议,您必须使用特定于该协议的代理。
L4 可以通过 HAProxy 和类似的软件来完成,或者通过防火墙来完成(尽管您必须实施状态检查)。
L3 在路由器和/或防火墙上完成。您可能可以使用 Linux 和 iptables (IPVS) 或某些商业软件来完成。
答案3
就您想要启用 HA 的特定实体而言,HA 是一个相当广泛的主题。例如,Web 服务器、网络设备、数据库等。一般的想法是避免单点故障。
就你的情况而言,你想在 Web 服务器上启用 HA,目前我能想到的有两种方法:主动/主动和主动/被动(这两个概念可以概括为
主动/主动:在这种情况下,您的实际 Web 服务器前面有一个反向代理(haproxy 或 Nginx)。它的作用主要是转发请求和响应。它知道可用的 Web 服务器列表,并通常在这些服务器之间分配传入的请求。用户将始终访问此代理公开的相同 IP,并且由代理决定将请求转发到哪个 Web 服务器。在这种情况下,如果其中一个 Web 服务器出现故障,代理只会停止在其上工作。
主动/被动 更有趣的设置是主动/被动,其中一台服务器正在执行实际工作,其他服务器都处于待机状态。例如,您有两台 Web 服务器,A 和 B。它们的 IP 地址都是 1.1.1.1,但只有 A 响应 ARP 请求。因此,您的集群将只观察正在执行实际工作的服务器 A。目前,B 只是一个幽灵服务器,随时准备在发生故障时接管。A 和 B 之间会有某种心跳协议来检查健康状况。当 A 发生故障时,B 会在一定延迟内发现并接管。
在云中,基本上所有元素都具备高可用性,包括网络、计算、控制器。您的服务也应如此。还有其他工具(如 Pacemaker&Corosync、keepalived)可以实现这一点。
由于您所讨论的主题非常广泛,我现在无法提供任何好的参考,但我鼓励您谷歌搜索某些用例,以便更深入地了解。
干杯,J