前回 までで、Windows Azure SQL Databaseのスケールアウト機能であるSQL Database Federationの概念と、フェデレーションオブジェクトの作成/メンバーデータベースへの接続方法/フェデレーションテーブルの作成方法について説明しました。
今回は、メンバーデータベースを追加しスケールアウトさせる方法、メンバーデータベースを削除しスケールインさせる方法について説明します。さらにフェデレーションを使用することによる制限事項についても説明します。
フェデレーションを分割しメンバーデータベースを追加する
前回までの手順で、図1 のようにデータベース内にフェデレーションオブジェクト(OrderFederation)を作成し、フェデレーションオブジェクトに所属するルートデータベースとメンバーデータベース1つが生成されました。メンバーデータベース内には、フェデレーションテーブル2つと参照テーブルを1つ作成しました。
図1 OrderFederationの状況
OrderFederationのフェデレーションキーレンジ(範囲)は、MIN~MAXまでとなっておりメンバーデータベース1つ内にすべて含まれています[1] 。これを10万で分割し、MIN~10万、10万~MAXの2つに分離させます。分離させる方法はTransact-SQLを発行する方法とSQL Azure管理ポータルを使用する方法の2通りあります。
SQL Azure管理ポータルでフェデレーションを分割する方法
SQL Azure管理ポータルにログインし、データベースの管理概要を表示します。管理概要画面にフェデレーション(OrderFederation)が表示されているので、選択するとフェデレーションの詳細が表示されます(図2 ) 。
図2 SQL Azure管理ポータルの管理概要
フェデレーションの詳細を表示すると、フェデレーションメンバーが表示されます。メンバーを選択し「分割」を選択することで、メンバーデータベースを分割するフェデレーションキー区切りを指定できます。ここでは1000を入力し「分割」をクリックします(図3 ) 。
図3 SQL Azure管理ポータルでメンバーデータベースの分割
メンバーデータベースの分割が完了後、更新ボタンを選択すると図4 のように、分割が完了したメンバーデータベースの状況が表示されます。以上で、MIN~1000、1000~MAXに分割できました。
図4 メンバーデータベースの状況
Transact-SQLでフェデレーションを分割する方法
Transact-SQLで、同様にフェデレーションキーを1000で分割するには、ルートデータベースに接続しクエリ1 を発行します。
クエリ1 フェデレーションメンバーの分割
USE FEDERATION ROOT WITH RESET
GO
ALTER FEDERATION [OrderFederation] SPLIT AT ([orderID] = 1000)
GO
フェデレーションの分割処理の実行状況を確認するには、sys.dm_federation_operationsを参照します。図5 は、フェデレーションの分割を実行しているときの表示です。
図5 フェデレーションの分割処理状況
フェデレーションの分割状況を確認するには、sys.federation_member_distributionsを参照します。図6 は、フェデレーションの分割状況を表しています。MIN(-2147483648) ~1000、1000~2000、2000~MAXで分割されていることを確認できます。
図6 フェデレーションの分割状況
フェデレーションを分割した場合の影響
フェデレーションの分割処理をすると、オンラインで分割処理が進められます。分割処理が完了するまでは、処理する前のフェデレーションを使用し続けることができます。分割処理が完了した段階で、処理前のデータベースと処理後のデータベースが入れ替えます。入れ替え処理は、トランザクション制御されるので、分割処理が完了した段階までにコミットされたトランザクションが反映されます。
分割したフェデレーションに接続し、テーブル状況を確認すると図7 のように分割前のテーブルスキーマを継承しています。
図7 スキーマの継承
継承するのはテーブルスキーマだけでは無くデータも継承します。注文テーブルは、ID列とOrderName列を持ち、ID列をフェデレーションキーに指定したフェデレーションテーブルです。このテーブルに「50、test50」と「1050、test1050」を登録し、1000でフェデレーションを分割すると、登録されているデータもデータがそれぞれ別々のメンバーデータベースにデータが分割されます。
フェデレーションテーブルは、フェデレーションキーに応じてデータも分割され範囲内に収まるデータのみが格納されます。フェデレーションテーブルに、フェデレーションキーの範囲外のデータを登録しようとすると次のエラーが発生します。
メッセージ 45022、レベル 16
A column insert or update conflicts with a federation member range. The statement was terminated.
参照テーブルは、フェデレーション分割すると全データが複製されます。
フェデレーションを結合しメンバーデータベースを削除する
フェデレーションを分割し、メンバーデータベースを増やしました。フェデレーションを結合し、増やしたメンバーデータベースを減らすこともできます。フェデレーションの結合は、Transact-SQLを使用する方法だけが提供されています。
SQL Azure管理ポータルで図8 のように「フェデレーションメンバーの削除」と言うメニュー項目が提供されていますが、選択してもクエリだけが表示されます。
図8 フェデレーションメンバーの削除メニュー
フェデレーションメンバーを削除するには、削除したいフェデレーション境界値を指定します(クエリ2 ) 。
クエリ2 フェデレーションメンバーの削除
--ALTER FEDERATION [OrderFederation]
--DROP AT (LOW | HIGH [orderID] = low_boundary_value|high_boundary_value)
--
--例
ALTER FEDERATION [OrderFederation] DROP AT (LOW [orderID] = 1000)
フェデレーションの結合による影響
フェデレーションを結合しメンバーデータベースを削除すると、フェデレーションテーブルは結合され、結合前は別々のメンバーデータベース内に格納されていたデータが統合されます。
参照テーブルは、それぞれのメンバーデータベース内で個別に更新することができます。それぞれの参照テーブルは独立しているので、参照テーブルを更新してもほかのメンバーデータベースには影響を及ぼしません(図9 ) 。マスターデーターを更新するには、すべてのメンバーデータベースにある参照テーブルを更新する必要があります。参照テーブルのデータにずれがある状態でフェデレーションを結合すると、結合先フェデレーションの参照テーブルのデータが継続します。
図9 参照テーブルの概要
フェデレーションを使用する際の制限事項
フェデレーションには、フェデレーション特有の制限事項があります。詳細は、「フェデレーションのガイドラインと制限事項」 で説明されています。ここでは、この中からいくつかを取り上げて説明します。
IDENTITY列属性が使用できない
フェデレーションテーブルではIDENTITY列属性を使用することができません。IDENTITYを指定して、テーブルを作成すると次のようなエラーが発生します。そのため、フェデレーションを使用する際には、自動採番を別途準備する必要があります。
メッセージ 40577、レベル 16、状態 6、行 2
The constraint 'IDENTITY' is not supported in a federated database.
フェデレーション分割と結合
オンラインでフェデレーションの分割と結合をすることができますが、分割・結合により、物理DBが変わってしまうため、データベースのコネクションが切断されてしまいます。
オンラインでフェデレーション分割をする予定があるシステムを実装する際には、コネクションの再接続ロジックを組み込むことが必要になります[2] 。