先日、SQL Azure の管理ポータルが新しくなりました。
SQL Azure のバージョンも [Microsoft SQL Azure (RTM) – 11.0.1814.30] となっています。
今回のバージョンアップで、SQL Azure フェデレーションとデータベース単位での照合順序設定を使用することが可能になったようです。
今回は SQL Azure フェデレーションの基本的な動作についてみていきたいと思います。
投稿を書いている時点では、MSDN の SQL Azure のページには今回のバージョンアップによる変更はまだ記載されていないみたいですが、追加はされると思いますので後日見てみると良いかと思います。
SQL Azure Landing Page
また、Traning Kit には SQL Azure フェデレーションについてのトレーニングが追加されていますので、こちらも参考になります。
Windows Azure Platform Training Kit – November Update
また、US の Tech Ed でも SQL Azure についてのセッションがありましたのでこちらも参考になります。
Building Scalable Database Solutions Using Microsoft SQL Azure Database Federations
CodePlex でこのようなツールもあるようです。
SQL Azure Federation Data Migration Wizard
Contents
■SQL Azure フェデレーションの基本的な構成
SQL Azure フェデレーションは複数のデータベースを使用してデータをシャーディングするための機能となります。
この際の複数のデータベースですが、管理単位として作成した複数のデータベースに対してデータを分割するのではなく、一つのデータベースを SPLIT を使用して分割していくことで複数のデータベースを使用することを可能としています。
SQL Azure では一つのサーバーに対して複数のデータベースを作成することが可能です。
SQL Azure フェデレーションは以下のような形式で複数のデータベースにデータを分散する機能ではありません。
最初に作成するデータベースは一つになります。
そのデータベースに対してフェデレーションを設定し、SPLIT を使用することで内部的に複数のデータベースにデータを分散させていくという形式にとなります。
そのため、見かけ上は一つのデータベースに対しての操作となります。
先ほどは CloudDB1 というデータベースにフェデレーションを設定したのですが、この環境に対して SSMS で接続をしてみます。
この際、SQL Server 2012 RC0 ではなく SQL Server 2008 R2 の SSMS を使用するとフェデレーションを設定した後の構造がわかり易いと思います。
SQL Server 2012 RC0 の SSMS で SQL Azure に接続をすると以下のような表示となります。
SQL Server 2008 R2 の SSMS で接続をすると認識されているデータベースの数に違いがあります。
Federation Member という単位ごとに一つ [system-<GUID>] のデータベースが作成されるようですね。
フェデレーションを使用したテーブルに関してはベースとなるデータベースではなく [system-<GUID>] のデータベース内に作成されるようです。
SQL Server 2012 RC0 の SSMS だと、接続しているデータベースで Federation Member を判断できるようです。
■フェデレーションされたデータベースへの接続
フェデレーションされたテーブルは通常のデータベース接続では使用することができません。
# そのオブジェクトが存在すると認識されません。
フェデレーションを使用する際には USE FEDERATION 句を使用するのですが、この句を使用することで接続するデータベースコンテキストがフェデレーションにより分散されているデータベースに変更されます。
コンテキストを通常のデータベースに戻すためには、[USE FEDERATION ROOT WITH RESET] を使用します。
# フェデレーションルートに対しての接続に戻します。
2012 RC0 の Federation で対象の SQL Azure フェデレーションをダブルクリックすると以下のようなダイアログが表示されます。
ここから、対象の Federation Member に接続するということもできます。
■フェデレーションの設定
それでは実際にフェデレーションを設定してみたいと思います。
フェデレーションを設定する際には、最初にどのようにデータを分散させるかを決定する必要があります。
フェデレーションの設定はクエリでも可能ですが、管理ポータルから GUI で設定することも可能です。
管理ポータルでフェデレーションを設定するデータベースを選択しすると、メニューに [New Federation] が表示されています。
このメニューからフェデレーションを GUI で設定することが可能です。
各項目の大体の意味は以下のようになりそうです。
クエリでフェデレーションを設定する場合は、[CREATE FEDERATION] を使用します。
CREATE FEDERATION <Federation_Name, sysname, Federation_Name> 例) |
これらの操作をすることでフェデレーションを設定することが可能です。
■フェデレーションの管理
SQL Azure の管理ポータルからフェデレーションを使用したデータベースが存在しているということを確認することができます。
フェデレーションに関するシステムテーブルとしては、以下のテーブル / DMV があるようです。
sys.dm_federation_operation_error_members |
sys.dm_federation_operation_errors |
sys.dm_federation_operation_members |
sys.dm_federation_operations |
sys.federation_distribution_history |
sys.federation_distribution_history_table |
sys.federation_history |
sys.federation_history_table |
sys.federation_member_distribution_history |
sys.federation_member_distribution_history_table |
sys.federation_member_history |
sys.federation_member_history_table |
sys.federation_operation_members_table |
sys.federation_operations_table |
GUI からフェデレーションの設定を取得 / 管理することが可能です。
フェデレーションを設定するとデータベースのサマリーページの Federations に作成したフェデレーションが表示されます。
作成したフェデレーションの横に表示されている [] をクリックするとフェデレーションの設定の詳細を表示することができます。
フェデレーション内のデータベースは Federation Member として管理がされるようです。
各 Federation Member のデータベースの使用量もここから確認することができるようです。
先ほどは、SQL Server 2008 R2 の SSMS を使用してフェデレーションのデータベースの構成を見ていましたが、SQL Server 2012 RC0 の SSMS は SQL Azure フェデレーションに対応していないかというとそういうことはありません。
SQL Server 2012 RC0 の SSMS は フェデレーションに対応しています。
# 現在の 2008 R2 の SSMS がフェデレーションに完全に対応していなかったのであのような見え方がたまたまできていたというkとになるかと。
SQL Server 2012 RC0 の SSMS でフェデレーションを設定している SQL Azure に対して接続をすると Federations という項目を開くことができます。
右クリックをするとフェデレーション用のメニューが表示されます。
SSMS からも管理をするための入り口が用意されているのが確認できますね。
■フェデレーションの設定
Federation Member をクリックすると Federation の設定をすることができます。
メニューの構成は以下のようになっているようです。
■フェデレーションされたテーブルの作成
それでは作成したフェデレーションを使用したテーブルを作成してみたいと思います。
フェデレーションされたテーブルを使用すると各 Federation Member にデータを分散させることができるようになります。
Federation Member を選択して、[Create Federated Federated Table] をクリックします。
そうすると選択しているフェデレーションを使用したテーブル作成のクエリが作成されます。
フェデレーションされたテーブルでは、IDENTITY はサポートされないようなので注意が必要そうですね。
# 他にもフェデレーションと紐づける項目については NOT NULL / クラスター化インデックス or ユニーク制約 / 計算列は使えない という条件がありそうです。
今回は以下のテーブルを作成しています。
# Col3 をハッシュ値とするテーブルを作成し、その項目をフェデレーションで分散させる単位としています。
USE FEDERATION [SQL_Azure_Federation] ([FedId] = -1) WITH FILTERING = OFF, RESET CREATE TABLE dbo.Table1( |
最終的には以下のような形でデータを分散させようと思っています。
■フェデレーションされたテーブルにデータを挿入
フェデレーションされたテーブルの作成はフェデレーションに対しての操作になるため、必ず [USE FEDERATION] を明示的に実行する必要があるようです。
# USE する際の Distribution Name の指定はどのような形式が正しいのかが分かっていません…。自動生成されるクエリだと負の値が設定されていたので -1 にしています。
DROP TABLE する際も USE FEDERATION をしてから削除する必要がありそうです。
USE FEDERATION していない状態でフェデレーションされたテーブルを削除しようとすると
というエラーになります。
それでは作成したテーブルに対してデータを挿入してみます。
USE FEDERATION を使用してコンテキストを切り替えないと、フェデレーションされたテーブルに対しての INSERT をすることができません。
以下のクエリでデータを挿入することが可能です。
USE FEDERATION [SQL_Azure_Federation] ([FedId] = -1) WITH FILTERING = OFF, RESET DECLARE @i bigint=0 |
今回はフェデレーションを定義する前 (すべての範囲が一つの FederationMember になっている) の状態で INSERT をしています。
複数の Federation Member が存在している場合は、クエリの実行も少し変わってきます。
■データを分散させる
データの挿入が終わったら SPLIT をして分散させてみたいと思います。
現在は Federation Member は一つですので以下のようなデータの格納になっています。
それでは Federation Member を追加してデータを分散させます。
管理ポータルから実行する場合は、データを分散させる元になる Federation Member を選択して、Split から実行します。
クエリから実行する場合は以下のような形式となります。
USE FEDERATION ROOT WITH RESET ALTER FEDERATION <Federation_Name, sysname, > SPLIT AT 例) ALTER FEDERATION [SQL_Azure_FEDERATION] SPLIT AT (FedId = 1) |
Split の最中は管理ポータルでは Member は以下のような表示となります。
データの分散が終わった後の状態がこちらになります。
Federation Member が増えて Split に指定したデータ以降のものが新しいメンバーに移動されました。
最終的には 3 つの Federation Member に分割しています。
■データの削除する
フェデレーションは DROP することで対象の Federation Member のデータを削除することが可能です。
マージという操作は無いようですね。
ポータルから実行する場合は Drop Federation Member を使用します。
Split は GUI からできましたが Drop の場合は、クエリーで実行する必要があるようです。
クエリーの形式はこのようになります。
USE FEDERATION ROOT WITH RESET ALTER FEDERATION <Federation_Name, sysname, > DROP AT (<Boundary_Side, LOW_OR_HIGH, HIGH> |
以下のフェデレーションされたテーブルに対して DROP を実行してみます。
LOW を指定して DROP を実行してみます。
USE FEDERATION ROOT WITH RESET ALTER FEDERATION [SQL_Azure_FEDERATION] DROP AT (LOW FedId=2) |
この場合は以下のような削除となります。
HIGH を指定して DROP を実行してみます。
USE FEDERATION ROOT WITH RESET ALTER FEDERATION [SQL_Azure_FEDERATION] DROP AT (HIGH FedId=2) |
この場合は以下のような削除となります。
# High = 2 の右隣が削除されました。
フェデレーションの DROP ではフェデレーションの境界値を指定するのですが、どのメンバーが削除されるかは注意する必要がありそうです。
SQL Azure フェデレーションではクエリ操作に関しても Federation Member を意識する必要がありそうです。
これに関しては次の投稿でまとめてみたいと思います。
# 長く書きすぎました…。