

# Amazon EC2 实例的置放群组
<a name="placement-groups"></a>

为了满足工作负载的需求，您可以将一组*相互依赖的* EC2 实例启动到一个*置放群组*中，以影响它们的置放。

根据工作负载类型，您可以使用以下置放策略之一创建置放群组：
+ **集群** – 将一个可用区内靠近的实例打包在一起。通过使用该策略，工作负载可以实现所需的低延迟网络性能，以满足高性能计算（HPC）应用程序通常使用的紧密耦合的节点到节点通信的要求。
+ **分区** – 将实例分布在不同的逻辑分区上，以便一个分区中的实例组不会与不同分区中的实例组使用相同的基础硬件。该策略通常为大型分布式和重复的工作负载所使用，例如，Hadoop、Cassandra 和 Kafka。
+ **分布** – 将一小组实例严格放置在不同的基础硬件上，以减少相关的故障。

置放群组是可选的。如果不将您的实例启动到一个置放群组中，EC2 会尝试以某种方式放置实例，以便将所有实例分布在基础硬件上，从而最大限度减少相关的故障。

**定价**  
创建置放群组无需支付费用。

**规则和限制**

在使用置放群组之前，请注意以下规则：
+ 一个实例一次只能放在一个置放群组中；您不能将一个实例放在多个置放群组中。
+ 不能合并置放群组。
+ [按需容量预留](ec2-capacity-reservations.md#capacity-reservations-limits)和[区域预留实例](reserved-instances-scope.md)可让您为可用区中的 EC2 实例提供容量预留。当您启动实例时，如果实例属性与按需容量预留或区域预留实例指定的属性相匹配，则该实例将自动使用预留容量。如果您将实例启动到置放群组，情况也是如此。
+ 您无法在置放群组中启动专属主机。
+ 您无法在置放群组中启动已配置为中断时停止或睡眠的竞价型实例。

**Topics**
+ [置放策略](placement-strategies.md)
+ [创建置放群组](create-placement-group.md)
+ [更改实例置放](change-instance-placement-group.md)
+ [删除置放群组](delete-placement-group.md)
+ [共享置放群组](share-placement-group.md)
+ [AWS Outposts 上的置放群组](placement-groups-outpost.md)

# 置放群组的置放策略
<a name="placement-strategies"></a>

可以使用以下某种置放策略来创建 EC2 实例的置放群组。

**Topics**
+ [集群置放群组](#placement-groups-cluster)
+ [分区置放群组](#placement-groups-partition)
+ [分布置放群组](#placement-groups-spread)

## 集群置放群组
<a name="placement-groups-cluster"></a>

集群置放群组是单个可用区中的实例的逻辑分组。实例未隔离到单个机架上。集群置放群组可横跨同一区域中的对等虚拟专用网络（VPC）。同一集群置放群组中的实例可针对 TCP/IP 流量享受更高的每流吞吐量限制，并且这些实例将处于网络的同一高等分带宽段中。

下图显示放入集群置放群组中的实例。

![\[集群置放群组。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/placement-group-cluster.png)


建议将集群置放群组用于可受益于低网络延迟和/或高网络吞吐量的应用程序。如果大部分网络流量在组中的实例之间进行，也建议使用集群置放群组。要为置放群组提供最低延迟和最高每秒数据包数的网络性能，请选择支持增强联网的实例类型。有关更多信息，请参阅[增强联网](enhanced-networking.md)。

我们建议您按照以下方法启动您的实例：
+ 使用单个启动请求在置放群组中启动所需的实例数。
+ 对置放群组中的所有实例使用相同的实例类型。

如果您以后尝试将更多实例添加到置放群组，或者如果您尝试在置放群组中启动多个实例类型，都会增大发生容量不足错误的可能性。

如果您停止置放群组中的某个实例，然后重启该实例，则其仍将在该置放群组中运行。但是，如果没有足够容量可用于该实例，则启动将会失败。

如果您在已有正在运行的实例的置放群组中启动实例时接收到容量错误信息，请在该置放群组中停止并启动所有实例，然后尝试再次启动。启动实例可能会将实例迁移至具有针对所有请求实例的容量的硬件。

**规则和限制**

以下规则适用于集群置放群组：
+ 支持以下实例类型：
  + 最新一代实例，但不包括[可突增性能](burstable-performance-instances.md)实例（例如 T2）、[Mac1 实例](ec2-mac-instances.md)和 M7i-flex 实例。
  + 以下上一代实例：A1、C3、C4、I2、M4、R3 和 R4。
+ 一个集群置放群组不能跨过多个可用区。
+ 集群置放群组中的两个实例之间的最大网络吞吐量流量速度受两个实例中的较慢实例限制。对于具有高吞吐量要求的应用程序，请选择其网络连接满足您要求的实例类型。
+ 对于启用了增强联网的实例，以下规则适用：
  + 对于单个流的流量，集群置放群组中的实例最多可以使用 10 Gbps。对于单个流的流量，不在集群置放群组中的实例最多可以使用 5 Gbps。
  + 在同一个区域中，通过公有 IP 地址空间或者通过 VPC 终端节点往返于 Amazon S3 存储桶之间的流量可以使用所有可用的实例聚合带宽。
+ 您可以将多种类型的实例启动到集群置放群组中。不过，这会降低提供所需容量以成功完成启动的可能性。我们建议集群置放群组中的所有实例使用相同的实例类型。
+ 我们建议您通过[在集群置放群组中创建按需容量预留](cr-cpg.md)来明确集群置放群组中的预留容量。请注意，您无法使用区域预留实例预留容量，因为它们无法在置放群组中明确预留容量。
+ 对于集群放置组，指向互联网的网络流量以及通过 Direct Connect 连接指向本地资源的流量限制为 5 Gbps。

## 分区置放群组
<a name="placement-groups-partition"></a>

分区置放群组可帮助您的应用程序减少相关硬件故障的可能性。在使用分区置放群组时，Amazon EC2 将每个群组划分为多个逻辑段（称为“分区”）。Amazon EC2 确保置放群组中的每个分区具有自己的一组机架。每个机架具有自己的网络和电源。置放群组中的任何两个分区将不会分享相同的机架，从而让您可以在您的应用程序中隔离硬件故障的影响。

下图是单个可用区中的分区置放群组简单的直观表示。它显示了放入到一个分区置放群组的实例，该置放群组具有三个分区 — **分区 1**、**分区 2** 和 **分区 3**。每个分区均包含多个实例。一个分区中的实例不与其他分区中的实例共享机架，这使您可以将单一硬件故障的影响限定在相关的分区内。

![\[具有 3 个分区的分区置放群组。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/placement-group-partition.png)


可使用分区置放群组跨不同机架部署大型分布式和重复的工作负载，例如 HDFS、HBase 和 Cassandra。当您在分区置放群组中启动实例时，Amazon EC2 将尝试跨您指定数量的分区均匀分发实例。您还可以在特定分区中启动实例，以更好地控制实例的放置位置。

分区置放群组可以在同一区域的多个可用区中具有分区。对于每个可用区，一个分区置放群组最多可具有 7 个分区。可在分区置放群组启动的实例的数量仅受账户限制的限制。

此外，分区置放群组提供对分区的可见性，您可以查看哪些实例位于哪些分区中。您可以与具有感知技术能力的应用程序共享此信息，例如 HDFS、HBase 和 Cassandra。这些应用程序使用此信息做出智能数据复制决策，用于提升数据的可用性和持久性。

如果在一个分区置放群组中启动一个实例，而没有足够的独特硬件来满足请求，则请求将失败。Amazon EC2 会随着时间的推移提供更多不同的硬件，因此，您稍后可以重试请求。

**规则和限制**

以下规则适用于分区置放群组：
+ 对于每个可用区，一个分区置放群组最多支持 7 个分区。您可在分区置放群组中启动的实例的数量仅受账户限制的限制。
+ 当您在分区置放群组中启动实例时，Amazon EC2 将尝试跨所有分区均匀分发实例。Amazon EC2 不保证跨所有分区均匀分发实例。
+ 具有 专用实例 的分区置放群组最多可具有 2 个分区。
+ 容量预留不会在分区放置组中预留容量。

## 分布置放群组
<a name="placement-groups-spread"></a>

分布置放群组是将实例分别置放在不同硬件上的实例群组。

建议在具有少量应单独放置的重要实例的应用程序中使用分布置放群组。通过在分布置放群组中启动实例，可以降低在实例位于同一设备中时同时出现故障的风险。分布置放群组使用不同的硬件，因而适合混用不同类型的实例或随着时间推移逐步启动实例的场景。

如果在一个排列置放群组中启动一个实例，而没有足够的独特硬件来满足请求，则请求将失败。Amazon EC2 会随着时间的推移提供更多不同的硬件，因此，您稍后可以重试请求。置放群组可以跨机架或主机分布实例。机架级别的分布置放群组可在 AWS 区域和 AWS Outposts 中使用。主机级别的分布置放群组只能用于 AWS Outposts。

**机架级别的分布置放群组**  
下图显示单个可用区中的 7 个实例，这些实例已放入一个分布置放群组。将七个实例置放在七个不同的机架上，每个机架都具有自己的网络和电源。

![\[分布置放群组。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/placement-group-spread.png)


机架级别的分布置放群组可以跨越同一区域中的多个可用区。在一个区域中，每个机架级别的分布置放群组在每个可用区中最多可以运行七个实例。通过 Outpost，机架级别的分布置放群组可以容纳与 Outpost 部署中机架数量一样多的实例。

**主机级别分布置放群组**  
主机级别的分布置放群组仅适用于 AWS Outposts。主机级别的分布置放群组可以容纳与 Outpost 部署中的主机数量一样多的实例。有关更多信息，请参阅 [AWS Outposts 上的置放群组](placement-groups-outpost.md)。

**规则和限制**

以下规则适用于分布置放群组：
+ 机架分布置放群组最多支持在每个可用区运行七个实例。例如，在具有三个可用区的区域中，您可以在组中总共运行 21 个实例，每个可用区 7 个实例。如果您尝试在同一可用区和同一个分布置放群组中启动第八个实例，则该实例将无法启动。如果需要在一个可用区中运行超过七个实例，则建议使用多个分布置放群组。使用多个分布置放群组并不能保证实例在群组之间分布，但可帮助确保每个群组内的分布，从而限制某些故障类别的影响。
+ 专用实例 不支持分布置放群组。
+ 主机级别分布置放群组仅适用于 AWS Outposts 上的置放群组。主机级别的分布置放群组可以容纳与 Outpost 部署中的主机数量一样多的实例。
+ 在一个区域中，每个机架级别的分布置放群组在每个可用区中最多可以运行七个实例。通过 AWS Outposts，机架级别的分布置放群组可以容纳与 Outpost 部署中机架数量一样多的实例。
+ 容量预留不会在分布放置组中预留容量。

# 为 EC2 实例创建置放群组
<a name="create-placement-group"></a>

您可以使用置放群组来控制实例相对于彼此的置放。创建置放群组后，您可以启动置放群组中的实例。

**限制**  
每个区域最多可创建 500 个置放群组。

------
#### [ Console ]

**创建置放群组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Placement Groups**。

1. 选择**创建置放群组**。

1. 指定群组的名称。

1. 为群组选择置放策略：**集群**、**分布**或**分区**。

   如果选择**分布**，则必须选择分布级别：**机架**或**主机**。

   如果选择**分区**，则必须输入该群组的分区数。

1. （可选）要添加标签，请选择**添加新标签**，然后输入键和值。

1. 选择**创建群组**。

------
#### [ AWS CLI ]

使用 [create-placement-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-placement-group.html) 命令。

**创建集群置放群组**  
以下示例创建一个使用 `purpose` 置放策略的置放群组，并应用键为 `cluster` 且值为 `production` 的标签。

```
aws ec2 create-placement-group \
    --group-name my-cluster \
    --strategy cluster \
    --tag-specifications 'ResourceType=placement-group,Tags={Key=purpose,Value=production}'
```

**创建分区置放群组**  
以下示例创建一个使用 `partition` 置放策略的置放群组，并使用 `--partition-count` 参数指定五个分区。

```
aws ec2 create-placement-group \
    --group-name HDFS-Group-A \
    --strategy partition \
    --partition-count 5
```

------
#### [ PowerShell ]

使用 [New-EC2PlacementGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2PlacementGroup.html) cmdlet。

**创建集群置放群组**  
以下示例创建了一个集群置放群组。

```
New-EC2PlacementGroup `
    -GroupName my-placement-group `
    -Strategy cluster
```

**创建分区置放群组**  
以下示例创建一个分区置放群组。

```
New-EC2PlacementGroup `
    -GroupName my-placement-group `
    -Strategy partition `
    -PartitionCount 5
```

------

# 更改 Amazon EC2 实例的置放
<a name="change-instance-placement-group"></a>

可以如下所示更改实例的置放群组：
+ 将实例添加到置放群组
+ 将实例从一个置放群组移动到另一个置放群组
+ 从置放群组中删除实例

**要求**  
在更改实例的置放群组之前，该实例必须处于 `stopped` 状态。

------
#### [ Console ]

**更改实例置放**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 依次选择**操作**、**实例设置**、**修改实例放置**。

1. 对于**置放群组**，请执行以下操作之一：
   + 要将实例添加到置放群组，请选择该置放群组。
   + 要将实例从一个置放群组移动到另一个，请选择该置放群组。
   + 要从置放群组中移除实例，请选择**无**。

1. 选择**保存**。

------
#### [ AWS CLI ]

**将实例移动到置放群组**  
使用以下 [modify-instance-placement](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-placement.html) 命令。

```
aws ec2 modify-instance-placement \
    --instance-id i-0123a456700123456 \
    --group-name MySpreadGroup
```

**从置放群组中删除实例**  
使用以下 [modify-instance-placement](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-placement.html) 命令。当您为置放群组名称指定空字符串时，这会将实例从当前所在的置放群组中移除。

```
aws ec2 modify-instance-placement \
    --instance-id i-0123a456700123456 \
    --group-name ""
```

------
#### [ PowerShell ]

**将实例移动到置放群组**  
使用 [Edit-EC2InstancePlacement](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstancePlacement.html) cmdlet 和置放群组的名称。

```
Edit-EC2InstancePlacement `
    -InstanceId i-0123a456700123456 `
    -GroupName MySpreadGroup
```

**从置放群组中删除实例**  
使用 [Edit-EC2InstancePlacement](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstancePlacement.html) cmdlet，并将置放群组名称设为空字符串。

```
Edit-EC2InstancePlacement `
    -InstanceId i-0123a456700123456 `
    -GroupName ""
```

------

# 删除置放群组
<a name="delete-placement-group"></a>

如果您需要替换或不再需要某个置放群组，您可以将其删除。在删除置放群组之前，该群组中不能包含任何实例。您可以终止实例，将这些实例移动到另一个置放群组，或者将其从置放群组中删除。

------
#### [ Console ]

**删除置放群组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Placement Groups**。

1. 选择该置放群组，然后依次选择**操作**、**删除**。

1. 提示进行确认时，输入 **Delete**，然后选择 **Delete**（删除）。

------
#### [ AWS CLI ]

**删除置放群组**  
使用 [delete-placement-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-placement-group.html) 命令。

```
aws ec2 delete-placement-group --group-name my-cluster
```

------
#### [ PowerShell ]

**删除置放群组**  
使用 [Remove-EC2PlacementGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2PlacementGroup.html) cmdlet。

```
Remove-EC2PlacementGroup -GroupName my-cluster
```

------

# 共享置放群组
<a name="share-placement-group"></a>

通过置放群组共享，您可以影响由单独 AWS 账户拥有的相互依赖实例的置放。所有者可在多个 AWS 账户 之间或在其组织内共享一个置放群组。参与者可以在与其账户共享的置放群组中启动实例。

置放群组所有者可与以下人员共享置放群组：
+ 其组织内部或外部的特定 AWS 账户
+ 其 组织内的组织部门
+ 其整个 组织

可以使用 VPC 对等连接独立 AWS 账户拥有的实例，获得共享集群置放群组提供的全部延迟优势。

**Topics**
+ [规则和限制](#share-placement-group-limitations)
+ [所需的权限](#share-placement-group-permissions)
+ [跨可用区共享](#share-placement-group-sharing-azs)
+ [置放群组共享](#share-placement-group-share)
+ [取消置放群组共享](#share-placement-group-unshare)

## 规则和限制
<a name="share-placement-group-limitations"></a>

当您共享置放群组或与您共享置放群组时，请遵循以下规则和限制。
+ 要共享置放群组，您必须在您的 AWS 账户中拥有该置放群组。无法共享已与自己共享的置放群组。
+ 共享分区或扩展分布置放群组时，置放群组限制不会改变。共享分区置放群组支持每个可用区最多七个分区，共享分布置放群组支持每个可用区最多七个运行实例。
+ 要与您的组织或组织内的组织部门共享放置组，您必须允许与 AWS Organizations 共享。有关更多信息，请参阅[共享 AWS 资源](https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html)。
+ 使用 AWS 管理控制台 启动实例时，可以选择已与自己共享的任何置放群组。使用 AWS CLI 启动实例时，必须按 ID 而非名称来指定共享置放群组。只有当您是共享置放群组的所有者时，才能使用置放群组的名称。
+ 您负责管理共享置放群组中您拥有的实例。
+ 您无法查看或修改与共享置放群组有关但不属于您的实例和容量预留。
+ 置放群组的 Amazon 资源名称（ARN）包含拥有该置放群组的账户 ID。您可以使用置放群组 ARN 的账户 ID 部分来识别与您共享的置放群组的所有者。

## 所需的权限
<a name="share-placement-group-permissions"></a>

要共享置放群组，用户必须具有执行以下操作的权限：
+ `ec2:PutResourcePolicy`
+ `ec2:DeleteResourcePolicy`

## 跨可用区共享
<a name="share-placement-group-sharing-azs"></a>

为确保资源分配到区域的各可用区，我们将可用区独立映射到每个账户的名称。这可能会导致账户之间的可用区命名差异。例如，您的 `us-east-1a` 账户的可用区 AWS 可能与另一 `us-east-1a` 账户的 AWS 不在同一位置。

要指定专属主机相对于账户的位置，您必须使用*可用区 ID*（AZ ID）。AZ ID 是跨所有 AWS 账户的可用区的唯一且一致的标识符。例如，`use1-az1` 是 `us-east-1` 区域的可用区 ID，它在每个 AWS 账户中的位置均相同。有关更多信息，请参阅 [AZ IDs](https://docs.aws.amazon.com/global-infrastructure/latest/regions/az-ids.html)。

## 置放群组共享
<a name="share-placement-group-share"></a>

要共享置放群组，您必须将其添加到资源共享。资源共享是一项 AWS RAM 资源，可让您跨 AWS 账户共享资源。资源共享指定要共享的资源以及与之共享资源的使用者。

如果您属于 AWS Organizations 中的某个组织并且已在您的组织中启用共享，则组织中的使用者将获得对共享置放群组的访问权限。

如果将置放群组与您组织以外的 AWS 账户共享，则 AWS 账户所有者将会收到加入资源共享的邀请。他们可在接受邀请后访问共享的置放群组。

您可以使用 AWS Resource Access Manager 在多个 AWS 账户之间共享置放群组。有关更多信息，请参阅《AWS RAM User Guide》**中的 [Creating a resource share](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-create.html)。

## 取消置放群组共享
<a name="share-placement-group-unshare"></a>

置放群组所有者随时可以将共享置放群组取消共享。将共享置放群组取消共享时，将发生以下更改：
+ 与之共享置放群组的 AWS 账户将无法再启动实例或预留容量。
+ 任何正在共享置放群组中运行的实例都将与该置放群组断开关联，但会继续在 AWS 账户中运行。
+ 共享置放群组中的所有容量预留容量都将与该置放群组断开关联，但仍可在 AWS 账户中可用。

有关更多信息，请参阅《AWS RAM User Guide》**中的 [Deleting a resource share](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-delete.html)。

# AWS Outposts 上的置放群组
<a name="placement-groups-outpost"></a>

AWS Outposts 是一项完全托管的服务，可将 AWS 基础设施、服务、API 和工具扩展到客户场所。通过提供对 AWS 托管基础设施的本地访问，AWS Outposts 使客户能够使用与 AWS 区域中相同的编程接口在本地构建和运行应用程序，同时使用本地计算和存储资源来满足更低的延迟和本地数据处理需求。

Outpost 是部署在客户站点的 AWS 计算和存储容量池。AWS 作为 AWS 区域的一部分运营、监控和管理此容量。

您可以在您在账户中创建的 Outpost 上创建置放群组。从而将实例分布在您站点中的 Outpost 上的底层硬件上。在 Outpost 上创建和使用置放群组的方式与您在常规可用区中创建和使用置放群组时相同。当您在 Outpost 上创建具有分布策略的置放群组时，您可以选择让置放群组跨主机或机架分布实例。跨主机分布实例允许您使用具有单个机架 Outpost 的分布策略。

**注意事项**
+ 机架级别的分布置放群组可以容纳与 Outpost 部署中机架数量一样多的实例。
+ 主机级别的分布置放群组可以容纳与 Outpost 部署中的主机数量一样多的实例。

**先决条件**  
您的站点必须安装一个 Outpost。有关更多信息，请参阅 *AWS Outposts 用户指南*中的[创建 Outpost 并订购 Outpost 容量](https://docs.aws.amazon.com/outposts/latest/userguide/order-outpost-capacity.html)。

**在 Outpost 上使用置放群组**

1. 在 Outpost 上创建子网。有关更多信息，请参阅 *AWS Outposts 用户指南*中的[创建子网](https://docs.aws.amazon.com/outposts/latest/userguide/launch-instance.html#create-subnet)。

1. 在与该 Outpost 关联的区域中创建一个置放群组。如果您创建具有分布策略的置放群组，则可以选择主机或机架分布级别，以确定该群组将如何在 Outpost 上的底层硬件之间分布实例。有关更多信息，请参阅 [为 EC2 实例创建置放群组](create-placement-group.md)。

1. 将一个实例启动到置放群组。对于 **Subnet**（子网），选择您在第 1 步中创建的子网，然后对于 **Placement group name**（置放群组名称），选择您在第 2 步中创建的置放群组。有关更多信息，请参阅 *AWS Outposts 用户指南*中的[在 Outpost 中启动实例](https://docs.aws.amazon.com/outposts/latest/userguide/launch-instance.html#launch-instances)。