Amazon EC2 プレイスメントグループについて整理してみた

# 背景・目的
AWS Certified Advanced Networking - Specialtyの学習の過程で、プレイスメントグループという概念が登場したのであらためて整理してみたいと思います。

# まとめ
NWのパフォーマンスを向上させるには、下記の方法があります。
- プレイスメントグループ
- 拡張ネットワーキング
- Elastic Fabrick Adapter（EFA）
- プレイスメントグループは下記の特徴があります。

|特徴 |説明 |
|:--|:--|
|概要|相互に依存するEC2インスタンスのグループをプレイスメントグループ内に作成することで、パフォーマンスを向上させることができる。|
|プレイスメント戦略|・クラスタ<BR>・パーティション<BR>・スプレッド|
|料金|プレイスメントグループ単体で発生しない|

プレイスメントグループの戦略ごとの特徴は下記のとおりです。

|戦略|特徴|用途|アベイラビリティゾーン(AZ)|ラック|
|:--|:--|:--|:--|:--|
|クラスタ|同一の低遅延ネットワーク上にインスタンスを配置。ネットワーク遅延最小化と高いスループットを提供。|高性能計算（HPC）、大規模データベース、リアルタイムビッグデータ処理。|同一AZ内|同一ラックまたは近接ラック|
|パーティション|インスタンスを複数のパーティションに分割し配置。大規模な分散アプリケーションに適している。	|大規模な分散システム|同一AZ内|異なるラックに分割|
|スプレッド|インスタンスを物理的に分散配置。単一のハードウェア障害が複数のインスタンスに影響を与えるリスクを低減。|各インスタンスの障害分離が重要なアプリケーション|同一または複数のAZ|異なるラックに分割|


# 概要
[Amazon EC2におけるネットワーク](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-networking.html)をもとに整理します。

> ネットワークのパフォーマンスを向上させ、レイテンシーを低減するために、プレイスメントグループ内でインスタンスを起動できます。拡張ネットワーキングを使用すると、1 秒あたりのパケット (PPS) のパフォーマンスが大幅に向上します。Elastic Fabric Adapter (EFA) を使用すると、ハイパフォーマンスコンピューティングおよび機械学習アプリケーションを高速化できます。EFA は、サポートされているインスタンスタイプにアタッチできるネットワークデバイスです。

NWのパフォーマンスを向上させるには、下記の方法がある
- プレイスメントグループ
- 拡張ネットワーキング
- Elastic Fabrick Adapter（EFA）

## プレイスメントグループ
[プレイスメントグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/placement-groups.html)を元に整理します。

> ワークロードのニーズを対応するために、相互に依存する EC2 インスタンスのグループをプレイスメントグループ内に作成して、そのプレイスメントに影響を与えることができます。
> ワークロードのタイプに応じて、以下のいずれかのプレイスメント戦略によりプレイスメントグループを作成できます。
> - [クラスター] – アベイラビリティーゾーン内でインスタンスをまとめます。この戦略により、ワークロードは、ハイパフォーマンスコンピューティング (HPC) アプリケーションで典型的な緊密に組み合わされたノード間通信に必要な低レイテンシーネットワークパフォーマンスを実現できます。
> - パーティション – インスタンスを複数の論理パーティションに分散させ、1 つのパーティション内のインスタンスのグループが基盤となるハードウェアを別のパーティション内のインスタンスのグループと共有しないようにします。この戦略は、Hadoop、Cassandra、Kafka などの大規模な分散および複製ワークロードで一般的に使用されます。
> - スプレッド 相関性のエラーを減らすために、少数のインスタンスを基盤となるハードウェア全体に厳密に配置します。

- 相互に依存するEC2インスタンスのグループをプレイスメントグループ内に作成することで、パフォーマンスを向上させることができる。
- プレイスメント戦略には、下記のものがある
    - クラスタ
    - パーティション
    - スプレッド

> プレイスメントグループは任意で選択します。インスタンスをリプレイスメントグループに作成しない場合、EC2 は、関連する障害を最小限に抑えるために、すべてのインスタンスが基盤となるハードウェア全体に分散されるような方法でインスタンスを配置しようとします。

- デフォルトではEC2は関連する障害を最小限に抑えるように配置する

> プレイスメントグループを作成するための料金は発生しません。

- プレイスメントグループに料金は発生しない

### プレイスメントグループの戦略
#### クラスタープレイスメントグループ
> クラスタープレイスメントグループは、単一のアベイラビリティーゾーン内のインスタンスを論理的にグループ化したものです。クラスタープレイスメントグループは、同じリージョン内の複数のピア接続 VPC にまたがることができます。同じクラスタープレイスメントグループ内のインスタンスは、TCP/IP トラフィックのフローあたりのスループット上限が高くなり、ネットワークの二分帯域幅の広い同じセグメントに配置されます。

- 単一AZのインスタンスを論理的にグルーピングしたもの
- 同じリージョン内の複数のVPC （Peering）にまたがることができる
- スループット上限が高くなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/774874a4-3c6e-be79-b533-49f882e6287d.png)


> 低いネットワークレイテンシー、高いネットワークスループット、またはその両方からメリットを受けるアプリケーションの場合は、クラスタープレイスメントグループの使用をお勧めします。また、ネットワークトラフィックの大部分がグループ内のインスタンス間で発生している場合にもお勧めします。プレイスメントグループで、最も低いレイテンシーと最も高いネットワークパフォーマンス (1 秒あたりパケット数) を実現するためには、拡張ネットワーキングをサポートするインスタンスタイプを選択します。詳細については、「拡張ネットワーキング」を参照してください。
インスタンスは、次の方法で起動することをお勧めします。
> - プレイスメントグループ内で必要な数のインスタンスを起動するには、1 つの起動リクエストを使用します。
> - プレイスメントグループ内のすべてのインスタンスに同じインスタンスタイプを使用します。

> 後でプレイスメントグループにさらにインスタンスを追加しようとした場合、またはプレイスメントグループ内で複数のインスタンスタイプを起動しようとした場合、容量不足エラーが発生する可能性が高くなります。
> プレイスメントグループ内のインスタンスを停止して再起動しても、そのインスタンスは同じプレイスメントグループ内で実行されます。ただし、インスタンスに対して十分な容量がない場合、起動は失敗します。
> 既にインスタンスを実行中のプレイスメントグループ内のインスタンスを起動するときに容量エラーを受け取った場合は、プレイスメントグループ内のすべてのインスタンスを停止して開始し、もう一度起動を試みてください。インスタンスを起動すると、すべてのリクエストしたインスタンスに応じた容量があるハードウェアにインスタンスが移行される場合があります。


#### パーティションプレイスメントグループ
> パーティションプレイスメントグループは、アプリケーションに関連するハードウェア障害の頻度を軽減するために役立ちます。パーティションプレイスメントグループを使用する場合、Amazon EC2 は各グループをパーティションと呼ばれる論理的なセグメントに分割します。Amazon EC2 では、プレイスメントグループ内の各パーティションにそれぞれ一連のラックがあります。各ラックには独自のネットワークおよび電源があります。プレイスメントグループ内のパーティションどうしが同じラックを共有することはありません。これにより、アプリケーション内でのハードウェア障害による影響を隔離できます。

- アプリケーションに関連するHW障害の頻度を軽減するのに効果的
- 各グループをパーティションと呼ばれる論理的なセグメントに分割する
    - プレイスメントグループ内の各パーティションにそれぞれ一連のラックがある
    - ラックには独自のNWと電源がある（通常のデータセンターのラックと同じ）
- プレイスメントグループ内のパーティション同士が同じラックを共有しない
    - HW障害による影響を隔離する

> 次のイメージは、単一のアベイラビリティーゾーン内のパーティションプレイスメントグループのシンプルな描写を示しています。ここでは、3 つのパーティション (パーティション 1、パーティション 2、パーティション 3) があるパーティションプレイスメントグループに配置されたインスタンスを示しています。各パーティションは複数のインスタンスで構成されています。各パーティション内のインスタンスは、他のパーティション内のラックを共有しないため、単一のハードウェア障害の影響は関連付けられたパーティションのみに留まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/225bd3cc-4828-65da-3c94-4dd015130790.png)

- パーティションとラックが同じ？

> パーティションプレイスメントグループは、HDFS、HBase、Cassandra などの大規模な分散および複製ワークロードを異なるラック間でデプロイするために使用できます。インスタンスをパーティションプレイスメントグループに起動すると、Amazon EC2 は、指定したパーティション数全体にインスタンスを均等に分散しようとします。インスタンスを特定のパーティションに起動して、インスタンスの配置場所をより細かく制御することもできます。

- 大規模分散ワークロードを異なるラック間でデプロイするために使用できる。
    - HadoopやHBaseなど
- インスタンスを起動すると、EC2は指定したパーティション数全体にインスタンスを均等に分散しようとする。

> パーティションプレイスメントグループは、同じリージョン内の複数のアベイラビリティーゾーンにパーティションを持つことができます。パーティションプレイスメントグループは、アベイラビリティーゾーンごとに最大 7 つのパーティションを持つことができます。パーティションプレイスメントグループで起動できるインスタンス数の制限は、アカウントの制限のみです。

- 同一リージョン内の複数AZにパーティションを持つことができる。
- AZごとに最大7つのパーティションを持つことができる
- パーティションプレイスメントグループで起動できるインスタンス数の制限はアカウントの制限のみ

> また、パーティションプレイスメントグループでは各パーティションが可視化されるため、どのインスタンスがどのパーティションにあるかを確認できます。この情報は、HDFS、HBase、Cassandra などトポロジー対応アプリケーションと共有できます。これらのアプリケーションはこの情報を利用してインテリジェントなデータレプリケーションの決定を行い、データの可用性と耐久性を向上します。

- パーティションプレイスメントグループでは各パーティションが可視化される
- どのインスタンスがどのパーティションにあるかを確認できる
- データの可用性と耐久性を向上する

> パーティションプレイスメントグループでインスタンスを開始または起動し、リクエストを実行するための固有のハードウェアが不足している場合、そのリクエストは失敗します。Amazon EC2 では、時間の経過とともに、より明確なハードウェアを利用できるようになるため、後でリクエストを再試行できます。

- 起動時に固有のHWが不足している場合、リクエストは失敗することがある

#### スプレッドプレイスメントグループ
> スプレッドプレイスメントグループは、それぞれ異なるハードウェアに配置されるインスタンスのグループです。
- 異なるHWに配置されるインスタンスのグループ

> スプレッドプレイスメントグループは、少数の重要なインスタンスが互いに分離して保持される必要があるアプリケーションに推奨されます。スプレッドレベルのプレイスメントグループでインスタンスを起動すると、インスタンスが同じ機器を共有するときに発生し得る同時障害のリスクが軽減されます。スプレッドレベルのプレイスメントグループは、異なるハードウェアへのアクセスを提供するため、長時間のインスタンスタイプの混合やインスタンスの起動に適しています。

- インスタンスが同じ機器を共有するときに発生しうる同時障害リスクが軽減される
- 異なるHW障害へのアクセスを提供する
- 長時間のインスタンスタイプの混合、インスタンスの起動に適している。

> スプレッドプレイスメントグループでインスタンスを開始または起動し、リクエストを実行するための固有のハードウェアが不足している場合、そのリクエストは失敗します。Amazon EC2 では、時間の経過とともに、より明確なハードウェアを利用できるようになるため、後でリクエストを再試行できます。プレイスメントグループは、ラックまたはホスト全体でインスタンスを分散できます。ホストレベルのスプレッドプレイスメントグループは、AWS Outposts を使用する場合にのみ使用できます。

> ラックスプレッドレベルのプレイスメントグループ
次の図は、1 つのアベイラビリティーゾーン内の、スプレッドプレイスメントグループに配置された 7 つのインスタンスを示しています。7 つのインスタンスは、7 つの異なるラックに配置され、各ラックは独自のネットワークおよび電源を備えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6a3e1a54-9c39-0e63-93dd-d99d89e86596.png)

# 実践
## クラスタプレイスメントグループの作成
1. AWSにサインインし、EC2に遷移します。
1. ナビゲーションペインで「プレイスメントグループ」をクリックします。
1. 「プレイスメントグループを作成」をクリックします。
1. 下記を入力し、「グループを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8ded2581-797e-21f4-54dc-42b78dc486cc.png)

1. EC2ダッシュボードで「インスタンスを起動」をクリックします。
1. アーキテクチャは64ビット(Arm)、インスタンスタイプは「m7g.medium」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6bcb1421-6719-8ccb-a1ac-717b36bb9442.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e6459b3f-92fc-4fe8-2767-bb0df35138b1.png)

1. 「高度な詳細」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/65ae2798-c8af-74d6-24ee-1bb38d4b2f1d.png)

1. 作成したプレイスメントグループを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/00cbafe4-617f-c5d1-c7d2-854d038c1bb4.png)

1. インスタンス数を指定し、「インスタンスを起動」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/12e7ad61-e550-c5c8-1afe-f72535b026fd.png" width=400 />
1. 「キーペアなしで続行」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/80daa8ca-7ccb-3dcb-a2f5-dcc316f3122f.png" width=400 />

1. EC2インスタンスの画面を見ると、起動されていることがわかります。任意のインスタンスを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5bc05016-456c-a794-f93d-3d6e1097ed29.png)
1. 「詳細」タブで、ホストとプレイスメントグループを見ると、「Cluster」で作成されていることがわかりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e335e5ed-6426-381a-8c26-55ba348ff673.png)

## パーティションプレイスメントグループの作成
1. プレイスメント戦略を「パーティション」、パーティション数は「2」を選択し、「グループを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bcf44b7a-39bc-2060-5172-11bb62b8d77e.png)
1. EC2インスタンスの作成で、プレイスメントグループを「parition」、ターゲットを「1」として2つのインスタンスを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/562c1e9c-e990-01d4-0008-deff74323078.png)
1. 2台起動されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8c65c9b1-b7bc-df77-d916-79400c910126.png)
1. プレイスメントグループ「partition」、パーティション番号は「1」で作成されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5c387528-0285-4578-cd16-fd985cd39bf5.png)

## スプレッドプレイスメントグループの作成
1. スプレッドを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f1ae4ff0-7aa1-35a8-1393-4b210592a98a.png)

1. EC2インスタンスの起動では、「spread」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/42aa6164-a314-20f6-a3fa-d6c7e774d7b1.png)
1. 4台起動します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0806d252-fd59-d7a2-06cb-0459ec912bdb.png" width=400 />
1. 起動されました。任意の一台を選びます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/be8d714f-42dd-d48e-fca6-9ca4c441e015.png)
1. 「spread」が選択されています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/65f0ca83-8693-edd7-d112-a0a0bda0fe85.png)

# 考察
今回は、プレイスメントグループについて整理してみました。私がよく使うSparkなどではクラスタプレイスメントグループが適していると思いました。

# 参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/placement-groups.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-networking.html