如何为 HA 目的复制 EC2 实例

How to Duplicate an EC2 Instance for HA Purpose

有没有办法在不同 AZ 的同一个 VPC 中复制一个 EC2 实例以实现 HA 目的,以便当主实例出现故障时(例如由于检查状态失败),我可以将其关闭并快速切换转到备用的。

出于某种原因,我需要保留相同的私有 IP 地址和 public/EIP IP 地址。 对于 EIP 地址,我可以将它与旧实例解除关联,然后将其重新关联到新实例,但是私有 IP 地址呢?

有什么建议吗?提前致谢...

您可能无法保留相同的私有主 IP 地址,但您可以将辅助私有 IP 地址分配给 VPC 中的 EC2 实例,并且它们是可重新分配的:

Private IP addresses

When you launch an instance into a VPC, a primary private IP address from the address range of the subnet is assigned to the default network interface (eth0) of the instance. If you don't specify a primary private IP address, we select an available IP address in the subnet range for you.

You can assign additional private IP addresses, known as secondary private IP addresses, to instances that are running in a VPC. Unlike a primary private IP address, you can reassign a secondary private IP address from one network interface to another.

从这里开始:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-ip-addressing.html

什么是"an instance"?

当人们谈论 "duplicating an EC2 instance" 时,值得思考一下他们​​的意思。一个 EC2 实例包括:

  • 操作系统启动盘
  • 任意数据盘
  • 网络设置(例如 public 和私人 IP 地址)
  • 配置(例如实例类型、用户数据、标签等)

复制 EC2 实例通常意味着启动另一个具有相同配置的实例,但这不一定是 "duplicate"。例如,不同的可用区意味着它将具有不同的 IP 地址(见下文),并且新实例将从 AMI(Amazon 机器映像)启动,而不是与前一个实例的磁盘完全相同。

重复高可用性

接下来是高可用性的问题。新实例可能需要几分钟才能启动。如果要求是近乎即时的切换,那么唯一的解决办法就是总是 运行 多个实例,然后重新指向一个 IP 地址或 DNS 名称。

如您所述,将弹性 IP 地址关联到备用 EC2 实例既简单又快速。此更改会立即重定向发送到该 IP 地址的流量。

但是,无法将内部 IP 地址重新分配给另一个实例(但请参阅下文)。

使用 Auto Scaling 启动另一个实例

如果要求允许中断几分钟,那么就会出现更多的可能性。最简单的方法是在 Auto Scaling 组中启动 EC2 实例。该组可以配置为始终具有一定数量的实例(例如,最少 1 个实例)。因此,当一个实例出现故障时,Auto Scaling 可以自动启动具有相同配置(启动磁盘、实例类型等)的替代实例。

此外,Auto Scaling 可以在某个区域出现故障时自动在另一个可用区中启动实例。

但是,请注意内部 IP 地址范围与 VPC(虚拟私有云)内的子网相关联。每个子网都与一个可用区相关联。层次结构是:

  • 专有网络
    • 可用区
      • 子网(IP 地址的 CIDR 范围)
        • 实例

因此,在不同的可用区(以及不同的子网)中启动实例将需要实例具有不同的内部 IP 地址。

重新分配 IP 地址的技巧

虽然无法重新分配内部 IP 地址(尤其是在子网之间),但 ARC401 session at re:Invent 2014 (see slides 33 & 34, or on YouTube 中描述了一个有趣的 hack。

这涉及将 IP 地址与辅助弹性网络接口 (ENI) 相关联,其中 IP 地址位于 VPC 范围之外。然后,使用路由规则将发往该地址的流量路由到 ENI(关闭 Source/Dest 检查)。实际上,可以通过修改路由规则将流量重新路由到不同的实例。有点 hack,但它显然有效。