SE の雑記

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

VM Role で Azure Drive を使って SQL Server を実行してみる

one comment

VM Role で SQL Server を実行するための方法を少しまとめてみたいと思います。
MSDN フォーラムでもこの辺は話題になるみたいですね。
VMロール上でSQL Server
SQL Server installation using Azure VM role

実行することはできますが非サポートになるようですのでご利用は計画的に。

今回は Microsoft SQL Server2008 R2 RTM – Express with Advanced Services を使用しています。

■SQL Server の構成


VM Role で SQL Server のデータベースを永続化する構成を考えると以下のようになるかと思います。
image

共有機能はクライアントコンポーネントになりますので、非永続領域に保存していても問題ないと思っています。
# Azure Drive 上に共有機能を保持することも可能ですが。

SQL Server のコアとなるインスタンスに必要なプログラムやデータベースを Azure Drive 上に配置することでログやデータベースを永続化した状態で保持することが可能となります。

この構成に対応させるために、Hyper-V のゲスト OS の VHD は以下のように構成しておきます。
image

Azure Storage の Page Blob には VHD をダイレクトにアップロードすることができますので、あらかじめ E ドライブ用の VHD を作成しておきます。
今回は固定で 2 GB の VHD として作成をしておきます。
# インスタンスルートディレクトリとしては、1,297 MB 以上が必要になります。

あとは、この環境で SQL Server Express をインストールします。

 

■SQL Server Express のインストール


共有機能は C ドライブにインストールをして、
image

E ドライブをインスタンスルートディレクトリとして指定します。
今回は既定のインスタンスとして SQL Server Express をインストールしています。
image

データベースのディレクトリに関しては、インスタンスルートディレクトリが起点となりますので、E ドライブが設定された状態となります。
image

SSRS はネイティブモードでインストールをしておきます。
image

SQL Server Express はデフォルトの設定では TCP/IP が有効になっていませんので、TCP/IP を有効にしておきます。
image

TCP 1433 (SQL Server) / TCP 1434 (SQL Server:DAC) / TCP 80 (SSRS) のファイアウォールを許可しておきます。

netsh advfirewall firewall add rule name="SQL Server" dir=in protocol=tcp localport=1433 action=allow
netsh advfirewall firewall add rule name="SQL Server (DAC)" dir=in protocol=tcp localport=1434 action=allow
netsh advfirewall firewall add rule name="SSRS" dir=in protocol=tcp localport=80 action=allow

SQL Server Express Edition はデフォルトでは、[Windows 認証モード] となっていますので、必要に応じて [SQL Server 認証モード] を有効にします。
image

sa のアカウントも必要に応じて有効化しておきます。image

SSRS に関してはデフォルトでは Administraotrs グループが管理者となっていますので、必要に応じて変更をしておきます。
image

サービスに関しては Azure Drive でドライブをマウントした後にサービスを開始する必要がありますので、SQL Server のサービスに関しては [手動起動] としておきます。
image
SSRS も手動にするか、SQL Server と依存関係を設定しておいた方が良いかと思います。
image

 

■SQL Server のサービス起動のタイミング


SQL Server のサービスを起動するためには、Azure Drive でドライブがマウントされた後に起動する必要があります。
image

本来なら VM Role Adapter を作って、サービスレベルで Azure Storage をマウントするのが良いのですが、私はコーディングが苦手なので、今までの投稿で使用していた PowerShell にマウント → サービスの起動を組み込んでしまいます。

# 必要となるアセンブリの参照
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.StorageClient.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.CloudDrive.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.ServiceRuntime.dll"

# サービスの起動が完了するまで待機
while((Get-Service -Name "Windows Azure Cloud Drive Provider").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Integration Components").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Remote Forwader Service").Status -ne "Running"){
    Start-Sleep -s 10
}

# Azure Storag に接続するための接続文字列をサービスモデルで定義した設定から取得
$connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))
while (!$?) {
    $connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))
}

# Azure Storage に接続
$account = New-Object Microsoft.WindowsAzure.CloudStorageAccount( $connection.Credentials, $false)

# ローカルストレージに Azure Drive 用のキャッシュディレクトリを作成
# GetLocalResource で指定しているのは、サービス定義ファイル (csdef) で指定した LocalStorage の設定値
$localstorage = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetLocalResource("AzureLocalStorage")
[Microsoft.WindowsAzure.StorageClient.CloudDrive]::InitializeCache($localstorage.RootPath + "cache", $localstorage.MaximumSizeInMegabytes)

# Azure Drive として、VHD をマウント
$clouddrive = [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountCloudDriveExtensions]::CreateCloudDrive($account, "$($account.BlobEndpoint)persistent/$([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id).vhd")
$driveletter = $clouddrive.Mount(100, [Microsoft.WindowsAzure.StorageClient.DriveMountOptions]::None)

# サービスを起動
Start-Service "MSSQLSERVER"
Start-Service "ReportServer"

# プロセスを維持するためキー入力要求を発生
$host.UI.RawUI.ReadKey()

VHD をアップロードする前に、Sysprep を [一般化しない状態] でアップロードしておきます。
image

SQL Server はコンピューター名が変わると、[sp_dropserver] [sp_addserver] を使用して、SQL Server として保持しているサーバー名を変更しないと正常に動作しないことがあります。
また、一般化することにより SID が変化し、セキュリティに影響が出てきますので、一般化はしない状態の Sysprep を実行します。

■VHD のアップロード


今回は以下の 2 種類の VHD を作成しています。

image

この VHD を用途に合わせて適切な場所に配置をします。
image
Page Blob としてのアップロードは CloudXplorer を使用しました。

アップロードし終わった環境がこちらになります。
image
image

VM Role の VHD Images に OS 用の VHD / Azure Storage の Page Blob としてデータベース用の VHD が格納された状態となります。

■VM Role のインスタンスを起動して動作確認


それでは、VM Role のインスタンスを起動して動作確認をしてみます。
image
image

C ドライブに VHD、E ドライブにデータベースのファイルが格納された Azure Drive がマウントされています。
マウントされたドライブが確実に E ドライブにマウントされるとは限らないので、本当は PowerShell でドライブレターの制御もしないといけないのですよね…。
VM Role のインスタンスは下図の状態となっています。
image

SQL Server 関連のサービスも正常に起動しています。
image

SQL Server にも正常に接続ができます。
image

インスタンスルートディレクトリを E ドライブにしていますので、新規のデータベースも Azure Drive 上に作成がされます。
image

Azure Drive 上に作成されていますのでこのデータベースは Reimage をしても永続化がされた状態となります。
一般化していない状態の VM Role のインスタンスですので SID も変更されず、セキュリティの設定も維持されますのでインスタンスが再作成されてもデータベースは継続して接続することが可能です。

VM Role で何かしらのソフトを入れるときは Azure Drive と組み合わせて今回のような構成をとる必要がありますので Azure Drive と VM Role Adapter を勉強しなくてはと思いました…。。

Written by masayuki.ozawa

2月 12th, 2011 at 10:17 pm

One Response to 'VM Role で Azure Drive を使って SQL Server を実行してみる'

Subscribe to comments with RSS or TrackBack to 'VM Role で Azure Drive を使って SQL Server を実行してみる'.

  1. […] This post was mentioned on Twitter by よち, 小澤真之(Masayuki Ozawa). 小澤真之(Masayuki Ozawa) said: VM Role で Azure Drive を使って SQL Server を実行してみるを投稿しました。非サポートかと思いますが、構成の一例として。 http://tinyurl.com/47kfvrg #AzureJP #jazug […]

Leave a Reply

*