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 ポリシーを用いて複数の仮想サーバを別々の物理サーバ上に作成することが必要です。

本パターンでは、以下にその手順を記載します。

構造 (イメージ図)#

image

実装サンプル#

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の仮想サーバで業務継続が可能です。