マイクロソフトAzureは、可用性セットと可用性ゾーンと呼ばれる物理的な障害の影響を与える範囲を定義しています。AWSのAvailability Zoneに相当する概念で、ゾーンを適切に分割しなければAzure内で障害が発生した場合に適切に切り替わりません。
参考資料
参考になる公式ドキュメントを以下に示します。
事前準備
以下、仮想ネットワーク等のリソースを作成します。
az group create --name MyResourceGroup --location japaneast az network vnet create \ --resource-group MyResourceGroup \ --name MyVnet \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name MySubnet \ --vnet-name MyVnet \ --address-prefixes 172.16.0.0/24
可用性ゾーン
可用性ゾーン使用可能なリージョンの確認
可用性ゾーンは電源やスイッチなど物理的な設備を共有するエリアです。可用性ゾーンを分けてサービスを配置すれば、電源設備などに障害が発生したとしてもサービスを継続する事ができます。
しかし、全てのリージョンに複数の可用性ゾーンが存在するわけではありません。可用性ゾーンに対応しているリージョンは「可用性ゾーンをサポートする Azure サービス」に記されています。
もし、公式ドキュメントを参照するのが手間ならば、CLIからも可用性ゾーンに対応しているかどうかを調べる事ができます。以下のようにaz vm list-skusを使いZones列を参照すれば、可用性ゾーンに対応しているかどうかを確認できます。
$ az vm list-skus \ --location japaneast \ --output table ResourceType Locations Name Zones Restrictions ---------------- ----------- -------------------- ------- --------------- availabilitySets japaneast Aligned None availabilitySets japaneast Classic None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None disks japaneast Premium_LRS 1,2,3 None <omitted> virtualMachines japaneast Standard_A1_v2 1,2,3 None virtualMachines japaneast Standard_A2m_v2 1,2,3 None virtualMachines japaneast Standard_A2_v2 1,2,3 None virtualMachines japaneast Standard_A4m_v2 1,2,3 None virtualMachines japaneast Standard_A4_v2 1,2,3 None virtualMachines japaneast Standard_A8m_v2 1,2,3 None virtualMachines japaneast Standard_A8_v2 1,2,3 None virtualMachines japaneast Standard_B12ms 1,2,3 None virtualMachines japaneast Standard_B16ms 1,2,3 None virtualMachines japaneast Standard_B1ls 1,2,3 None virtualMachines japaneast Standard_B1ms 1,2,3 None virtualMachines japaneast Standard_B1s 1,2,3 None <omitted>
可用性ゾーンを指定した仮想マシンの作成
前述のaz vm list-skusコマンドの出力のように、Azureは「1,2,3」の3つの可用性ゾーンを使えるリージョンが多く存在します。仮想マシン作成時に、zoneオプションを指定すると、仮想マシンを配置する可用性ゾーンを指定できます。作成例は以下の通りです。
az vm create \ --resource-group MyResourceGroup \ --name linux011 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 1 az vm create \ --resource-group MyResourceGroup \ --name linux012 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 2 az vm create \ --resource-group MyResourceGroup \ --name linux013 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --zone 3
コンピュートリソースの確認
コンピュートリソースが確かに可用性ゾーンで分離されている事を確認します。ポータル(GUI)ならば、仮想マシンの「概要」画面で、どの可用性ゾーンに属しているかを確認できます。
CLIならば以下のようなshowコマンドを使用します。
az vm show \ --resource-group MyResourceGroup \ --name linux011
出力例は以下の通りです。
$ az vm show \ --resource-group MyResourceGroup \ --name linux011 <omitted> "osDisk": { "caching": "ReadWrite", "createOption": "FromImage", "deleteOption": "Detach", "diffDiskSettings": null, "diskSizeGb": 30, "encryptionSettings": null, "image": null, "managedDisk": { "diskEncryptionSet": null, "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/linux011_OsDisk_1_e4ebc26b05174ede84bccd65639d3f4d", "resourceGroup": "MyResourceGroup", "storageAccountType": "Premium_LRS" }, "name": "linux011_OsDisk_1_e4ebc26b05174ede84bccd65639d3f4d", "osType": "Linux", "vhd": null, "writeAcceleratorEnabled": null } }, "tags": {}, "type": "Microsoft.Compute/virtualMachines", "userData": null, "virtualMachineScaleSet": null, "vmId": "391c70a6-f195-414e-8466-53cab81a4989", "zones": [ "1" ] }
ストレージリソースの確認
OSディスクも可用性ゾーンで分離されている事を確認します。ポータル(GUI)ならば、仮想マシンの「ディスク」画面で「ディスク名」を押下します。
ディスクの「概要」画面で可用性ゾーンを確認します。
CLIならば以下のようなshowコマンドを使用します。
osdiskname=$(az vm show \ --resource-group MyResourceGroup \ --name linux011 \ --query "storageProfile.osDisk.name" \ --output tsv) az disk show \ --resource-group MyResourceGroup \ --name ${osdiskname}
出力例は以下の通りです。
$ az disk show \ --resource-group MyResourceGroup \ --name ${osdiskname} <omitted> "supportsHibernation": null, "tags": {}, "tier": "P4", "timeCreated": "2022-03-07T04:09:11.251421+00:00", "type": "Microsoft.Compute/disks", "uniqueId": "e4ebc26b-0517-4ede-84bc-cd65639d3f4d", "zones": [ "1" ] }
次の検証シナリオの準備
以下スクリーンショットのように、デフォルト設定のサブスクリプションでは1リージョンあたりvCPUは10個までになっています。
次のシナリオでは仮想マシンを10個作成しますので、その準備として前述の操作で作成した仮想マシンを削除します。
for i in `seq 11 13`; do az vm delete \ --resource-group MyResourceGroup \ --name linux0${i} \ --yes done
可用性セット
可用性セットの定義
前述の「可用性ゾーン」の設定では、どの仮想マシンがどのゾーンに属すかを明示的に設定しました。しかし、この設定は仮想マシンの台数が増えれば設定が煩雑になり、どこかのゾーンに仮想マシンが偏ってしまう事故は容易に想像できるでしょう。
このような管理を自動的に定義するのが「可用性セット」と呼ばれる設定です。「可用性セット」は、どの程度分散させるかのパラメタ「障害ドメイン(platform-fault-domain)」「更新ドメイン(platform-update-domain)」で定義します。これら値を大きくすればするほど、仮想マシンは分散されます。
「可用性セット」の作成例は以下の通りです。
az vm availability-set create \ --resource-group MyResourceGroup \ --name MyAvailabilitySet \ --platform-fault-domain-count 2 \ --platform-update-domain-count 5
障害ドメイン
障害ドメインとは「電源とネットワーク スイッチを共有する仮想マシンのグループ」です。platform-fault-domain-countを3にすれば、3つのグループに仮想マシンが分散されます。
AWSは4つのAZを備えていますが、今のところAzureの可用性ゾーンは3つしかないので、Azureの場合はplatform-fault-domain-countに指定できる値は2か3のみです。
更新ドメイン
更新ドメインは「仮想マシンと同時に再起動できる基礎となる物理ハードウェアのグループ」です。端的に言えば、バージョンアップ等でハードウェアの再起動が必要になった時に影響を受ける範囲です。platform-update-domain-countは最大で10を指定できます。
可用性セットを指定した仮想マシンの作成
可用性セットを指定して仮想マシンを作成するには、availability-setに「可用性セット名」を指定します。操作例は以下の通りです。
「可用性ゾーン」と「可用性セット」は排他的な設定で、どちらか片方しか指定できません。
for i in `seq 20 29`; do az vm create \ --resource-group MyResourceGroup \ --name linux0${i} \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --availability-set MyAvailabilitySet done
可用性セットの確認
ポータル(GUI)のすべてのメニューから「コンピューティング」「可用性セット」の順に遷移します。
「Virtual Machine」の画面にて、作成した仮想マシンの「障害ドメイン」「更新ドメイン」が分散している事を確認します。