Microsoft Azure の Elastic Database Pool を使ってみよう その2

初めての方は初めまして、新里と申します。
今回もよろしくお願い致します。
今回は前回に続き、Microsoft Azure の Elastic Database Pool についてお話ししたいと思います。


さて前回は、Elastic Database Pool を用意し、Pool 内に複数の DB を配置しました。
今回は Pool 内の DB 対して、SQL の発行やトランザクションを行ってみたいと思います。
環境には VisualStudio2015 Community を使用します。
Microsoft.Azure.SqlDatabase.ElasticScale.Client が必要になるので、NuGet からインストールし、参照できるようにしておきましょう。

まず、Elastic Database Pool 内に存在する複数の DB にアクセスするために、
Shard Map Manager を作成しましょう。

Shard Map Manager :

Shard Map を管理する DB の事で、Shard とは Pool 内での個々の DB の事を指します。
( Shard Map については下述参照)
各 Shard へのアクセスはその Shard Map Manager を介して行います。

・Shard Map Managerの作成
Shard Map Managerの作成

次に、Shard Map Manager に各 Shard の Mapping 情報を持たせるために、ShardMap を作成します。


Shard Map :

Shard Map は、Shard とそれに紐づくキーのマッピング情報の事で、
登録しておく事で、キーを指定して Shard へアクセス情報を取得する事ができます。
Shard Map Manager インスタンスを持った DB に対して、
Shard Map を作成し、各 Shard へアクセスの管理を行います。

・Shard Mapの作成
Shard Map には2種類の型が存在し、キーの持ち方が異なります。

・レンジマッピング
Shard に対して、し範囲のキーの値を割り当てます。一対多の割り当て方。
レンジシャードマップを生成

・リストマッピング
Shard に対して、1つのキーを割り当てます。一対一の割り当て方。
リストシャードマップを生成

シャードマップにマッピング情報を追加する事が出来るようになりました。
以下の手順で、Shard とそれに紐づくキーのマッピング情報を追加する事ができます。

・レンジマッピングでシャードを追加
以下の例では、0~50という範囲の int 型のキーに対して、Shard を割り当てました。
これで、0~50という int 型のキーを使用すれば、指定した Shard へアクセスする事が可能になります。
シャードの追加とレンジマッピング

・リストマッピングでシャードを追加
以下の例では、0という int 型のキーに対して、Shard を割り当てました。
これで、0という int 型のキーを使用すれば、指定した Shard へアクセスする事が可能になります。
シャードの追加とリストマッピング

例では、キーにint型を利用していますが、他にも以下の型が利用可能です。
int
long
guid
byte[]
datetime
timespan
datetimeoffset

指定したShardへSQLを発行
これで、Shard へアクセスする準備が整いました。
Shard Map へキーを渡す事で、各 Shard へアクセスが可能となります。
以下の例では Shard Map から OpenConectionForKey() を使用しコネクションを取得し、SQL 文を発行しています。
OpenConnectionForKey()
このように、キーを指定する事で指定した Shard に対して SQL を発行する事ができます。
また、この OpenConnectionForKey() を利用する事でトランザクション処理を書く事もできます。


分散トランザクション
分散トランザクション
単体の DB へのトランザクションや、
複数の DB を跨いでトランザクションをまとめて行いたい場合は、TransactionScope() が有効となります。
Complete() が呼び出されるまでに、システム障害や例外のスローによる中断が発生したなら、Scope 内の更新はロールバックされます。



Elastic Database Pool につきましては、いかがでしたでしょうか。
動的なスケーリングと、シャーディングにおける負荷分散は有力な選択肢の一つになり得るかと思います。

もちろん、有効な効果が得られるかは Shard Map と各 Shard の持つデータ、
それらを踏まえた実装に左右されるところではありますが、
検証の余地があるならば試してみては如何でしょうか。
そういった内容も今後、ご紹介できればなと思います。

それでは今回は、この辺りで失礼いたします。
ありがとうございました。

採用情報

クラウドクリエイティブスタジオでは絶賛エンジニア募集中です。
ご興味のある方は是非!

採用情報

コメント