Windows Azure Platform Training Kit – October Update

リリースされたようです。

変更点は以下の通りのようです。

  • [New Hands-On Lab] SQL Azure Data-tier Applications
  • [New Hands-On Lab] SQL Azure Data Sync
  • [New Hands-On Lab] SQL Azure Federations
  • [New Demo] Provisioning Logical Servers using Cmdlets Demo
  • [New Demo] Parallel Computing on Azure – Travelling Salesman Demo
  • [Updated] SQL Azure Labs and Demos with the new portal and tooling experience
  • Applied several minor fixes in content

やっとSQL Azure Federationsの学習の機会がw

ちなみにインストーラーはWAPTK – Web Installer (Preview 2).exeなるものが増えてますね。

これで入れようとしたんですが依存関係まわりが面倒そうだったのでちょっと放置…普通に300MB超をダウンロードしました。
※まだPreview段階のようですが、入れるコンテンツを指定したり、デモで必要となるコンポーネントの依存関係を見たり便利そうではありました。

Windows Developer Preview をVHDブートさせる

Windows Developer PreviewをVHDブートさせる方法はいろいろありますが、基となるVHDをWindows Server 2008 R2のHyper-V 2.0とかで作ってしまうとそのままじゃブートしません。

※ブートメニューでWindows Developer Previewを選ぶと 0xC0000248 な署名が検証できない云々で⊂ミ⊃^ω^)アウアウ

解決方法は一応ありますが自己責任で、ということで載せておきます。
簡単にいうと、ブートローダ(Winload)がWindows 7のままだとエラーになるわけで、Windows Developer Previewのブートローダ(Winload)になるように修復してあげればいいだけです。

  1. Hyper-V 2.0上でWindows Developer Previewをインストール(※ディスクサイズはVHDファイルを置くWindows 7等の空きディスク容量より少なくなるようにしましょう)
  2. VHDファイルをコピーして Windows OSをVHDブートさせる2つの方法 (@IT) あたりを参考にBCDを弄ります(このままだと上記のエラーになる)
  3. Visual BCD Editor for Windows 7/Vista をダウンロードしてインストールします
  4. ディスクの管理でコピーしたVHDをマウントします
  5. Visual BCD Editorを立ち上げ、「Repair」-「Repair BCD」メニューを選択します
    image
  6. Bcd DriveはSystemのままでWin7Folderを先ほどマウントしたVHDのWindowsフォルダ(Windows Developer PreviewのWindowsフォルダ)を選択して修復します。

以上でブートローダがWindows Developer PreviewのものにかわってちゃんとVHDブートできるようになると思います。

WP_000003

まーWindows Developer PreviewのISOをブートできたらこんなことせずに修復できると思うのですが手元にそういったものはなかったのでこんな方法になりました。

Windows AzureはAutoScaleの夢を見るか?

ちょっと前の話題ではありますが、Microsoft patterns & practicesが提供するEnterprise Library 5.0にWindows Azure Integration Packが追加されています。(現状はPreview版のようですが)

Integration PackとしてはWindows AzureのほかにもSilverlightなどがありますね。

さてこのWindows Azure Integration Packとやらは何ができるんでしょう?

EntLib vNext teaser や Using Enterprise Library 5.0 in Windows Azure(PDF) を見るとEnterprise Libraryで提供されているロギングや暗号化、データアクセス、コンフィグレーションなどのアプリケーションブロックがAzure上でも利用できるようになっているようです。

でEnterprise Libraryなので簡単なコンフィグレーションで環境の差異が吸収できるようになってたりするっぽいですね。なのでこのIntegration Packを使うとOnPremiseからAzureへ、AzureからOnPremiseへの移行とかがしやすくなりそうです。(というかその辺が目的でしょうか)

で、それはそれでいいとして。

目玉としてはWindows Azureに特化した部分としてWindows Azure Autoscaling Application Block(WASABi)が追加されたことです。

わお!素晴らしいですね!こいつを使うとCPU負荷などの利用状況や時間帯などルールを評価してアクション(つまりオートスケール等)ができるようです。

WASABi

まぁカスタムアクションやルールの定義も自由度高いので、そのあたりは柔軟にできそうですね。というかそのためのライブラリだし。

image

想定されるMaxとMinを指定してインスタンス数が予想外に増えないように・下がらないようにルール作ったり、スパイクに対応させたり。
判定材料はCPU負荷などいろいろ構成できますと。

ということでWindows Azureは公式標準機能ではありませんがオートスケールを手に入れたようです。まだPreviewなので、要望がある方は是非Voteってください。

実際に試したい方はNuGetにあがっているのでそちらからもどうぞ。

以下余談です。

このWASABiを使うと確かにオートスケールできそうです。でもWASABiを使ってるアプリケーションのみですよね。単発のLOBなアプリケーションとかならいいんでしょうけど、適用する場所、やり方、運用、ITのあり方なんかは別でちゃんと考えたほうがいいと思います。似たようなことはSystemCenterでもできるわけですし、なんでそっちでも出来るかとかは考える価値はあるかと思います。

まぁ釈迦に説法と思われますが。

あとオートスケールいうならゼロインスタンス機能くれよーーこればっかりはAzure側で対応してくれなきゃ無理!!

Windows AzureのWeb Roleでセッションを共有する

紆余曲折ありましたが(?)、Windows Azure上のWeb Roleでセッションを共有する方法を簡単に(いい加減に)まとめたいと思います。

  ASP.NET標準 ASP.NET標準 MSDN Code Gallaryのセッションプロバイダ ASP.NET Univarsal Providers High Performance Session State Provider Windows Azure AppFabric Caching
ストア メモリ(InProc) SQL Azure Azure Storage Table SQL Azure SQL Azure Windows Azure AppFabric Caching
作成者 MS MS MS? MS @takepara
@kazuk
MS
SLA 無 無(ストアはある) 無(ストアはある) 無(ストアはある) 無(ストアはある) 有
特徴 冗長化・負荷分散しない漢向け 削除をなんとかしたら使えないことはない Table使うので安い 新入り。そつなく利用可。 自作上等。ASP.NET Universal Providerの残念なところを解消 大規模で本気出すなら商用サービスだよね
メリット お手軽高速 お手軽 お手軽で安い? お手軽。RoleやMembershipも使える お手軽 高速。一番早い。
デメリット 冗長化されない・負荷分散されない セッションが削除されない セッションが削除されない。遅い。 セッション削除に難あり 自家製 お金。
追加コスト 無し DB分必要 低(SQL Azureよりは安い) DB分必要 DB分必要 高め(128MB/月で3,933.45円)
パフォーマンス 高 中 低 中 中の上 高
その他 パフォーマンスカウンタが付く セッション数の把握はDB見れば可 よくわからない セッション数の把握はDB見れば可 セッション数の把握はDB見れば可 ざっくりした合計セッションサイズがある程度わかる(ただしリアルタイムでは把握できない?)

 

という感じで役に立つかどうかわかりませんがまとめました。いろいろ要件にあわせて選んでくださいませ。

冗長化いらないならInProcとか。
最低限負荷分散したいけど小規模だしコストかけたくないなぁとかならAzure Storage Tableとか。
それなりにちゃんと使いたいとかならHighPerformanceSessionStateProviderとか。
いやー自分で面倒みるの大変だよとかならASP.NET Univarsal Providersとか。
大規模で性能いるんだよお金はあるぜとかならAzure AppFabric Cachingとか。

まぁ他にもMemcached使ったり、自前で負荷分散も対応したInMemoryなプロバイダ作ってもいいでしょうし。

お好みでどうぞ!

ASP.NET Univarsal Providers のセッションプロバイダを使ってみる (2)

全開前回の続きです。

前回、セッションIDにAppDomainAppIdの値が付与されるから複数台な環境だとAppDomainAppIdを合わせておかないとセッション共有ができないんじゃね?という話をしました。

理屈上はそうなので、どうしようかと思って実際にWindows Azure上で見てみると…

おや。複数インスタンスでもAppDomainAppId同じですね。Full IISでマルチサイトしてみましたけど、(法則性はよくわかりませんが)全部同じようです。
想像するにWeb Roleを初期化する際、サービス定義ファイル等に基づいてサイトを作成しますがAppDomainAppIdも指定して作成している感じですか。

というわけでセッションIDに関する懸念はWindows Azure上で使う分には気にしなくて良さそうですね。

さて次はパフォーマンスの話。

前回見てみた限りだと明らかにパフォーマンスに問題がありそうな仕組みでした。
ということで実際どれぐらいなんだろう、というのをぱふぉちゅー素人であるおいらが見てみようと思います。
※言うまでもなく実際にASP.NET Univarsal Providersを採用する際はご自身で確認してください。あくまで参考程度に。

さてテストするにあたってASP.NET Univarsal Providers+SQL Azureを使用してセッション共有するようにしたWebアプリを5インスタンスで動かします。それからWebアプリにアクセスしてセッションを作成したりするWorker Roleを20インスタンスほど。

台数にあまり深い理由はないんですがセッションの応答速度みるのにサーバー自体がネックになってもなぁと思いつつ5インスタンスに。クライアント側は多めにということで20インスタンスにしました。

クライアント側は単純にWebClient使ってページを読み込むだけです。で、前後で時間を計測する感じに。

class Program
{
	static void Main(string[] args)
	{
		System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

		GetPage();

		int count = int.Parse(args[0]);

		for (int i = 0; i < count; i++)
		{
			sw.Reset();
			sw.Start();
			GetPage();
			sw.Stop();
			Console.WriteLine("{0}\t{1}",DateTime.UtcNow.ToString("yyyy/MM/dd hh:mm:ss.fff"),sw.Elapsed);
		}
	}

	static private void GetPage()
	{
		WebClient wc = new WebClient();
		using (Stream st = wc.OpenRead("http://penguindrum.cloudapp.net/"))
		{
			Encoding enc = Encoding.GetEncoding("UTF-8");
			using (StreamReader sr = new StreamReader(st, enc))
			{
				string html = sr.ReadToEnd();
				sr.Close();
				st.Close();
			}
		}

	}
}

Webアプリ側は前回と同じやつでセッションオブジェクトが無ければ現在時刻を放り込むだけの簡単仕様

とりあえずひたすらセッションを作っていくわけですが、Insert処理だとそんなに(?)重くない感じですね。
2万セッションぐらい作って(ページ取得の)平均応答時間が0.5秒ぐらい、長くて2秒。

さてセッションを作りまくるワーカー走らせてる横で、同じようにセッション作って、再度そのセッションを使って1分おきにアクセスするような(=DBを更新するような)クライアントで処理時間見てみようと思います。(※WebClientだとCookieセットできなかったのでHttpWebRequestを使用)

適当にクライアントアプリ作った所為で落ちてますが、うまく更新できるケースもあればタイムアウトでちゃんと応答が返ってこないとか、返ってきても6秒かかってるとか。ちょっと不安定。

一番最後の実行結果は、作ったタイムアウトになった2万セッションがDBに残ってる状態で新規アクセスしたときのですが、期限切れセッションを取得して削除処理が入ってるので52秒かかってます。これ他にアクセスが無い状態での結果なので…

同時アクセスがそんなになく、ユーザー数も少ないようなケース、もしくは多少応答が遅くなってもいいケースでは簡単に使えるので便利ですね。
DB側のチューニングでもう少し改善しそうですけど、あまり詳しくないので触れないでおきます。

まぁなんというか、このエントリそのものはあまり役に立たない内容でしたが、捨てるのもあれなので晒してみました。恥じらいとたくし上げ。

祝:Windows Azure Platform 管理ポータル 日本語化

あっという間(前回の投稿から的な意味で)にWindows Azure Platform管理ポータルも日本語化されました!

※追記しました

今のところ11言語が使えるようです。

ステータスも日本語でわかりやすくなりましたね。

 

新しくなったポータルでは右クリックメニューでそれぞれの項目に応じたメニューが表示されます。

ちなみにプロパティ欄でもコピーが使えるので、ID等のコピーが少しだけマシになりましたw

日本語になったおかげで、初心者の方も使いやすくなったのではないでしょうか。

またパフォーマンスの改善ということでローカルのテンポラリキャッシュを使えるようになったようです。その為初回起動時にSilverlightの設定を変更するかどうか確認されます。

セキュリティリスクを最小化するために機密情報は保存しないようになってるそうですが、どうしても気にする場合はInPrivateモードで操作するのがいいようです。(ローカルキャッシュを作成しないらしい)

その他の変更点としてはデプロイしたサービスを削除する際の操作性の向上がありました。
以前は一旦サービスを停止して、それから削除という操作が必要でしたが今回のアップデートで直接削除することができるようになったようです。

あ、あとSQL Azureな管理のところでCo-Adminが追加できるようになったようですよ。

誤訳の報告やその他要望もろもろフィードバックは画面下にあるリンクから!