SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

複数のストレージアカウントを使用して仮想マシンのディスクを配置

leave a comment

Azure で仮想マシンを作成した場合、BLOB ストレージに VHD が保存されます。
仮想マシンでは、

  • OS ディスク
  • データディスク

の 2 種類のディスクがありますが、通常は単一のストレージアカウントのコンテナ内にディスクを配置するかと思います。

このディスクを同一のサブスクリプションの複数のストレージアカウントを使用して配置する方法を。
# SQL Server 2014 のデータベースの直接配置はコンテナーの SAS を使用しますのでサブスクリプションが異なっていても配置できるかと思いますが。

複数のストレージアカウントを使用するケースとしては、

  • ディスクの用途によってレプリケーションの設定 (ローカル冗長 / ジオ冗長等) を変更する
  • ストレージアカウント単位の IOPS 上限 (20,000 IOPS) を緩和させる

というような目的が考えられるかと思います。

SQL Server のデータベースを BLOB ストレージに保存する場合、データファイル (mdf / ndf) とログファイル (ldf) を同一の VHD 内で完結させた場合は単一のファイル (VHD) でデータベースの整合性が取れるため、ジオ冗長を使用することができます。
Azure の仮想マシン内の SQL Server の高可用性と災害復旧

別個のディスク上のデータ ファイルおよびログ ファイルに対してはジオレプリケーションがサポートされない


Azure ディスク内のジオレプリケーションでは、同じデータベースのデータ ファイルおよびログ ファイルを別個のディスクに格納できません。GRS では、各ディスクの変更が個別に非同期的にレプリケートされます。このメカニズムでは、ジオレプリケートされたコピーの単一のディスク内の書き込み順序が保証されますが、複数のディスクのジオレプリケートされたコピー間の書き込み順序は保証されません。データ ファイルとログ ファイルが別々のディスクに格納されるようにデータベースを構成すると、障害後の復旧されたディスクにログ ファイルよりも新しいデータ ファイルのコピーが含まれる可能性があります。その場合、SQL Server の先行書き込みログとトランザクションの ACID プロパティが破損します。ストレージ アカウントにジオレプリケーションを無効にするオプションがない場合は、特定のデータベースのすべてのデータ ファイルとログ ファイルを同じディスクに格納する必要があります。データベースのサイズが大きいため複数のディスクを使用する必要がある場合は、上記のいずれかの災害復旧ソリューションをデプロイして、データの冗長性を確保する必要があります。

データファイルとログファイルへの IO が 500 IOPS に収まる場合は、同一の VHD 内にファイルを格納しても IOPS が最大の範囲の収まりますので、この場合はジオ冗長を使用するという選択肢をとることができます。

ストレージアカウント単位の最大 IOPS は 20,000 IOPS となるようですので VHD を 40 個程度配置するとこの上限に達する可能性が出てきます。
How to Monitor for Storage Account Throttling

The risk of storage account throttling having a negative performance impact on your VMs exists once you have more than 40 highly used disks in a single storage account. And with more than 40 disks in a single storage account, each disk wouldn’t need to be hitting the 500 IOPS limit for the entire storage account to be hitting the 20,000 IOPS limit

1 仮想マシンあたり 16 本までデータディスクを接続することができますので、40 というのは複数の仮想マシンのディスクをストレージに配置した場合になります。
SQL Server 2014 の場合は BLOB ストレージに直接データベースのファイルを配置できますので、1 仮想マシンで 20,000 IOPS を使い切ることもできるかと思います。
IOPS が高くなりそうな場合は複数のストレージアカウントにファイルを分散 / データベース単位にストレージアカウントを分けるという考えも出てくるかと。

 

データディスクの接続ですが、現行のポータルから空のディスクを接続しようとした場合は、OS ディスクと同一のコンテナー上に作成することになるかと思います。
# 既存のディスクを接続する場合は、サブスクリプション内の他のディスクに接続できるかと思います。

新規に異なるストレージアカウントにディスクを作成して接続する場合、

  • PowerShell を使用する
  • 新ポータル (現在 Preview) を使用する

の 2 パターンが考えられるかと。

仮想マシンにディスクを追加するためのコマンドレットとして、Add-AzureDataDisk があります。
このコマンドレットには、-MediaLocation というパラメーターがありますのでここでストレージアカウントを指定することができます。

Add-AzureAccount
Select-AzureSubscription -SubscriptionName "SubscriptionName" -Current
Get-AzureVM "ServiceName" -Name "VMName" | Add-AzureDataDisk -CreateNew -DiskSizeInGB 10 -DiskLabel "TEST" -LUN 1 -MediaLocation "https://StorageAccount.blob.core.windows.net/vhds/DataDisk.vhd" | Update-AzureVM

 

新ポータルからディスクを接続する場合もストレージアカウントを指定できます。

仮想マシンの Disks をクリックして、

image

[ATTACHNEW] の [STORAGE CONTAINER] からストレージアカウントを選択できますので、こちらから VHD を配置するストレージアカウントを指定することができます。

image

小規模であれば単一のストレージアカウントでも問題はないかと思いますが、複数台 / 大量の IOPS の仮想マシンを構築する場合はストレージアカウントを意識して作成する必要が出てくるのかなと。

Share

Written by Masayuki.Ozawa

8月 13th, 2014 at 8:37 pm

Leave a Reply