Anti-Affinity パターン#
本構成は東日本/西日本リージョン1・2向けとなります。
要求事項#
- SLAで保証されたFJcloud-Oの月間稼働率99.99%を実現したい
- 仮想サーバを運用系と待機系といった構成で分ける際に、それぞれの仮想サーバ群を確実に異なる物理サーバ上に配備することで、FJcloud-O内部での物理サーバ故障時の影響範囲を局所化するようにしたい
対応するデザインパターン概要#
FJcloud-Oでは、仮想サーバをサーバグループとしてまとめて登録し、そのサーバグループの挙動をポリシーとして指定することで、複数の仮想サーバをどのように物理サーバ上に配置するかを指定することができます。
具体的には、サーバグループ内の仮想サーバ群がどのように物理サーバ上に起動されるかを、以下のポリシーで指定します。
ポリシー | 仮想サーバの配備 |
---|---|
Affinity | Affinityポリシーのサーバグループに登録された仮想サーバ群は、可能な限り同一の物理サーバ上で起動されます。 |
Anti-Affinity | Anti-Affinityポリシーのサーバグループに登録された仮想サーバ群は、確実に別々の物理サーバ上で起動されます。 |
SLAで保証されたFJcloud-Oの月間稼働率99.99%を実現するには、同一リージョン内で 1 つ以上の Anti-Affinity ポリシーを用いて複数の仮想サーバを別々の物理サーバ上に作成することが必要です。
本パターンでは、以下にその手順を記載します。
構造 (イメージ図)#
実装サンプル#
1. サーバグループ作成#
APIを使用し、サーバグループを作成します。
- 設定項目(json)
項目 | 設定値例 | 内容 |
---|---|---|
$NAME | "cdp_server_group" | 任意のサーバグループ名を指定 |
$POLICY | "anti-affinity" | ポリシーを選択 - 別々の物理サーバに配備:"anti-affinity" - 同一の物理サーバに配備:"affinity" |
$AZ | "jp-east-2b" | 仮想サーバを作成するアベイラビリティゾーンを指定 |
- 実行API
curl -s $COMPUTE/v2/$PROJECT_ID/os-server-groups -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type:application/json" -d '{"server_group":{ "name": "'$NAME'", "policies": [ "'$POLICY'" ], "availability_zone": "'$AZ'"}}' | jq .
- 実行結果
- この後の仮想サーバの作成にあたり、
"id"
に続くサーバグループIDを変数($GROUP_ID
)に設定してください。 "members"
に続く値がなく、サーバグループにサーバが所属していないことが読み取れます。{ "server_group": { "members": [], "metadata": {}, "id": "838a085d-5b5a-4ac9-9a65-8a7817647178", "policies": [ "anti-affinity" ], "name": "cdp_server_group" } }
- この後の仮想サーバの作成にあたり、
2. 仮想サーバ作成#
(1) 仮想サーバ作成#
仮想サーバを、サーバグループの設定を含めたAPIで作成します。
- サーバグループの設定は、仮想サーバ作成のAPIに渡す json に、以下のパラメータを付与するだけです。
$GROUP_ID
は、上記の手順で生成されたサーバグループIDを設定します。
"os:scheduler_hints": {"group": "'$GROUP_ID'"}
- 設定項目(json)
項目 | 設定値例 | 内容 |
---|---|---|
$VM_NAME | "anti-affinity-test01" | 任意の仮想サーバ名を指定 |
$IMAGE_REF_ID | (イメージID) | FJcloud-Oで提供されるOSのイメージIDを指定 |
$FLAVOR_ID | (フレーバーID) | CPUとメモリの組み合わせを示すフレーバーのIDを指定 |
$VOL_SIZE | "30" | システムボリュームサイズをGB単位で指定 |
$DEVICE_NAME | "/dev/vda" | デバイス名を指定 |
$SOURCE | "image" | ボリューム元としてimageを指定 (他にvolume、snapshotを指定可能) |
$DESTINATION | "volume" | 接続先としてvolumeを指定 |
$ISDELETE | "1" | ボリュームの削除有無として"1"を指定 インスタンス作成時に作成したボリュームを、インスタンス削除時に削除するかどうかを指定 0:仮想サーバ作成時に作成したボリュームを、仮想サーバ削除時に一緒に削除しない 1:仮想サーバ作成時に作成したボリュームを、仮想サーバ削除時に一緒に削除する |
$KEY_NAME | "sample_key" | 仮想サーバへのログインで利用するキーペア名を指定 |
$INSTANCE_MAX | "1" | 最大配備数を指定 |
$INSTANCE_MIN | "1" | 最小配備数を指定 |
$NETWORK_ID | (ネットワークID) | 配備先のネットワークIDを指定 |
$SG_NAME1 | "SG_name1" | セキュリティグループ名を指定 |
$GROUP_ID | (サーバグループID) | 作成したサーバグループのIDを指定 |
- 実行API
curl -i $COMPUTE/v2/$PROJECT_ID/servers -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" -d '{"server": {"name": "'$VM_NAME'", "availability_zone": "'$AZ'", "imageRef": "", "flavorRef": "'$FLAVOR_ID'", "block_device_mapping_v2":[ {"boot_index": "0", "uuid":"'$IMAGE_REF_ID'", "volume_size": "'$VOL_SIZE'", "device_name": "'$DEVICE_NAME'", "source_type": "'$SOURCE'", "destination_type": "'$DESTINATION'", "delete_on_termination": "'$ISDELETE'"} ] , "key_name": "'$KEY_NAME'", "max_count": "'$INSTANCE_MAX'", "min_count": "'$INSTANCE_MIN'", "networks": [{"uuid": "'$NETWORK_ID'"}], "security_groups": [{"name": "'$SG_NAME1'"}]},"os:scheduler_hints": {"group": "'$GROUP_ID'"}}'
- 実行結果
- この後の仮想サーバの作成状況の確認のため、
"id"
に続く仮想サーバID を変数($VM_ID
)に設定してください。HTTP/1.1 202 Accepted X-Fcx-Endpoint-Request: EXECUTED_REQ382363362_202 Date: Fri, 26 Mar 2021 06:03:25 GMT Server: Apache location: http://10.39.0.201/v2/43163201158b4540bab958706b2d4259/servers/66ffd77e-2922-4c0c-8fa4-523004a36559 x-compute-request-id: req-e4dc6cdd-cf28-4f3d-8352-36a9cc2cf640 Cache-Control: no-cache X-Request-Id: cdc6d86d-988d-43f5-8154-98d9090bbad8 X-Runtime: 2.340000 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: application/json Content-Length: 412 {"server":{"security_groups":[{"name":"93879624-2836-4e47-9d8e-94ed6e8708dc"}],"OS-DCF:diskConfig":"MANUAL","id":"66ffd77e-2922-4c0c-8fa4-523004a36559","links":[{"href":"http://10.39.0.201/v2/43163201158b4540bab958706b2d4259/servers/66ffd77e-2922-4c0c-8fa4-523004a36559","rel":"self"},{"href":"http://10.39.0.201/43163201158b4540bab958706b2d4259/servers/66ffd77e-2922-4c0c-8fa4-523004a36559","rel":"bookmark"}]}}
- この後の仮想サーバの作成状況の確認のため、
(2) 仮想サーバ確認#
仮想サーバの作成状況を確認します。
$VM_ID
は、上記の手順で生成された仮想サーバIDを設定します。
- 実行API
curl -s $COMPUTE/v2/$PROJECT_ID/servers/$VM_ID -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | jq .
- 実行結果(抜粋)
- 仮想サーバの状態が
"status": "ACTIVE"
となり、仮想サーバにログインできることを確認してください。{ "server": { "status": "ACTIVE", "updated": "2021-03-26T06:03:41Z", "hostId": "bf96534e119c68cc439d7e047258814f660d24616a73f7c57b9f9aa1", "OS-EXT-SRV-ATTR:host": "jp4b01-pgy077-00", "addresses": { "suga-test-nw-east2b": [ { "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:5c:92:29", "version": 4, "addr": "192.168.0.92", "OS-EXT-IPS:type": "fixed" 〜以下省略〜
- 仮想サーバの状態が
(3) サーバグループ確認#
サーバグループに、作成された仮想サーバのIDが追加されたかを確認します。
- 実行API
curl -s $COMPUTE/v2/$PROJECT_ID/os-server-groups -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | jq .
- 実行結果
"members"
に続くIDが、今回サーバグループに追加された仮想サーバIDです。{ "server_groups": [ { "members": [ "66ffd77e-2922-4c0c-8fa4-523004a36559" ], "metadata": {}, "id": "838a085d-5b5a-4ac9-9a65-8a7817647178", "policies": [ "anti-affinity" ], "name": "cdp_server_group" } ] }
メリット・効果#
Anti-Affinity パターンを利用した場合のメリット・効果は以下の通りです。
- 複数の仮想サーバを、確実に別々の物理サーバ上に配備することで、FJcloud-O内部で物理サーバ故障時の影響範囲を局所化することが可能
注意事項#
-
本パターンは2021年3月時点のFJcloud-O 東日本/西日本リージョン1・2で動作検証しています。
-
シングルAZでオートスケールを利用する等、シングルAZ内部で仮想サーバを複数稼働させる場合は、Anti-Affinityを使用しないと、物理サーバの障害で複数の仮想サーバが同時に停止してしまう可能性があります。
-
仮想サーバのサーバグループへの登録は、仮想サーバの作成時のみ可能です。
登録するサーバグループは仮想サーバの作成前に作成してください。 -
サーバグループに登録された仮想サーバ群をすべて異なる物理サーバに配備できる空きがない場合はエラーとなります。
-
"専有インスタンス" 利用時は、Anti-Affinity設定は出来ません。
-
マルチAZ構成の場合も Anti-Affinity 設定は可能ですが、仮想サーバはAZごとに別の物理サーバに配備されているため、Anti-Affinityを設定しなくても、物理サーバ故障時に他のAZの仮想サーバで業務継続が可能です。