Azure SQL Database のスケール アウトを試してみよう

Microsoft Japan Data Platform Tech Sales Team

阪本 真悟

はじめに

Azure SQL Database は柔軟性の高いデータベース サービスですので、必要に応じて垂直および水平方向の拡張が可能です。ビジネスが軌道に乗り、予想以上にデータベースへの負荷が高まった場合も容易に対応が可能です。拡張性の高さはクラウド環境の大きなメリットと言えます。

垂直方向の拡張とは、サイズの変更により個々のデータベースのパフォーマンス レベルを増減することを意味します。"スケールアップ" とも呼ばれます。

水平方向の拡張とは、容量または全体のパフォーマンスを調整するためにデータベースを追加または削除することを意味します。 “スケールアウト” とも呼ばれます。

今回は2つ目の水平方向の拡張を、 「シャード マップ マネージャー」と シャード マップを管理するための 「Elastic Database クライアント ライブラリ」を使用して試してみましょう。

シャード マップ マネージャーとは

シャーディングは、同じ構造を持つ大量のデータを数多くの独立したデータベースに分散する手法です。拡張したいときにどんどん新しいデータベースを追加することが可能になります。

シャード マップ マネージャーは、管理対象のシャード セット内のすべてのシャード (データベース) についてのグローバル マッピング情報を保持する特殊なデータベースです。 アプリケーションは シャード マップ マネージャーに保持されているシャーディング キーの値に基づいて、分散先の適切なシャード(データベース)に接続できます。

以下の図が参考になります。Shard1, Shard2, Shard3 と書かれているのが実際にデータを格納するデータベースで、Range[1, 100] と書かれているのがシャーディング キーの範囲を表しています。

Elastic Database クライアント ライブラリ

シャード マップの管理(シャード マップの作成、シャードの追加など)、複数のデータベースをまたいだクエリを制御するために Elastic Database クライアント ライブラリを使うことが出来ます。

Elastic Database クライアント ライブラリは Java 用と .Net 用が用意されています。今回は.Net 用 Elastic Database ツールを使ってみました。

ライブラリはMicrosoft.Azure.SqlDatabase.ElasticScale.Clientからインストールが可能です。 ライブラリは、次のセクションで説明するサンプル アプリと共にインストールされます。

このあたりの手順の詳細はここに記述されています。

サンプル アプリケーションの実行

Elastic Database クライアント ライブラリの様々な機能を試してみるために今回は、サンプル アプリケーションを使ってみます。

ElasticScaleStarterKit.sln ソリューションを C# ディレクトリから開いてプロジェクトを作成します。

サンプル プロジェクトのソリューションで、app.config ファイルを開きます。 ファイルの指示に従って、使用する Azure SQL Database サーバー名とサインイン情報 (ユーザー名とパスワード) を追加します。

修正が終わったらアプリケーションをビルドして実行しますが、事前にファイア ウォールのポリシーに接続元クライアントの IP アドレスを追加しないとエラーが発生しますので、アプリケーションを実行する前に追加しておきましょう。

※ファイアウォールの設定は Azure のポータル画面、SQL database の Overview 画面から「Set server firewall」をクリックして変更が可能です。

1. シャード マップ マネージャの追加

アプリケーションを実行すると次のようなメッセージが表示されますので、「1」を選んで新しいシャード マップ マネージャを作成します。

次のようなメッセージが表示されて無事に作成が出来ました。ツールを使って次の処理を実行しています。
1.シャード マップ マネージャを作成
2.シャーディング キーの範囲を<0-100>に設定したシャード0を作成
3.シャーディング キーの範囲を<100-200>に設定したシャード1を作成

実際にデータベースに接続して中身を見てみます。

シャード マップ マネージャには以下のようなテーブルが作成されていました。

テーブルの中を見てみると、[ShardsGlobal] テーブルには DB が管理する[ShardID]、[ShardMapId] と一緒に [ServerName](サーバ名)と、[DatabaseName](データベース名)が格納されていることが分かります。

[ShardMappingsGlobal] テーブルには [ShardID]、[ShardMapId] とシャーディングキーの範囲(最小値・最大値)が 16 進数で格納されていました。

2.シャード(データベース)の追加

もう一度サンプル アプリケーションに戻ります。Elastic Database クライアント ライブラリからはシャード(データベース)の追加など様々な管理機能を実行することも可能です。

アプリケーションのメニューから「2」新規シャード(データベース)の追加を選んでみましょう。

シャーディング キーの範囲を<200-300>に設定したシャード2を作成することが出来ました。

 

3.スケールアウトされた環境での動作を確認

サンプル アプリケーションからいくつかエントリを追加してデータベースの中を確認してみましょう。メニューから「3」を何度か実行してみました。

データベースを確認してみるとシャーディング キーに応じてエントリが格納されていることが分かります。

シャード0 <シャーディング キーの範囲:0-100>

シャード1 <シャーディング キーの範囲:100-200>

シャード2 <シャーディング キーの範囲:200-300>

最後に Elastic Database クライアント ライブラリを使ってスケールアウトされた環境に対して参照クエリを発行してみます。これもサンプル アプリケーションからテスト実行が可能です。「4」を選んで実行してみます。

全てのエントリがまとめて表示されたことを確認しました。

このように「シャード マップ マネージャー」と「Elastic Database クライアント ライブラリ」を使って動作を確認することが出来ました。

複数のシャード(データベース)にまたがるクエリの実行が必要となるデータ収集/レポート作成などのタスクに活用することが出来ると思います。是非、試してみてください。