Azure SQL Database Elastic Scale First Impression

先日、Azure SQL Database Elastic Scale の Priveiw 版が発表されました。

簡単に言えば、水平分散した SQL Database を手軽に扱えるサービスで、Azure SQL Database Federation サービスの後継になるそうです。

Azure SQL Database Federation は全然触ってなかったのですが、仕事で水平分散をやったこともあって非常に興味があるので色々触ってみます。

Azure SQL Database Elastic Scale とは?

Azure SQL Database Elastic Scale の4大改良点 Federationの失敗を糧にしたサービス - 蒼の王座 SQL Database で Elastic Scale Preview が公開されました - SE の雑記

上記ブログ記事が詳しいので詳細はそちらをご覧いただければと思います。
というか私はまだ触り始めたばかりで、水平分散できる!くらいしか分かってません(つまり何にも分かってない)。

First Impression

概念的なことや、機能についてはこれから追々調べていくとして、とりあえずサンプルが以下にあるので、今回はこれを簡単に動かしてみることにします。
Elastic Scale with Azure DB - Getting Started

サンプルをダウンロードすると、.sln ファイルが含まれているので Visual Studio で開きます。

f:id:kendik:20141007024443j:plain:midiam

コンソールアプリケーションのようです。とりあえずデバッグ実行。

f:id:kendik:20141007024452j:plain

エラーになりました。
サーバーが見つからないと言われています。
まだ何もしてないからそりゃそうですね。サーバーを作りましょう。

Azure のポータルにいき、 [SQL データベース] => [サーバー] を選択します。

f:id:kendik:20141007024459j:plain

[SQL データベースサーバーを作成する] から

f:id:kendik:20141007024506j:plain

サーバーへのログイン設定を行います。

f:id:kendik:20141007024514j:plain

サーバーが作成できたら、[構成] を開き、自分の IP アドレスに接続許可を与えます。

f:id:kendik:20141007024522j:plain

次にダッシュボードから管理用の URL をコピーしておきます。

f:id:kendik:20141007024529j:plain

ダウンロードしてきた .sln ファイルを再度開き、App.config を編集します。
ServerName には先ほどコピーした URL のホスト名以下を、
UserNamePassword には先ほど自分で設定したログイン情報をセットします。

f:id:kendik:20141007024554j:plain

この状態で再度アプリケーションを実行します。

f:id:kendik:20141007024601j:plain

今度はつながりました!

サンプルアプリケーションの操作

それではサンプルアプリケーションを動かしていきます。
まず、この状態では SQL Database Server は存在するも、SQL Database は存在しませんのでデータベースを作りましょう。

SQL Database Elastic Scale では、データとシャードのマッピングは Shard Map Manager というデータベースで行っています。Shard Map Manager とデータを格納する各シャードは、コンソールの表示から分かるようにサンプルアプリケーションから作れるようになっています。

Shard Map Manager とシャードを作るよう指示してしばらく待つと、DB が作られます。
※このタイミングで課金されますので、試されるときはその点ご注意ください。

f:id:kendik:20141007024608j:plain

Shard Map Manager と ElasticScaleStarterKit_Shard0、ElasticScaleStarterKit_Shard1 というデータベースが作られました。
ポータルで見ても DB が作られたことが確認出来ます。

格納するデータのキーの範囲によって、どのシャードに分散されるかが決まります。コンソールの出力を見る感じでは 0-99 が ElasticScaleStarterKit_Shard0、100-199 が ElasticScaleStarterKit_Shard1 のようです(多分)。

f:id:kendik:20141007024615j:plain

次にデータを登録しましょう。
これもサンプルアプリケーションから行えます。適当に 10 件ほど登録しておきましょう。

f:id:kendik:20141007024620j:plain

ElasticScaleStarterKit_Shard0 の中を覗いてみた結果が以下の通りです。ちゃんとデータが入っていますね。
ShardMapManagerLocal などの、管理用と思われるテーブルもありますが、今日のところはこれは置いておきます。

f:id:kendik:20141007024628j:plain

さて。

Azure SQL Database Elastic Scale では、複数のシャードに対するクエリの発行を行うことが出来ます。
Multi-Shard Query というらしいですが、これもサンプルアプリケーションから実行出来ます。実行してみた結果が以下です。

f:id:kendik:20141007024638j:plain

お!おお!データがとれてる!
この結果を見るに、ソート順はシャードごと並べられて結果を単に UNION ALL したものになるようですね。これは楽しい。

ちなみに、複数シャードへのクエリってどうやって実現してるのかなーと思ってクライアントライブラリである Microsoft.Azure.SqlDatabase.ElasticScale.Client.dll のソースを ILSpy でちょろっと見てみたんですが、Close メソッドがこんな感じです(Open はなぜか見当たらなかった)。

f:id:kendik:20141007024645j:plain

複数のコネクションを順番にクローズしてますね。うーん、、、クライアントで頑張ってるだけのようです。少し残念。

まとめ

Azure SQL Database Elastic Scale のサンプルアプリをとりあえず動かして見ました。
クライアントで頑張ってるのはちと残念ですが、Multi-Shard Query とか動かすだけで楽しいですね。

というかもう興味津々でして、サンプルアプリ使わず全部自前でやるのはどうするの?とか、既存の DB を分散するにはどうするの?とか分散キーは自由に設定できるの?更新は?データの挿入先は自分でしか決めれない(意図的に固めることはあれど、ラウンドロビンとかで自動で分散出来たら嬉しい)?複数シャードをまたぐ更新は?分散トランザクション?パフォーマンスは?などなど疑問は尽きませんね。非常に楽しくなってきました。暫く遊んでみます。