我不知道如何为我这个相当简单的场景设置故障转移。我正在为 API 构建服务网关。我想要的是两台服务器托管在不同的数据中心。我只是希望即使其中一台服务器宕机,用户也能访问服务。数据库同步没有问题,我只关心服务的可用性。
我该如何做,同时又能防止用户在其终端实施任何类型的故障转移逻辑?我希望为用户提供单个域或单个 IP 地址,并能够始终使用此单个端点访问服务。
我不明白如何实现这一点。我知道我可以设置一个网络节点,将请求转发到第一台或第二台服务器,具体取决于这两台服务器中哪台当前在线。但是,我不明白这种设置如何解决 HA 问题,因为我们只是在系统中引入了一个单点故障 - 转发节点。因此,如果此节点发生故障,服务将不可用。
您能解释一下如何在现实世界中实现这一点吗?是否有可能以合理的成本实现这一点(即不超过服务器本身的托管成本)。
编辑:有人提出,不同的数据中心要求成本高昂。因此,请随意为 1 个数据中心内的 2 台服务器提供建议。
编辑2:请随意提及该设置的合理成本是多少。
答案1
它的工作原理非常简单。第一条规则是你必须拥有不止一次。为简单起见,我将在一个数据中心内设置它,并使用该 DC 拥有的 IP 地址(你可以使用自己的 IP 地址和多个数据中心来做到这一点,但我们正在讨论一些多宿主 AS 的东西、BGP 和其他一些不那么便宜和容易实现的东西)。
您将需要至少 4 台服务器(只用两台也可以,但这不是好方法)。2 台用于应用程序,2 台用于负载平衡,每台服务器都有多个网卡。
基本设置如下:
/---\ /------\ /----------\
| S |-----| LB 1 |-----| SERVER 1 |
--NET--| W | \------/\ /\----------/
| I | \_/
| T | / \
--NET--| C | /------\/ \/----------\
| H |-----| LB 2 |-----| SERVER 2 |
\---/ \------/ \----------/
您的 DC 为您提供了两条独立的网络线路。这两条线路都位于同一个 VLAN 中,并且都连接到交换机(最好的方式是 2 个交换机)。2 个负载均衡器连接到这些交换机并共享一个虚拟 IP。它是可以在这两台机器之间流动的 IP。您可以使用 VRRP 和 keepalived 来很好地实现这一点。
这两个负载均衡器后面放置了两个镜像服务器。接下来就是魔法了:
- 您需要将您的 DNS 记录指向该虚拟 IP
- 当有人访问你的应用程序时,它将经过一个LB并最终到达一台服务器
- 当一台服务器死机时,负载均衡器会通过健康检查等方式注意到这一点并禁用该服务器。每个新请求都将发送到健康服务器。
- 当一个负载均衡器死机时,keepalived 会注意到它(再次通过一些健康检查)并将该浮动 IP 移动到健康负载均衡器,并且没有人会注意到它。
您应该知道 HA 是一种昂贵的方式,您无法以低预算实现它。您需要计算服务中断是否比 HA 成本更便宜,有时确实如此。
您应该查看关键字 vrrp、keepalived 和 haproxy 来获得一些想法和思考方法。
答案2
当然,通常的方法是使用两个转发(平衡)节点,以某种形式哈集群。从外部世界的角度来看,一致性是通过各种形式的共享IP 地址 - VRRP、CARP(与 VRRP 相同,但开放实现)等。因此,您将在两个层(平衡层和数据/服务层)上拥有冗余。
数据/服务层的一致性超出了本答案的范围,但是,通常它相当简单。您使用集中式会话存储(可能也是复制的,如 redis 或 memcached)和复制的数据库集。
一般来说,这只需两台物理服务器即可实现,每台服务器同时扮演不同的角色:平衡器、数据库服务器等等。