3

我们有一个设置,其中 3 个 ec2 实例每个都与其主网络接口 eth0 上的弹性 IP 相关联,因此这些实例可以处理传入的请求。

这些实例中的每一个都有一个辅助网络接口 eth1,如果一个实例发生故障/崩溃/重启,与该实例关联的弹性 IP 将与该接口上剩余的正在运行的 ec2 实例之一相关联。这是某种故障转移机制,因为我们总是希望这些弹性 IP 由某个正在运行的实例提供服务,这样我们就不会丢失任何传入的请求。

我遇到的问题特别是在重启实例时。当实例重新启动时,它无法取回它拥有的公共 ip,而这个公共 ip 是现在与另一个实例关联的弹性 ip。因此,除非我手动将弹性 IP 重新分配回此实例,否则此实例无法访问 Internet。

是否可以在重新启动时自动回收/重新关联它曾经拥有的弹性 IP 到其 eth1 接口?如果没有,您有解决方法的建议吗?

重新启动是必要的,因为我们将对实例进行无人值守升级。

更新: 还请注意,我需要使用这些弹性 ip,因为它们是我们与之集成的合作伙伴公司的防火墙中允许的。使用 ELB 将不起作用,因为它的 IP 会随着时间而变化。

4

2 回答 2

2

所以这就是我最终解决这个问题的方法。我错过的是亚马逊仅在两种情况下为实例提供新的公共 IP。

  • 它的弹性IP是分离的
  • 它只有一个网络接口

因此,基于此,在启动时,我为实例配置了两个实例,但我分离了辅助 eth1 接口。因此,这使得实例有资格获得新的公共 IP(如果由于任何原因它重新启动)。

现在对于故障转移,一旦其中一个正在运行的实例检测到一个实例已从集群中脱机(在这种情况下,假设它重新启动),它将在运行中附加辅助接口并将弹性 IP 关联到它。因此,弹性 IP 现在由至少一个正在运行的实例提供服务。效果立竿见影。

现在,当失败的实例在重启后恢复时,亚马逊已经为其提供了一个新的非弹性公共 IP。这是因为它满足了只有一个网络接口的两个条件,并且它的弹性 IP 被解除关联并重新关联到另一个正在运行的实例。因此,这个重新启动的实例现在有一个新的公共 IP,并且可以在启动时连接到 Internet,并执行配置自身和重新加入集群所需的必要任务。之后,它重新关联回它需要的弹性 IP。

此外,当接管弹性 IP 的运行实例检测到新实例或重启的实例上线时,它会再次分离辅助接口,以便在重启时也有资格获得新的公共 IP。

这就是我处理故障转移并确保始终提供弹性 IP 的方式。然而,这个解决方案并不完美,可以改进。如果 N 个网络接口可用于故障转移,它可以扩展到处理 N 个失败/重新启动的实例!

但是,如果在故障转移期间附加辅助接口的实例重新启动,它将不会获得新的公共 IP 并且将保持与集群的断开连接,但至少弹性 IP 仍将由剩余的活动实例提供服务。这仅适用于重新启动的情况。

顺便说一句,至少从我读过的所有内容来看,亚马逊文档中没有明确提到这些获取新公共 IP 的条件。

于 2015-04-17T20:35:33.663 回答
0

听起来使用弹性负载均衡器 (ELB) 会更好地为您服务。您可以只使用一个 ELB,它将为您的 3 个应用程序服务器提供请求。

如果其中一个出现故障,ELB 会检测到这一点并停止在那里路由请求。当它重新联机时,ELB 会检测到它并将其再次添加到路由组中。

http://aws.amazon.com/elasticloadbalancing/

于 2015-04-14T16:51:59.030 回答