松本美穂と松本崇博が執筆した SQL Server 2014 自習書シリーズの「No.5 Microsoft Azure SQL Database 入門」の HTML 版です。 日本マイクロソフトさんの Web サイトで Word または PDF 形式でダウンロードできますが、今回、HTML 版として公開する許可をいただきましたので、ここに掲載いたします。[2015年12月29日]
ここでは、NuGet で提供されている「Elastic Scale Client Library」を利用して、どのように Azure SQL Database のシャーディング(データベース分割)を実装するのかを説明します。このライブラリを利用すれば、シャーディングに対して、次のようにデータを INSERT することができます(C# の場合の例)。
ADO.NET でのプログラミングと同じように、SqlConnection と SqlCommand オブジェクトを利用して、データを INSERT することができます。通常との違いは、SqlConnection オブジェクトを作成するときに、RangeShardMap オブジェクトの OpenConnectionForKey メソッドを利用しているところです。これは、次の図のような構成になります。
この例では、OpenConnectionForKey メソッドの第1引数に data_colA(colA 列に格納するデータ 133 を保持している変数)を与えていますが、この値(Key 値)によって、どのシャードに格納すべきかを認識できるようになっている、というライブラリになっています。
SqlCommand オブジェクトの利用方法は、通常の ADO.NET と同じです。このように、Elastic Scale Client Library を利用すれば、アプリケーションからは、どのデータベース(シャード)を利用しているかは意識する必要がなくなります。
それでは、Elastic Scale Client Library を試してみましょう。ここでは、次のような C# の Windows フォーム アプリケーションを作成する場合を例に説明します。
Button1 をクリックすることでシャーディングを構成して、Button2 でデータの追加(INSERT)、Button3 でデータの参照(SELECT)を行うようにします。
シャーディングは、次の図のように構成します。
データベースを 3つ作成して、シャードの管理情報を格納するための「estest」、1~100 のデータを格納するためのシャード「estest_1」、101~200 のデータを格納するためのシャード「estest_2」を作成します。テーブル名は「t1」として、「colA」と「colB」の 2つの列で構成するようにします。
1.まずは、Azure SQL Database の SQL サーバーに接続して、データベースを 3つ作成します(master データベースに接続して、CREATE DATABASE ステートメントを実行します)。
このように作成したデータベースは、課金対象になるので、テストが完了したら、削除し忘れないように注意してください。
2.次に、2つのシャード(estest_1 と estest_2 データベース)の中に、まったく同じ構成の「t1」テーブルを次のように作成します。
テーブル名は「t1」として、「colA」と「colB」の 2つの列で構成するようにします。colA は int、colB は varchar(100) データ型で定義して、colA に格納される値に応じて、シャードが分かれるという形にしていきます。
次に、Button1 をクリックしたときに、シャーディングを構成するように Elastic Scale Client Library を利用して、コードを記述します。シャーディングの構成では、シャードをいくつ作成するのか、各シャードが保持する値の範囲などを設定します。これには、ShardMapManager や RangeShardMap、RangeMapping、Shard オブジェクトなどを利用しますが、おおまかな関係は、次のとおりです。
CreateSqlShardMapManage メソッドで、シャーディングを管理するための ShardMapManager オブジェクトを作成して、CreateRangeShardMap メソッドで RangeShardMap オブジェクトを作成します。これは値の範囲(1~100 や 101~200 のような範囲)でシャード マップを作成するためのオブジェクトで、特定の値(1 や 2、3 などの値)に応じてシャードを分割することもでき、この場合は ListShardMap オブジェクトを利用します。
RangeShardMap オブジェクトでは、CreateRangeMapping メソッドで RangeMapping オブジェクトを作成して、値の範囲を定義し、CreateShard メソッドで Shard オブジェクト(シャード)を作成して、どの範囲のどのデータベースを割り当てるのかに利用します。
それでは、具体的なコードを記述してみましょう。
1.まずは、Visual Studio 2013 を起動して、新しいプロジェクトを作成します。
[テンプレート]で[Visual C#]の[Windows フォーム アプリケーション]を選択して、新しいプロジェクトを作成します。
2.次に、Windows フォーム上に[Button]を 3つ配置します。
3.次に、NuGet から Elastic Scale Client Library を取得するために、[ツール]メニューの[Nuget パッケージ マネージャー]の[ソリューションの NuGet パッケージの管理]をクリックします。
[NuGet パッケージの管理]ダイアログでは、[オンライン]を選択して、[検索]ボックスに「Elastic Scale」と入力して、Enter キーを押下します。これにより、検索結果に「Azure SQL Database Elastic Scale Client Library」が表示されるので、[インストール]ボタンをクリックして、インストールします。
4.インストールが完了したら、Button1 をダブルクリックして、Click イベント ハンドラーを作成し、ここにコードを記述していきます。まずは、ShardMapManager オブジェクトなどを操作するために、次のように using を利用して Elastic Scale Client ライブラリの名前空間を宣言します。
5.次に、Azure SQL Database 上のデータベース「estest」に接続するための接続文字列を private 変数として定義します。また、これから作成するシャードマップの名前も「maptest1」という値で変数として定義しておきます。
接続文字列の記述方法は、通常の ADO.NET と同様です。
6.次に、Button1 の Click イベント ハンドラーの中に、ShardMapManager オブジェクトを作成するためのコードを、次のように記述します。
ShardMapManagerFactory クラスの TryGetSqlShardMapManager メソッドで、cnstr(接続文字列)を与えて、データベース内に ShardMapManager が存在しているかどうかをチェックして、存在していない場合は、 CreateSqlShardMapManage メソッドで、ShardMapManager を作成するようにしています。作成した ShardMapManager は、GetSqlShardMapManage メソッドを利用して、smm というオブジェクト変数に格納しています。
7.次に、値の範囲でシャードマップを作成するために、続けて、次のようにコードを記述します。
CreateRangeShardMap メソッドで RangeShardMap オブジェクトを作成します。これは値の範囲(1~100 や 101~200 のような範囲)でシャード マップを作成するためのオブジェクトで、特定の値(1 や 2、3 などの値)に応じてシャードを分割することもでき、この場合は ListShardMap オブジェクトを利用します。
RangeShardMap オブジェクトでは、CreateRangeMapping メソッドで RangeMapping オブジェクトを作成して、値の範囲を定義し、CreateShard メソッドで Shard オブジェクト(シャード)を作成して、どの範囲のどのデータベースを割り当てるのかに利用します。このコードでは、shard1 に estest_1 データベースを割り当てて、1~100 の範囲マッピング、shard2 に estest_2 データベースを割り当てて、101~200 の範囲マッピングを設定しています。
8.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button1]をクリックします。
Button1 をクリックしてから 1分ぐらい経過すると、実行が完了するので、完了後、[閉じる]ボタンをクリックして、Windows フォームを終了し、デバッグ実行を終了します。
9.実行が完了した後に、Azure SQL Database 上のデータベース(estest や estest_1 など)を参照すると、次のように ShardMapManager が自動作成されていることを確認できます。
次に、Button2 がクリックされたときに、t1 テーブルにデータを追加(INSERT)するようにコードを記述していきましょう。
1.データの追加には、ADO.NET の SqlConnection と SqlCommand オブジェクトを利用するので、まずは、次のように System.Data.SqlClient 名前空間を宣言しておきます。
次に、Windows フォーム上の Button2 をダブルクリックして、Click イベント ハンドラーを作成し、次のようにコードを記述します。
データの追加は、ADO.NET でのプログラミングと同じように、SqlConnection と SqlCommand オブジェクトを利用します。SqlConnection オブジェクトを作成するときに、RangeShardMap(シャードマップ)の OpenConnectionForKey メソッドを利用して、colA に格納するデータ(data_colA=133)を与えるようにします。これは、次の図のような構成になります(前出の図の再掲)。
OpenConnectionForKey メソッドで data_colA(133)を与えることで、この値をどのシャードに格納すべきかを、ライブラリが認識できるようになっています(ShardMapManager がシャードを管理しています)。
SqlCommand オブジェクトの利用方法は、通常の ADO.NET と同じです。
2.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button2]をクリックします。
実行が完了したら、[閉じる]ボタンをクリックして、Windows フォームを終了し、デバッグ実行を終了します。
3.次に、追加されたデータを確認するために、Azure SQL Database 上のデータベース(estest_1 と estest_2)に接続して、「t1」テーブルを参照します。
シャード2(estest_2 データベース)の t1 テーブルにだけデータ(133)が追加されていることを確認できます。
4.次に、コード内の data_colA 変数に与える値を 133 から 77 に変更して、デバッグを開始し、[Button2]をクリックします。
5.実行後、追加されたデータを確認するために、「t1」テーブルを参照します。
今度は、シャード1(estest_1 データベース)の t1 テーブルにだけデータ(77)が追加されていることを確認できます。
このように、Elastic Scale Client ライブラリを利用すれば、データベースの分割(複数のデータベースを1つのデータベースのように見せかけること)ができるようになります。
次に、「t1」テーブルのデータを参照(SELECT)するコードを記述してみましょう。
1.データの参照では、複数のシャードからデータを取得するために、MultiShardConnection、MultiShardCommand、MultiShardDataReader というオブジェクトを利用しますが、基本的な利用方法は、ADO.NET の SqlConnection、SqlCommand、SqlDataReader と同じです。まずは、MultiShard~ を利用するために、次のように名前空間を宣言します。
2.次に、Windows フォーム上の Button3 をダブルクリックして、Click イベント ハンドラーを作成し、次のようにコードを記述します。
MultiShardConnection では、GetShards メソッドを利用することで、シャードの一覧を取得することができます。MultiShardCommand で実行したい SELECT ステートメントを定義して、MultiShardDataReader で実行結果を Read するという形になります。
3.コードの記述が完了したら、ツールバーの[開始]ボタンをクリックしてデバッグを開始し、[Button3]をクリックします。
実行が完了すると、次のように[出力]ウィンドウに t1 テーブルのデータが表示されているこを確認できます。
確認が完了したら、最後にデータベースを削除しておきます(データベースが残っていると課金対象になるので、削除しておくようにしてください)。データベースを削除すれば、Elastic Scale の設定(ShardManager の情報など)も完全に削除されることになります。
1.データベースの削除は、Azure SQL Database の master データベースに接続して、DROP DATABASE ステートメントを実行します。
以上のように、Elastic Scale Client ライブラリを利用すれば、複数のデータベースを1つのデータベースのように見せかけることができるようになります。データベースのシャーディングを実現できます。
Elastic Scale では、Split(シャードの分割)や Merge(2つのシャードの統合)などもあるので、冒頭のドキュメント マップを参考に、ぜひ試してみてください。
第60回:SQL Server 2017 自習書 No.3「SQL Server 2017 Machine Learning Services」のご案内
第59回:SQL Server 2017 自習書 No.2「SQL Server 2017 on Linux」のご案内
第58回:SQL Server 2017 自習書 No.1「SQL Server 2017 新機能の概要」のご案内
第57回:SQL Server 2017 RC 版とこれまでのドキュメントのまとめ
第56回:「SQL Server 2016 への移行とアップグレードの実践」完成&公開!
第55回:書籍「SQL Server 2016の教科書 開発編」(ソシム)が発刊されました
第54回:「SQL Server 2016 プレビュー版 Reporting Services の新機能」自習書のお知らせ
第 53 回:SQL Server 2016 Reporting Services の新しくなったレポート マネージャーとモバイル レポート機能
第 52 回:SQL Server 2016 の自習書を作成しました!
第 51 回:PASS Summit と MVP Summit で進化を確信!
第 50 回:新しくなった Power BI(2.0)の自習書を作成しました!
第49 回:Excel 2016 の Power Query を使う
第 48 回:新しくなった Microsoft Power BI ! 無料版がある!!
第 47 回:「Microsoft Azure SQL Database 入門」 完成&公開!
第 46 回:Microsoft Power BI for Windows app からの Power BI サイト アクセス
第 45 回:Power Query で取得したデータを PowerPivot へ読み込む方法と PowerPivot for Excel 自習書のご紹介
第44回:「SQL Server 2014 への移行とアップグレードの実践」ドキュメントを作成しました
第43回:SQL Server 2014 インメモリ OLTP 機能の上級者向けドキュメントを作成しました
第42回:Power Query プレビュー版 と Power BI for Office 365 へのクエリ保存(共有クエリ)
第41回:「SQL Server 2014 CTP2 インメモリ OLTP 機能の概要」自習書のお知らせです
第40回: SQL Server 2012 自習書(HTML版)を掲載しました
第39回: Power BI for Office 365 プレビュー版は試されましたか?
第38回: SQL Server 2014 CTP2 の公開
第37回: SQL Server 2014 CTP1 の自習書をご覧ください
第36回: SQL Server 2014 CTP1 のクラスター化列ストア インデックスを試す
第35回: SQL Server 2014 CTP1 のインメモリ OLTP の基本操作を試す
第34回: GeoFlow for Excel 2013 のプレビュー版を試す
第33回: iPad と iPhone からの SQL Server 2012 Reporting Servicesのレポート閲覧
第32回: PASS Summit 2012 参加レポート
第31回: SQL Server 2012 Reporting Services 自習書のお知らせ
第30回: SQL Server 2012(RTM 版)の新機能 自習書をご覧ください
第29回: 書籍「SQL Server 2012の教科書 開発編」のお知らせ
第26回: SQL Server 2012 の Power View 機能のご紹介
第25回: SQL Server 2012 の Data Quality Services
第24回: SQL Server 2012 自習書のご案内と初セミナー報告
第23回: Denali CTP1 が公開されました
第22回 チューニングに王道あらず
第21回 Microsoft TechEd 2010 終了しました
第20回 Microsoft TechEd Japan 2010 今年も登壇します
第19回 SQL Server 2008 R2 RTM の 日本語版が公開されました
第18回 「SQL Azure 入門」自習書のご案内
第17回 SQL Server 2008 自習書の追加ドキュメントのお知らせ
第16回 SQL Server 2008 R2 自習書とプレビュー セミナーのお知らせ
第15回 SQL Server 2008 R2 Reporting Services と新刊のお知らせ
第14回 TechEd 2009 のご報告と SQL Server 2008 R2 について
第13回 SQL Server 2008 R2 の CTP 版が公開されました
第12回 MVP Summit 2009 in Seattle へ参加