クラウドの特徴はスケールアウト
クラウドサービスの多くは、大量のデータを格納したり大量の処理を捌くのに、複数のコンピュータを並列に繋げるスケールアウトが採用されています。SQL AzureもマイクロソフトのDCで提供されるクラウドサービスです。SQL Azureのサービスの特徴を見直してみましょう。
SQL Azureのデータベース最大容量は150GBです。また共有サービスモデルで提供されるため、過剰なリソース消費をした場合、接続を切断されてしまいます。大容量のデータを格納するデータベースや、負荷が高いデータベースはSQL Azureで運用できないように思えるかもしれません。確かに運用できない時期もありましたが、現在は運用することができます。SQL Azureで大容量データを格納したり、高負荷環境の運用を可能にしたのが2011年12月に追加されたSQL Azure Federationです。
SQL Azure Federationとパーティショニング
SQL Azure Federationは、SQL Azureデータベースをスケールアウトする機能です。複数のデータベースを使用して、負荷の分散、データの分散をします。SQL Azure Federationは、テーブルのパーティショニングで行方向に分けて分散させます。
テーブルのパーティショニングとは、どういったものか具体例を出して説明します。たとえば顧客テーブルがあったとします。顧客テーブルには顧客IDや顧客名などの列があります。顧客テーブルは1つで、100万件格納されているのが図1です。
図2は顧客テーブルを顧客IDに応じて複数のテーブルに分けました。各テーブルは10万件ずつ格納するようにし、顧客IDが1から100000までが顧客テーブル1、顧客IDが100001から200000までが顧客テーブル2というように、顧客IDに紐づけて顧客テーブルを10個に分割しました。
テーブルを分割することで、テーブルに格納されるデータを複数テーブルに分散させることができました。しかし、顧客情報を参照するたびに、どの顧客テーブルに参照しようとしている顧客情報が格納されているかを意識する必要があります。顧客ID504000は、顧客ID500001から600000の顧客情報を格納している顧客テーブル6に含まているので、顧客テーブル6を参照します。
顧客IDから参照先を調べるのは手間が増えてしまいます。データベースの機能として提供されるパーティショニングは、その手間を無くしています。図3のように、テーブルは図2のように顧客IDに応じて複数テーブルとして分散されています。しかし、あたかも1つのテーブルのように見せます。たとえば、顧客ID504000の情報を参照するときも顧客テーブルを参照するだけです。データベース側で顧客IDから格納先を調べ、自動的に対象テーブルに振り分けてくれます。このように複数テーブルにデータが分散されているにもかかわらず、格納先を意識する必要が無いのがテーブルのパーティショニング機能です。
SQL Azure Federationのパーティショニングも、テーブルを特定のキーに応じて複数のテーブルに分けますが、どのテーブルに含まれているのかを意識する必要が無いという点で同じ考え方です。
SQL Azure Federationでは、分割したテーブル毎に別々のデータベースに格納します。図4のように、フェデレーションには複数のデータベースが含まれています。それぞれのデータベースは、テーブルを分割するキーの範囲で分割されます。今回の例では、100000区切りに分割していますので、各データベースも「最小値~100000」「100001~200000」……「900001~最大値」で区切られます。
SQL Azure Federationでは、テーブルをキーに応じて分割し、複数のデータベースに分散配置してスケールアウトすることで、大容量のデータを格納し、高負荷を分散処理できるようにしました。複数のデータベースに分割しつつも、どのデータベースに格納されているのかを意識しなくても良いようになっています。
SQL Azure Federationの構成要素と名称
SQL Azure Federationを構成する要素と名称について説明します。どのような構成要素があるのかを把握しておくことで、SQL Azure Federationを理解しやすくなります。図5は、構成要素の概略図です。
フェデレーション(Federations)
フェデレーションは、SQL Azureデータベース内に作成されるデータベースオブジェクトです。パーティショニングされたすべてのデータを示します。フェデレーションは、データの分割方法とデータを分割するのに使用するキーを定義します。データの分割方法は、範囲(Range)区切りの方法のみ提供されています。
データベース内に複数のフェデレーションを作成することができ、フェデレーションごとに独立した分割スキーマをもちます。たとえば、同じデータベース内に注文テーブルと顧客テーブルがあり、それらをパーティショニングして注文フェデレーションと顧客フェデレーションを定義できます。
フェデレーションキー(Federation Key)
フェデレーションキーはデータを分割するのに使用するキーです。キーは、guidやbigintなどのデータ型とデータの分割方法を定義します。今のところ、提供されているデータ分割方法は、範囲(Range)のみです。また、キーにしている列も今のところ1つだけです。将来的には、複合キーを指定できるようになる予定です。
アトミックユニット(Atomic Unit:AU)
フェデレーションキーの値で示される1つのインスタンスです。アトミックユニットは、これ以上分割することができない最小単位の行の集合です。アトミックユニット内に含まれるデータは、すべて同じフェデレーションキーの値を持っています。たとえば、注文テーブルを顧客IDをフェデレーションキーに指定している場合、アトミックユニットは顧客ID=55のように表現されます。顧客は複数の注文をしていますので、顧客IDに紐づく注文が100件あるかもしれません。しかし、顧客IDで分割していますので、100件の注文をさらに分割することはできません。顧客ID55の注文100件がアトミックユニット1つ分となります。
フェデレーションメンバー(Federation Member)
フェデレーションメンバーは、アトミックユニットの集合体で、範囲で指定したアトミックユニットを実際に格納する物理的要素になります。たとえば、顧客IDを100000区切りで分割している場合、顧客ID「最小値~100000」「100001~200001」のように100000ごとにアトミックユニットを集めて格納する物理要素が、フェデレーションメンバーです。
フェデレーションルート
フェデレーションルートは、フェデレーションを格納しているデータベースです。フェデレーションを含んでいるデータベースは、全てのフェデレーションメンバーのフェデレーションルートとなります。
フェデレーションテーブル(Federated Tables)
フェデレーションテーブルは、フェデレーションメンバーに含まれるテーブルで、分割したデータを格納します。参照テーブル(Reference Tables)は、参照目的でフェデレーションメンバーに複製された参照用テーブルです。フェデレーションメンバーは、それぞれ異なるSQL Azureデータベースに格納されます。
SQL Azureデータベースは、同じSQL Azureサーバに作成していても異なる物理マシンに作成されるため、データベースをまたがったデータの参照をすることはできません。そのため、フェデレーションされたテーブルとフェデレーションされていないテーブルを結合するには、フェデレーションメンバー内にフェデレーションされていないテーブルが含まれている必要があります。参照用したいテーブルを参照テーブルとして定義することで、フェデレーションメンバー内にフェデレーションされていないテーブルを複製できます。たとえば、部署マスタ、郵便番号マスタのようなマスターテーブルが参照用テーブルとして定義されることが多いです。
フェデレーションでのデータ分割の再実行
フェデレーションでは、オンラインでデータの再分割をすることができます。SPLIT処理を実行すると、アトミックユニットを複数含んだフェデレーションメンバーを分割できます。MERGE処理を実行すると分割されているフェデレーションメンバを結合することができます。SPLIT・MERGE処理はいつでも実行することができ、実行中もデータベースを使用し続けられます。それまで使用していたデータベースの裏側で、SPLIT・MERGE処理を実行し、処理が完了した段階で入れ替えることでダウンタイム無しで運用できます。
フェデレーションへの接続
フェデレーションでは、分割されたデータがどこに格納されているのかを意識する必要が無いと説明しました。分割されたデータが、どのデータベースに格納されていても利用できるようにするのが「USE FEDERATION」句です。USE FEDERATION句を使用することで、フェデレーションデータへ接続することができます。USE FEDERETION句は、次のように使用します。
たとえば、顧客IDでフェデレーションされた注文フェデレーションに格納されているデータで、顧客IDが55のデータを参照するには、「USE FEDERATION [注文フェデレーション](55)」を発行します。特定のフェデレーション、特定のアトミックユニットに格納されているデータを参照するのに、データベース名を指定する代わりにフェデレーションキーの値を指定します。
まとめ
今回は、SQL Azure Federationのイメージをつかんでもらうために、概要を説明しました。SQL Azure Federationとは、クラウドサービスとしてデータを分散させることで大容量の格納、負荷分散による大量処理をさばけるようにする機能です。そして、どのような要素で構成されているのか、構成要素について紹介しました。
次回からは、SQL Azure Federaitonの具体的な操作方法を見ていきます。