SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

はじめての SQL Azure フェデレーション その 1

leave a comment

先日、SQL Azure の管理ポータルが新しくなりました。
image

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


■SQL Azure フェデレーションの基本的な構成


SQL Azure フェデレーションは複数のデータベースを使用してデータをシャーディングするための機能となります。

この際の複数のデータベースですが、管理単位として作成した複数のデータベースに対してデータを分割するのではなく、一つのデータベースを SPLIT を使用して分割していくことで複数のデータベースを使用することを可能としています。

SQL Azure では一つのサーバーに対して複数のデータベースを作成することが可能です。

image

image

SQL Azure フェデレーションは以下のような形式で複数のデータベースにデータを分散する機能ではありません。
image

データを分散する方法のイメージは以下のようになります。
image

最初に作成するデータベースは一つになります。
そのデータベースに対してフェデレーションを設定し、SPLIT を使用することで内部的に複数のデータベースにデータを分散させていくという形式にとなります。

そのため、見かけ上は一つのデータベースに対しての操作となります。

先ほどは CloudDB1 というデータベースにフェデレーションを設定したのですが、この環境に対して SSMS で接続をしてみます。
この際、SQL Server 2012 RC0 ではなく SQL Server 2008 R2 の SSMS を使用するとフェデレーションを設定した後の構造がわかり易いと思います。

SQL Server 2012 RC0 の SSMS で SQL Azure に接続をすると以下のような表示となります。
image

SQL Server 2008 R2 の SSMS で接続をすると認識されているデータベースの数に違いがあります。
image

Federation Member という単位ごとに一つ [system-<GUID>] のデータベースが作成されるようですね。
フェデレーションを使用したテーブルに関してはベースとなるデータベースではなく [system-<GUID>] のデータベース内に作成されるようです。
image

SQL Server 2012 RC0 の SSMS だと、接続しているデータベースで Federation Member を判断できるようです。
image

 

■フェデレーションされたデータベースへの接続


フェデレーションされたテーブルは通常のデータベース接続では使用することができません。
# そのオブジェクトが存在すると認識されません。

フェデレーションを使用する際には USE FEDERATION 句を使用するのですが、この句を使用することで接続するデータベースコンテキストがフェデレーションにより分散されているデータベースに変更されます。
image

コンテキストを通常のデータベースに戻すためには、[USE FEDERATION ROOT WITH RESET] を使用します。
# フェデレーションルートに対しての接続に戻します。
image

2012 RC0 の Federation で対象の SQL Azure フェデレーションをダブルクリックすると以下のようなダイアログが表示されます。
image

ここから、対象の Federation Member に接続するということもできます。
image

 

■フェデレーションの設定


それでは実際にフェデレーションを設定してみたいと思います。

フェデレーションを設定する際には、最初にどのようにデータを分散させるかを決定する必要があります。

フェデレーションの設定はクエリでも可能ですが、管理ポータルから GUI で設定することも可能です。
image

管理ポータルでフェデレーションを設定するデータベースを選択しすると、メニューに [New Federation] が表示されています。
このメニューからフェデレーションを GUI で設定することが可能です。

Federation の設定画面がこちらになります。
image

各項目の大体の意味は以下のようになりそうです。

項目 内容
Name Federation の名称
Distribution Name 分散時に使用するキー項目の名称
Federation としての管理名となるため、Federation によりデータを分散させるテーブルのカラム名と同一でなくても良い
Distribution Data Type 分散時に使用するキー項目のデータ型
以下の選択が可能
# varbinary の場合はデータ長(1~900) を指定する。
image
Distribution Type 分散の方法
bigint : RANGE
int : RANGE
uniqueidentifier : RANGE
varbinary : RANGE

クエリでフェデレーションを設定する場合は、[CREATE FEDERATION] を使用します。

CREATE FEDERATION <Federation_Name, sysname, Federation_Name>
(<Distribution_Name, sysname, Distribution_Name> <Data_Type, systype, BIGINT> RANGE)
GO

例)
CREATE FEDERATION SQL_Azure_Federation(
FedId int RANGE
)

 

これらの操作をすることでフェデレーションを設定することが可能です。

 

 

■フェデレーションの管理


SQL Azure の管理ポータルからフェデレーションを使用したデータベースが存在しているということを確認することができます。
image

 

フェデレーションに関するシステムテーブルとしては、以下のテーブル / 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 に作成したフェデレーションが表示されます。
image

作成したフェデレーションの横に表示されている [image] をクリックするとフェデレーションの設定の詳細を表示することができます。
image

フェデレーション内のデータベースは 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 という項目を開くことができます。
image

右クリックをするとフェデレーション用のメニューが表示されます。
image

SSMS からも管理をするための入り口が用意されているのが確認できますね。

 

■フェデレーションの設定


Federation Member をクリックすると Federation の設定をすることができます。

image

メニューの構成は以下のようになっているようです。

1 項目目 2 項目目 内容
Overview View Summary 選択している Federation Member の概要を表示
Query New Query 選択している Federation Member に対してクエリを実行
USE FEDERATION 句が自動で生成される
  Create FederatedTable 選択している Federation を使用したテーブルを作成
CREATE TABLE に FEDERATED ON が自動で付与される
  Split Federation Member SPLIT を使用して Federation Member を分割する
ALTER FEDERATION ~ SPLIT AT 句が自動で生成される
# Split_Value を適切な値に手動で設定する
  Drop Federation Member DROP を使用して Federation Member を削除する
ALTER FEDERATION ~ DROP AT 句が自動で生成される
# boundary_value を適切な値に手動で設定する
Split   サイズを設定することで Split を GUI から実行する
image
Resize image 選択している Federation Member のサイズを変更する
Federation Menber 毎に異なるサイズを指定できる
image

 

 

■フェデレーションされたテーブルの作成


それでは作成したフェデレーションを使用したテーブルを作成してみたいと思います。

フェデレーションされたテーブルを使用すると各 Federation Member にデータを分散させることができるようになります。
image

Federation Member を選択して、[Create Federated Federated Table] をクリックします。
image

そうすると選択しているフェデレーションを使用したテーブル作成のクエリが作成されます。
image

フェデレーションされたテーブルでは、IDENTITY はサポートされないようなので注意が必要そうですね。
# 他にもフェデレーションと紐づける項目については NOT NULL / クラスター化インデックス or ユニーク制約 / 計算列は使えない という条件がありそうです。
image

今回は以下のテーブルを作成しています。
# Col3 をハッシュ値とするテーブルを作成し、その項目をフェデレーションで分散させる単位としています。

USE FEDERATION [SQL_Azure_Federation] ([FedId] = -1) WITH FILTERING = OFF, RESET
GO

CREATE TABLE dbo.Table1(
        Col1 bigint NOT NULL,
        Col2 nchar(1000) NULL,
        Col3 int NOT NULL
CONSTRAINT [PK_Table1] PRIMARY KEY(Col1 ASC, Col3 ASC),
) FEDERATED ON ([FedId] = Col3)
GO

最終的には以下のような形でデータを分散させようと思っています。
image

 

■フェデレーションされたテーブルにデータを挿入


フェデレーションされたテーブルの作成はフェデレーションに対しての操作になるため、必ず [USE FEDERATION] を明示的に実行する必要があるようです。
# USE する際の Distribution Name の指定はどのような形式が正しいのかが分かっていません…。自動生成されるクエリだと負の値が設定されていたので -1 にしています。

DROP TABLE する際も USE FEDERATION をしてから削除する必要がありそうです。
USE FEDERATION していない状態でフェデレーションされたテーブルを削除しようとすると
image
というエラーになります。

それでは作成したテーブルに対してデータを挿入してみます。
USE FEDERATION を使用してコンテキストを切り替えないと、フェデレーションされたテーブルに対しての INSERT をすることができません。
以下のクエリでデータを挿入することが可能です。

USE FEDERATION [SQL_Azure_Federation] ([FedId] = -1) WITH FILTERING = OFF, RESET
GO
SET NOCOUNT ON
GO

DECLARE @i bigint=0
WHILE (@i < 400000)
BEGIN
INSERT INTO Table1 VALUES(@i, NEWID(), CAST(ABS(@i % 3) AS INT))
SET @i += 1
END

今回はフェデレーションを定義する前 (すべての範囲が一つの FederationMember になっている) の状態で INSERT をしています。
複数の Federation Member が存在している場合は、クエリの実行も少し変わってきます。

 

■データを分散させる


データの挿入が終わったら SPLIT をして分散させてみたいと思います。

現在は Federation Member は一つですので以下のようなデータの格納になっています。
image

それでは Federation Member を追加してデータを分散させます。

管理ポータルから実行する場合は、データを分散させる元になる Federation Member を選択して、Split から実行します。
image

クエリから実行する場合は以下のような形式となります。

USE FEDERATION ROOT WITH RESET
GO

ALTER FEDERATION <Federation_Name, sysname, > SPLIT AT
(<Distribution_Name, sysname, > = <Boundary_Value, keytype, >)
GO

例)
USE FEDERATION ROOT WITH RESET
GO

ALTER FEDERATION [SQL_Azure_FEDERATION] SPLIT AT  (FedId = 1)
GO

Split の最中は管理ポータルでは Member は以下のような表示となります。
image

データの分散が終わった後の状態がこちらになります。
Federation Member が増えて Split に指定したデータ以降のものが新しいメンバーに移動されました。

imageimage

 

最終的には 3 つの Federation Member に分割しています。
imageimage

■データの削除する


フェデレーションは DROP することで対象の Federation Member のデータを削除することが可能です。
マージという操作は無いようですね。

ポータルから実行する場合は Drop Federation Member を使用します。
image

Split は GUI からできましたが Drop の場合は、クエリーで実行する必要があるようです。
image

クエリーの形式はこのようになります。

USE FEDERATION ROOT WITH RESET
GO

ALTER FEDERATION <Federation_Name, sysname, > DROP AT (<Boundary_Side, LOW_OR_HIGH, HIGH>
<Distribution_Name, sysname, > = <Boundary_Value, keytype, >)
GO

以下のフェデレーションされたテーブルに対して DROP を実行してみます。
image

LOW を指定して DROP を実行してみます。

USE FEDERATION ROOT WITH RESET
GO

ALTER FEDERATION [SQL_Azure_FEDERATION] DROP AT (LOW FedId=2)
GO

この場合は以下のような削除となります。 

HIGH を指定して DROP を実行してみます。

USE FEDERATION ROOT WITH RESET
GO

ALTER FEDERATION [SQL_Azure_FEDERATION] DROP AT (HIGH FedId=2)
GO

 

この場合は以下のような削除となります。
# High = 2 の右隣が削除されました。
image

フェデレーションの DROP ではフェデレーションの境界値を指定するのですが、どのメンバーが削除されるかは注意する必要がありそうです。

 

SQL Azure フェデレーションではクエリ操作に関しても Federation Member を意識する必要がありそうです。

これに関しては次の投稿でまとめてみたいと思います。
# 長く書きすぎました…。

Written by masayuki.ozawa

12月 11th, 2011 at 1:50 pm

Posted in SQL Azure

Tagged with

Leave a Reply

*