Windows Azure

SQLCATのBlogに投稿された「Running SQL Server in Windows Azure Virtual Machine – Performance Guidelines for Preview」を元にした投稿です。

基本的には、オンプレミスのSQL Serverと同じ考え方でパフォーマンスチューニングが効く。

  • VMのサイズは大きければ大きいほど性能改善に役立つ
    CPU、メモリがボトルネックの間は、大きくすればするほど性能が改善する。
    通常のプロダクション環境では、MediumからLargeを推奨するが、最高なのはえxtらLarge
  • SQL Serverの最大メモリは規定値
    随時負荷に応じてVMサイズを変更する運用をするなら、動的にメモリ調整をSQL Serverが
    できるように最大メモリは固定しない方が良い。
  • Dataディスクを必要なIOに合わせて追加する
    データベース数が複数ある場合でIOがきついなら、DataDiskを複数くっつけて分散させる
    (個人的な感想)Win2012からは記憶域プールが使えるようになるので素敵なことになるのかな??
  • Diskキャッシュ
    Dataディスクは既定でオフになっているので、そのままWriteキャッシュは無効にしておくと良い。
    OSディスクはWriteキャッシュがONになっているので、OSディスクにデータファイル置くなら
    OFFにしたほうがいい
  • Dドライブにtempdb置いた方がいい?(個人的感想)
    Dドライブは、Azureストレージじゃなく、VMと同じ物理ラックに置かれた非永続化領域なので
    速いのかな?

Windows Azure

Windows Azure Virtual Machinesの概要で紹介した、Windows Azure Virtual Machinesで死活監視をしながら、ロードバランシングする手順を実際にやってみました。
手順のインプット情報は、Automating Windows Azure Virtual Machines with PowerShellです。

Windows Azure PowerShellコマンドレットの入手

image
https://www.windowsazure.com/en-us/manage/downloads/

から、Windows Azure PowerShellコマンドレットを入手して、インストールします。

Windows Azure Powershellを使用する方法

スタートメニューから、Windows Azure PoerShellをクリックする。

image

もしくは、モジュールをコマンドレットでインポートします。

Import-Module 'c:\Program Files (x86)\Microsoft SDKs\Windows Azure\PowerShell\Microsoft.WindowsAzure.Management.psd1'

サブスクリプションの設定

Windows Azureの操作をするための設定を一番簡単にする方法は、

https://windows.azure.com/download/publishprofile.aspx

にアクセスして、設定ファイルをダウンロードすることです。

ダウンロードした設定ファイルをインポートします。

Import-AzurePublishSettingsFile ‘c:\temp\mysub.publishsettings’

設定結果を確認したい場合は、次のコマンドを実行します。

Get-AzureSubscription

手動で、サブスクリプションの設定をしたい場合は、Set-AzureSubscriptionで、サブスクリプションIDと管理証明書を設定します。

$subid = ‘[YOUR-SUBSCRIPTION-ID]’

$cert = Get-Item Cert:\CurrentUser\My\YOURCERTTHUMBPRINT

Set-AzureSubscription -SubscriptionName ‘testsub1’ -SubscriptionId $subid -Certificate $cert

 

補足:インポートしたり、手動で設定したサブスクリプション情報は、次のディレクトリに格納されます。

C:\Users\user\AppData\Roaming\Windows Azure Powershell

image

ここにファイルが存在する場合、スクリプトごとにSet-AzureSubscriptionを実行する必要はありません。

コマンドレットは複数のサブスクリプションに対応しており、Select-AzureSubscriptionコマンドレットで、アクティブなサブスクリプションを切り替えて、処理を実行できます。

Virtual Machinesの設定変更

Windows Azure Virtual Machinesの設定変更をするには、「get-azurevm」で

変更したいVMを指定します。

パイプラインで設定変更処理を記述します。

処理を記述後、パイプラインで結んで「Update-Azure」を実行します。

VMの指定方法

次の例では、VM名が「ce03」と「ce01」が含まれたサービス名「eva」と、VM名「win01」を含んだサービス名「wino4」があります。

evaのce01を指定するには、

「Get-AzureVM -ServiceName "eva" -Name "ce01"」と指定します。

image

image

ロードバランシングの指定方法

ロードバランシングは、Windows Azure VMのエンドポイントで定義します。

次の図のように、ヘルスチェック機能を持っているので、特定ファイルにアクセスできるかどうかで、死活監視チェックができます。

エンドポイントを追加するには「Add-AzureEndpoint」コマンドレットを使用します。

Add-AzureEndpoint -Name "HttpIn" -Protocol "tcp" -Public

Port 80 -LocalPort 8080 -LBSetName "WebFarm" -ProbePort 80 -ProbeProtocol "http" -ProbePath "/health.txt"

このスクリプトを実行すると、Windows Azure PowerShellウィンドウ上に進行状況が表示されます。

image

処理が完了すると、次のように処理結果が表示されます。

image

Add-AzureEndPointで指定したプロパティName、Protocol、PublicPort、LocalPortと

Windows Azure管理ポータル上での表記の関係は次の通り。

ロードバランシングの部分は画面上に表示されません。

image

  • LBSetName

    ロードバランサーのエンドポイント名を定義します。

    クラウドサービス内にある複数の仮想マシンがロードバランサーのエンドポイントを使用できます。

  • ProbePort

    死活監視に使用するパブリックポートの指定。指定しない場合は、ロードバランサー用の

    ポートと同じポートを使用します。

  • ProbeProtocol

    死活監視に使用するプロトコルを使用します。「http」、「TCP」のどちらかのみ使用できます。

    「TCP」を指定すると、死活監視要求では「ACK」を受け取ります。

    「HTTP」を指定すると、死活監視用のURLから「200 OK」を受け取ります。

  • ProbePath

    ProbeProtocolに「http」を設定した場合、死活監視に使用するURIを指定します。

詳細は、Add-AzureEndpointのリファレンスを参照してください。

更新の実行

最後に、更新処理を実行するための「Update-AzureVM」をパイプラインでつなげればOK。

Update-AzureVM

サンプルスクリプト

死活チェック付エンドポイントの追加

get-azurevm -ServiceName "win04" -Name "win01" | Add-AzureEndpoint -Name "HttpIn"

-Protocol "tcp" -PublicPort 80 -LocalPort 80 -LBSetName "WebFarm" -ProbePort 80 -ProbeProtocol "http" -ProbePath "/" | Update-AzureVM

死活チェック付エンドポイントの更新

get-azurevm -ServiceName "win04" -Name "win01" | Set-AzureEndpoint -Name "HttpIn" -Protocol "tcp" -PublicPort 80 -LocalPort 80 -LBSetName "WebFarm" -ProbePort 80 -ProbeProtocol "http" -ProbePath "/" | Update-AzureVM

特定VMのエンドポイントの確認

get-azurevm -ServiceName "eva" -Name "ce03" |get-AzureEndpoint

特定VMの特定エンドポイントの確認

get-azurevm -ServiceName "eva" -Name "ce03" |get-AzureEndpoint -Name "HttpIn"

 

検証確認

Win2012 & IIS のVM2つ

特に問題なく、10分ほどで死活チェック付のロードバランシング構築完了。

死活チェックは15秒に1回実施されているので、15秒ほどで切り替わることを確認できた。

IISのログには次のような記録が残っている。

2012-06-12 20:12:53 10.146.154.34 GET / – 80 – 10.146.154.190 Load+Balancer+Agent – 200 0 0 2

2012-06-12 20:13:08 10.146.154.34 GET / – 80 – 10.146.154.190 Load+Balancer+Agent – 200 0 0 0

2012-06-12 20:13:23 10.146.154.34 GET / – 80 – 10.146.154.190 Load+Balancer+Agent – 200 0 0 0

2012-06-12 20:13:38 10.146.154.34 GET / – 80 – 10.146.154.190 Load+Balancer+Agent – 200 0 0 1

2012-06-12 20:13:53 10.146.154.34 GET / – 80 – 10.146.154.190 Load+Balancer+Agent – 200 0 0 2

image

CentOS & nginx のVM2つ

上手くロードバランシングさせられず。。。。

VMそれぞれでエンドポイントを追加して接続すると、両方のVMのnginx HellowWorldを確認。

死活チェック無しのロードバランシングを組むと、正常に動作していることを確認。

死活チェック有り(パスは「/」)だと、両方ダウンしていて接続できない・・・・・・。

nginxのアクセスログは次の通り「200」を返しているのだけど。。。。

10.24.202.190 – – [12/Jun/2012:20:18:47 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

10.24.202.190 – – [12/Jun/2012:20:19:02 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

10.24.202.190 – – [12/Jun/2012:20:19:17 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

10.24.202.190 – – [12/Jun/2012:20:19:32 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

10.24.202.190 – – [12/Jun/2012:20:19:47 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

10.24.202.190 – – [12/Jun/2012:20:20:02 +0000] "GET / HTTP/1.1" 200 155 "-" "Load Balancer Agent" "-"

ちなみにロードバランシングさせるために使用したPowerShellコマンドは、Windowsの名前とサービス名を変更しただけなので、設定ミスではないと思われ。。。

Windows Azure

MicrosoftのエヴァMichelが投稿した「Windows Azure Virtual Machines」を半分ほどざっくりと意訳し、一部個人的な追記をしています。

 

Windows Azure Virtual Machinesは、Windows Azureで新たに提供されるサービスです。

既存のアプリケーションをオンプレミスからクラウドへ素早く移行したり、
サーバ上の永続化するローカルストレージに依存して動作する新しいアプリケーションを構築するために、
Virtual Machineは、とても簡単で柔軟なソリューションです。

Windows Azureは3種類のVMを作成する方法を提供するので、簡単で柔軟にWindows Azureで
VMを作成できます。

イメージからVMを作成する方法

マイクロソフトやパートナーが提供する幾つかのイメージを使用することで、クラウド上で直接仮想マシンをプロビジョニングすることができます。
新しい仮想マシンを作成するのに最も簡単な方法です。

 

カスタムイメージから作成する方法

自分自身のカスタムイメージを構築し、作成したイメージから仮想マシンをプロビジョニングする方法です。

プラットフォームイメージを使用して新しいVMを作成し、ソフトウェアを入れたり設定などのカスタマイズをし、Windowsであればsyspre、Linux上ではwaagent -deprovision+userを使用し、一般化します。
VMを生成しシャットダウンすると、カスタムイメージとしてVMを保存するcapture機能を
使用できるようになります。

補足: VHDをオフラインで生成し、1.7SDKで提供されたcsupload.exeツールを使用してアップロードできます。

自分のVHDを移行する方法

VHDフォーマットの既存の仮想マシンをアップロードする方法です。

この方法でも、csupload.exeツールを使用します。
一般化したイメージをアップロードするか、一般化していないVHDをアップロードできます。

一般化したイメージは、テンプレートとしてクラウド上で新しいVMをプロビジョニングするのに使用でき、
一般化していないVHDは、ブートするためのOSディスクとして、データドライブとしてマウントするためのデータディスクとして使用できます。

Windows Azureでは、Webインターフェイスで選択したりクリックしたり設定する方法から
追加されたREST based Service Management APIを使うことでPowerShellによる自動化をする方法を
提供しています。

仮想マシンに接続する方法

イメージからVMを作成した場合に、VMにリモート接続するための方法について説明します。

Windowsの場合

イメージギャラリーからWindowsのVMを作成すると自動的に、リモートデスクトップのポートフォワードが設定されます。
リモートデスクトップクライアントから接続するには、まずWindows Azureポータルで
エンドポイント設定を確認します。

image

 

リモートデスクトップクライアントから接続する際に接続先情報にポート番号を指定します。

 

SNAGHTMLa2df599

 

Linuxの場合

Linuxの場合、特にポートフォワーディングの設定がされていませんので、22番ポートでSSH接続できます。

 

SNAGHTMLa2f6981

 

VMアーキテクチャ

Windows Azure Virtual Machinesは、WebロールやWorkerロールと同じサービスモデル構築されています。1つのロールで1つのインスタンスやストレージの永続化などの仮想マシン用の対応が必要な機能が強化されています。

Virtual Machineでは、1つのProduction環境のみ提供されており、VIPスワップには対応していません。
Virtual Machineをデプロイすると、そのロール内には1つのインスタンスで動作します。

 

仮想マシンのディスクとストレージ

Virtual Machineのディスクは、Windows Azure StorageのページBlobに格納されています。
イメージからVirtual Machineを作成すると、VM作成時に指定したストレージアカウントに
書き込み可能なイメージのコピーが作成されます。そこにOS用のVHDが作成されます。

仮想マシンのストレージは、同じデータセンター内で複製され三重化されます。
さらにオプションで、同じリージョン内の別のデータセンター内でも三重化して複製できます。

Windows Azure Storageに格納しているので、既存のAPIを使用している既存のアプリケーションで
簡単にアクセスすることができます。

 

上の図を参照すると気づくように、Dドライブをリストに追加していません。
Dドライブは、自分が使用するアプリケーション用に提供されていますが、ストレージとして使用するには注意が必要です。それは、VMが起動しているラックサーバー上の物理ストレージです。Windows Azure Storageには書き出されないので、一時領域として考えるべきものです。

そこの素晴らしい使用方法の一つは、永続化する必要のないデータを含んだOSページングファイルです。
Windowos Azureではデフォルトで、そのように動作しています。

オペレーティングシステムのディスクは、最大で127GBです。
それぞれの仮想マシンはデータディスクを追加でアタッチでき、各データディスクごとに最大1TB使用でき、
追加できるデータディスクの個数はVMサイズに依存します。
データディスクは、VM起動中に動的に追加、削除できます。
VMへのストレージの追加は、ポータル上で数クリックするか、短いPowerShellコマンドで実行できます。

 

実際に見てみた・・・

イメージギャラリーから作成したWin2012のVMは、次の図のようになっていました。
C、Dドライブだけなんですね。

image

 

指定したBlobには、VHDが1つだけなんですね。

SNAGHTMLa3f5e6a

 

ディスクキャッシング (Disk Caching)

仮想マシンと基礎となるホストの間をサポートするディスクキャッシング層があります。
OSディスクの既定の設定では、ホストキャッシングがReadWriteで有効になっていますが、
データディスクでは、ノーキャッシュが有効になっています。

PowerShellのSet-AzureOSDiskコマンドレットを使用してキャッシュの設定を変更せずに
OSディスク上にデータを入れないように注意してください。データディスクがサポートしているNone、ReadOnly、ReadWriteを、OSディスクもReadOnlyキャッシングを設定できます。

 

仮想マシンネットワーク

同じクラウドサービス内にあるVirtual Machineは、別のVirtual Machineに直接接続できます。
Virtual Machine間の全てのポートで全てのトラフィックが許可されているので、インターナルエンドポイントを設定する必要がありません。
しかし、トラフィックが自由に到達できることを意味するわけではありません。
サーバ間のトラフィックを許可するためには、VM上でファイヤーウォールを設定する必要があります。
名前解決は、Windows Azureが提供するマルチテナントDNSサービスが提供します。

 

補足: 仮想ネットワークを設定することを選択した場合、このDNSサービスは提供されず、名前解決が必要な場合は、自分自信でDNS設定をする必要があります。

 

同じクラウドサービス

VMの同じクラウドサービスとは、VM作成時などに「Connect to existing virtual machine」を選択して、既存の仮想マシンは以下に加えた場合のことです。

下の図では、Win01とWin06が同じクラウドサービスに所属しており、これを選択することで作成しようとしているVMを同じクラウドサービスに所属させることができます。
Win01にリモート接続をし、nslookupをするとWin06を名前解決できます。しかし、ここに所属していない別のVMからは、Win06を名前解決できません。

image

 

エンドポイント設定

Virtual Machineのインバウントトラフィック設定はストレートフォワードです。
Windows Azureは、インプットエンドポイント、または、より一般的には単にエンドポイントとして知られている概念を持っています。
エンドポイントは、Virtual Machineとトラフィックが通るように許可するプロパティを連携できます。

エンドポイントプロパティ名

  • Name (エンドポイントを識別するための名前)
  • Protocol (tcp/udp)
  • Local Port
  • Public Port

例えば、1つのWebサーバー用のエンドポイントを設定したい場合、エンドポイントを次のように設定します。

  • Name: iishttp
  • Protocol: tcp
  • Local Port: 80
  • Public Port: 80

SSL用のWebサーバーの場合は、次のポートもあける必要があります。

  • Name: iishttps
  • Protocol: tcp
  • Local Port: 443
  • Public Port: 443

ロードバランサーの設定

前の例は、一つのVirtual Machineのポートを空けました。
しかし、時にはロードバランサーで同じポートで複数のVMでレスポンスさせたいことがあります。
Windows Azureでは、ロードバランス設定をVirtual Machineで直接コントロール制御することができます。

ロードバランサーのエンドポイント

ロードバランサーセットは、単純に複数のVM上で同じエンドポイントの設定をし、「エンドポイントをまとめてグループ化する共通名をLoadBalancedEndpointSetName (or LBSetName in PowerShell)」プロパティを呼び出して設定します。
この機能は、Windows Azure管理ポータルでは抽象化されていますが、
カスタムヘルス監視を使用してロードバランサー上でより詳細な制御をすることができるので、
コマンドラインから設定するのが最適です。

ロードバランサーエンドポイント

 

ロードバランサー用のカスタムヘルス監視の設定

 

カスタムヘルス監視の設定例については、Automating VMs with PowerShell.を参照してください。

サイト認証とカスタム監視

カスタム監視をロードバランサーからGETリクエストを受信するURL設定を理解することが重要です。
指定した監視パスが401ACCESS DENIEDを返すと、ロードバランサーはVMのローテションに追加しません。
匿名でレスポンスを受信できるヘルスチェックURLを設定することが重要です。

ポート・フォワーディング

クラウドサービスは単一のパブリックIPアドレスを持っていますが、
ロードバランスせずに直接個々のサーバーに接続するには、どのようにすればいいでしょうか?
答えは、ポートフォワーディングです。

 

 

上のイラストは、2つのVMがポート3389でListenしています。
同じパブリックIPアドレスから、それぞれ別々にアクセスするには、1つめのVMには5586、2つ目のVMには5587でListenするように2つのエンドポイントを設定します。

リモートデスクトップクライアントでそれぞれのエンドポイントに接続すると、適切なマシンにフォワードされます。

仮想マシン用の永続化IP

仮想マシンをプロビジョニングしたとき、デフォルトでWindows Azureが名前解決をし、IP管理をします。
通常は、永続化IP(固定IPアドレスとは表現していません)を設定する必要はありません。
デフォルトのネットワーク設定では、VMのIPアドレスは変更でき、変わることがあります。
Active Directoryのようなものをデプロイする場合は、既定のネットワーク設定では動作しません。

VNETでIPアドレススキーマを定義することができます。アドレススペース、サブネットなどを定義できます。
再起動やリカバリ時のVMプロビジョニングにVNETが同じIPアドレスを保持し続けることができます。

VNETを使用する時は、組み込みの名前解決機能を失います。
/16や/24はサブネットの指定です。

 

仮想マシンのアベイラビリティ

Virtual Machineのリリースに合わせ、新しいSLAを用意しました。
WebロールやWorkerロールでは、ホストのコンポーネントの更新やハードウェアの故障時にもアプリケーションが動作するために最低でも2つのインスタンスを使用していれば、%99.95のSLAを提示しています。
VMでは、多くのアプリケーションは複数VMを必要としないことに気が付きました。
単一インスタンスで99.9%のSLAを提示し、アベイラビリティセットを使用して1つよりも多いインスタンスを使用すれば99.95%のSLAを提示する予定です。

アベイラビリティ・セット (Availability Sets)

もし更新・失敗ドメインのコンセプトを知っているなら、アベイラビリティセットも同等のものです。
VMは、データセンター内で物理的に分かれたラック上に配置され、ホストOSのアップグレード時には、同時にすべてのVMがアップグレードでメンテナンスダウンしないよう管理しています。

Windows Azure

Windows Azure Storageチームが投稿していた
New Storage Features on the Windows Azure Portal」を元にした投稿です。

Windows Azure ポータル上で、提供される新しいストレージ機能について紹介します。

ポータルをアップデートすると、
ストレージの冗長性レベルを選択することができ、Metricsとロギングの設定、有効・無効を設定できます。
Metricsをグラフィカルに表示します。

ストレージアカウントの冗長性選択

ストレージアカウントを作成するときに、
ビジネスの必要性に応じて、ストレージの冗長性タイプを設定できるようになりました。

Geo Redundant Storage(ジオ・レプリケーション/地理的レプリケーションを有効)
Locally Redundant Storage(ジオ・レプリケーション無効)

ストレージアカウント作成時

ストレージアカウントを作成する際に、
ジオ・レプリケーションを有効にするかどうかを選択することができます。

image

 

ストレージアカウント作成後は、「ストレージアカウントの選択」―「CONFIGURE」を選択すると、
GEO REPRICATIONの有効・無効を切り替えられます。

image

 

Windows Storage Analyticsの設定

ポータル上で、Metricsとロギングの有効・無効の切り替えができます。

image

 

ストレージ作成時の進捗表示

image

 

画面の右下のグラフをクリックすると、
その上に、現在の処理状況が表示されますので、アカウント作成の進捗確認ができます。

Windows Azure

知っておきたいWindows Azure Web Sitesのまとめ10個」で紹介している
「パッケージ管理」を実際にやる方法を
Use NuGet Package Restore to avoid pushing assemblies to Windows Azure Websites
で紹介されていたので、意訳してみたよ。

 

Windows Azure Websitesでは、TFSやGITなどのリポジトリのソースコードから、
簡単にWindows Azureへプッシュして、
ASP.NETやPHP、NodeなどのをWebサイトで公開することができます。

Windows Azure Websitesは、どのようにして依存関係を管理するのでしょうか?
ソース管理にアセンブリファイルをチェックインしたり、NuGetパッケージを含めないといけないのでしょうか?

 

NuGet 1.6では、NuGet Package Restoreと呼ばれる素晴らしい機能が追加されています。
この機能は、ソースコードリポジトリにNuGetパッケージを追加することなく、
NuGetパッケージを使用することができるようにします。

ソリューションをVisual StudioやMSBuild(Windows Azure Websitesで使用している)でビルドすると、
ビルドターゲットとしてnuget.exeが呼び出され、
パッケージを確認し、自動的にフェッチし、コードをコンパイルする前にインストールします。

大きなパッケージをバージョンコントロールの外出しをすることで、
ソースコードリポジトリを小さく保つのに役立ちます。

NuGet Package Restoreを有効にする

NuGet Package Restoreを有効にするために、Visual Studioで操作します。
単純に、ソリューションで右クリックをし、”Enable NuGet Package Restore”をクリックします。

 

NuGet package restore Windows Azure Websites Antares

 

Visual Studioでは、ソリューションのプロジェクトで以下の処理を実施します。

  • ソリューションルートに「.nuget」フォルダーを作成し、NuGet.exeとNuGet targetを同梱します
  • MSBuildは、プロジェクトのNuGet targetをインポートし、ビルド時にNuGetパッケージをダウンロード、インストールをします。

一般公開していないアセンブリの更新や、NuGet.orgからの自動更新を信用できない場合は?

それらのアセンブリ専用のNuGetパッケージを作成します。
すでに、それらのNuGetパッケージを用意しているなら、話は早いです。
www.nuget.orgで一般公開されていない、ホストされているパッケージのオンラインフィードを確認します。

プロジェクトで、カスタムフィードを、どのようにリンクするのでしょうか?
.nugetフォルダーで、NuGet.targetファイルを編集します。
Package Sourceエレメントで、セミコロンで区切ることで複数のフィードを設定できます。

 

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <!-- ... -->
       
        <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
        <PackageSources>"http://www.myget.org/F/chucknorris;http://www.nuget.org/api/v2"</PackageSources>

        <!-- ... -->
    </PropertyGroup>

    <!-- ... -->
</Project>