我正在研究使用 Amazon Elastic Load Balancing (ELB) 来减少服务器宕机时的停机时间。基本上,我不想更改相关的 DNS 记录并等待 DNS 传播到全世界,我只想将流量重定向到为我的应用程序提供服务的另一台机器。
但是,我的几乎所有服务器都不是 EC2 实例,而是与亚马逊无关的公司提供的 VPS 或专用服务器。
是否可以使用亚马逊的某种服务组合(特别是 ELB),以便我将域名指向弹性负载均衡器,并让其将请求转发到亚马逊网络之外的 1-2 台服务器?
如果平衡器的 IP 发生变化,这显然行不通(那时就不能将根域名指向它)。但是,你可以为平衡器分配一个弹性 IP,然后然后将您的域名指向它+将其配置为将请求转发到非Amazon-PrivateServer1和非Amazon-PrivateServer2?
答案1
ELB 只会向 EC2 实例发送流量。
您可以在 ELB 后面放置几个 nginx EC2 实例来代理到您的真实服务器的流量,或者您可以采用简单的方式并将 DNS TTL 降低到 10 分钟左右,以便更快地反映更改。
答案2
截至 2017 年 8 月 31 日,除了实例 ID 之外,应用程序负载均衡器还支持将 IP 地址作为目标:
我们很高兴地宣布,除了实例 ID 之外,应用程序负载均衡器现在还可以使用其 IP 地址作为目标将流量分配到 AWS 资源。您还可以使用其 IP 地址作为目标,将负载均衡到托管负载均衡器的 VPC 之外的资源。这包括可通过 AWS Direct Connect 或 VPN 连接访问的对等 VPC、EC2-Classic 和本地位置中的资源。使用同一负载均衡器在 AWS 和本地资源之间进行负载平衡,让您可以轻松迁移到云、爆发到云或故障转移到云。
答案3
为什么不使用带有健康检查的 Route53 来实现这一点?
首先,您要为每台服务器创建基于 IP 的健康检查。这些检查可以很简单,只需监控特定请求的 HTTP 200 状态;或者您可以创建更高级的检查,在请求结果中搜索特定字符串。
接下来,如果尚未完成,请为在 Route53 中使用的域创建一个托管区域;并向您的域名注册商提供 Route53 分配的 DNS 服务器。
完成后,对于您想要平衡请求的每台服务器,创建一个记录集(在刚刚创建的托管区域内),例如使用类型“加权”、短 TTL(60 或更低)并选择“与健康检查关联:是”,然后选择您上面创建的健康检查,该健康检查对应于您正在为其创建记录的特定服务器/IP。再次对每个服务器/IP 重复此操作。
您最终会得到多个记录集,每个记录集有 1 个 IP,并且所有记录集都与 Route53 中的同一个域相关联。在 DNS 请求时,Route53 现在将根据分配给它们的权重和每个健康检查的当前状态返回其中一个。如果某个健康检查失败,则会忽略该特定 IP。
您还可以使用其他 Route53 记录集类型执行此操作;例如,使用“故障转移”,您将拥有 1 个或多个主 IP 和 1 个或多个辅助 IP。Route53 将始终返回其中一个主 IP,除非这些 IP 的运行状况检查失败,然后它会切换到其中一个辅助 IP。
Route53 中还有更复杂的记录类型,也可以与健康检查结合使用:延迟、地理位置、多值。AWS 文档中对此进行了很好的解释。