Azure Elastic Scale の Split-Merge ツールを試してみる - ツール実行編 -

Azure Elastic Scale の Split-Merge ツールを試してみる - 環境構築編 - にて環境を構築したので、今回は実際にツールを動かします。

Split-Merge ツール Web アプリ

前回ちょろっと書きましたが、Split-Merge ツールの本体は Azure Cloud Service の Web ロールと Worker ロールです。

Web ロールが管理 UI になっているので、URL を叩きます。
URL はダッシュボードから取得できますが、https に変更して開いて下さい。

f:id:kendik:20141028222742j:plain

ASP.NET MVC でちゃっちゃと作ったような多少アレな画面が表示されます。

使い方

以下簡単に使い方を説明します。
見れば分かるくらいに簡単ですが、多少でも参考になれば。

前回セットアップスクリプトを実行したので、既に管理用の SplitMergeShardManagement DB と ShardDb1, ShardDb2 が作成されていると思います。セットアップ直後は全てのデータは ShardDb1 に格納されており、特に分散はされていません。ShardDb2 が持っているのはスキーマだけです。

現在どのレンジがどの Shard にあるかは、NuGet から落としてきた Split-Merge ツール内の GetMappings.ps1 というスクリプトで確認することが出来ます。

Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge.0.7.1\content\splitmerge\powershell

配下です。

実行するとこんな感じになります。

.\GetMappings.ps1 `
    -UserName 'SQL Database への接続ユーザー名' `
    -Password 'SQL Database への接続パスワード' `
    -ShardMapManagerServerName 'SQL Database Server の管理用 URL から "https://" を除いたもの'

Status        : Online
ShardLocation : [DataSource=<your server name> Database=ShardDb1]
Value         : [0:200)

Sharding Key が 0~199 までのデータが ShardDb1 にあることが分かります。

Shard の分割

まずは ShardDb1 を分割してみましょう。とりあえずはきれいに半分にすることにします。

分割の設定

設定項目は以下の通りです。

f:id:kendik:20141028222754j:plain

上から順に説明すると、

Operation Type

ツールで実行する処理です。今回は分割なので Split を選択します。

Shard Map Manager Server Name

SQL Database Server 名を入れます。そのまんまですね。

Shard Map Manager Database Name

管理用 DB の名前を入れます。今回は SplitMergeShardManagement です。

Username(for Shard Map Manager and Shards) と Password (for Shard Map Manager and Shards)

これも名前の通り。接続に使うユーザー名とパスワードを入れましょう。

Shard Map Name

Sharding Key と分散した Shard との紐付きのことを Shard Map と言います。
Shard Map Name は以下のクエリで確認できます。

f:id:kendik:20141028222804j:plain

今回は MyTestShardMap ですね。

Shard Key Type

Sharding Key の型を指定します。
サンプルデータでは Int32 です。

Split Range Low Key

分割対象となる Sharding Key 群の最小値を指定します。
今回は 0~199 を半分に分けるので、0 をセットします。

Split at Key

Sharding Key 群のどこで分割するかを指定します。
0~199 を半分に分けるので、100 をセットすることになります。

Split Range High Key

Sharding Key の最大値ですね。今回は 200 です。199 じゃないのがポイントです。
200 だなんて分かりにくい!ということであれば、「High is max key」というチェックを入れると幸せになれます。

Split Behavior

Split at Key で二つに分かれた Sharding Key 群のうち、どちらを別の Shard に移動するか指定します。 お好みでどうぞ。今回は 100~199 を移動することにしますので、「Move the range from split key (incl.) to high key (excl.)」 をチェックします。

Target Server Name

移動先の Shard の Server Name を指定します。今回は移動元と同じです。

Target Database Name

上に同じく。

Batch Size

おそらく 1 回のバッチ処理で移動する Shardlet の数でしょう。適当に 10 を入れておきましょう。

分割の実行

設定が終わったら、Submit ボタンで実行です。
実行すると、画面右のテキストボックスに

Status: Queued
Details: [Informational] Queued request
Split-Merge request created with OperationId: [5b329661-d995-4d2a-9485-a41a4e91d70a]

こんな感じのログが出力されます。
暫く放置しておいたら、徐々に進捗していきますのでのんびり待ちます。

f:id:kendik:20141028222814j:plain

分割や統合の履歴は OperationId というのもので管理されているようです。
これの詳細は、Split-Merge Tool 用 DB の RequestStatus テーブルで管理されています。
(前回の「ツール用の SQL Database, Storage, Cloud Service を作成」で作った DB です)

f:id:kendik:20141028222833j:plain

分割が完了したら、状況を確認してみます。

.\GetMappings.ps1 `
    -UserName 'SQL Database への接続ユーザー名' `
    -Password 'SQL Database への接続パスワード' `
    -ShardMapManagerServerName 'SQL Database Server の管理用 URL から "https://" を除いたもの'

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb1]
Value         : [0:100)

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [100:200)

データが分割されていることが確認出来ました!
すごいですね!これは簡単!、、、なのか。。。?

Shard の統合

次は、Shard の統合を試してます。先ほど分割した Sharding Key を、また一つの Shard に集約させることにします。

とはいえ、分割前と全く同じ状態にしても面白くないので、今回統合先は Shard2 (100~199 が格納されている DB) にしましょう。

統合の設定

Split-Merge ツールの Web UI の Operation Type を Merge にすると統合が行えます。
各設定項目は以下の通りです。

Operation Type

ツールで実行する処理です。今回は統合なので Merge を選択します。

Shard Map Manager Server Name

Shard Map Manager Database Name

Username(for Shard Map Manager and Shards) と Password (for Shard Map Manager and Shards)

Shard Map Name

Shard Key Type

ここまでは分割の設定と同じです。

Source Range Low Key

統合したい Sharding Key 群の最小値を指定します。
先ほどは 0~199 を 0~99 と 100~199 に分けました。今回移動したいのは前者なので、最小値 0 を指定します。

Source Range High Key

統合したい Sharding Key 群の最大値を指定します。
0~99 を移動したいので 100 になります。99 を指定しないと気持ち悪いという方は、「High is max key」チェックを入れましょう。

Target Range Low Key

統合先の Sharding Key の最小値を指定します。今回は 100 です。

Target Range High Key

統合先の Sharding Key の最大値を指定します。今回は 200 です。199 を指定したい場合は「High is max key」チェックで。

Batch Size

分割の設定と同じです。

ちなみに、Source Range Low KeyTarget Range High Key、もしくは Source Range High KeyTarget Range Low Key は連番になってないと実行時例外が飛んできます。ログにスタックトレースが表示される様は壮観です。どうしろと。

あと、上記設定で、何で統合先の最大値を指定しないといけないの?と思ったでしょうが、今回はたまたま Sharding Key が小さい方から大きい方への統合だからそう思うだけで、逆の場合は必要ですね。ここらへんは自動でうまいことやって欲しいものですが、まぁツールの使い勝手の問題ですね。

統合の実行

設定が終わったら、実行します。ログ出力も分割と同じようにされるので、実行したら暫く待ちましょう。

ちなみに実行中に GetMappings.ps1 を叩くと、どう移動しているか分かって面白いです。

.\GetMappings.ps1 `
    -UserName 'SQL Database への接続ユーザー名' `
    -Password 'SQL Database への接続パスワード' `
    -ShardMapManagerServerName 'SQL Database Server の管理用 URL から "https://" を除いたもの'

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [0:10)

Status        : Offline
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb1]
Value         : [10:20)

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb1]
Value         : [20:100)

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [100:200)

Batck Size に指定した値だけ、ちょっとずつ新しいマッピングを作っているんですね。

ここで言う「マッピング」というのは、管理 DB の ShardMappingsGlobal テーブルのレコードです。
ある Sharding Key のレンジがどの Shard にどういう範囲で格納されているかが収められています。根拠はありませんが、Elastic Scale をガシガシ使っていくと直接値をいじる日が来そうな気がしますので、覚えておくと良いかもしれません。

で、統合が完了しました。

.\GetMappings.ps1 `
    -UserName 'SQL Database への接続ユーザー名' `
    -Password 'SQL Database への接続パスワード' `
    -ShardMapManagerServerName 'SQL Database Server の管理用 URL から "https://" を除いたもの'

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [0:200)

全ての Shard Key が ShardDb2 に移動しました。お疲れ様です。

Shardlet の移動

最後に、Shardlet の移動をやってみます。

そもそも Shardlet とは何かというと、分散/統合可能な最小単位のデータのことを指します。
単一の Shard Key が指し示すデータと考えるといいかもしれませんね。本当にシンプルなテーブルの PK を Shard Key に指定した場合は一つのレコードが Shardlet になりますし、FK なんかを使っている場合は、参照先も含めた一連のデータが Shardlet になる(はず)です。

Shardlet の移動は、特定の Shard に負荷が偏ってしまった場合などに行うと良いようです。

移動の設定

Operation Type

Shardlet Move を選択しましょう。

Shard Map Manager Server Name

Shard Map Manager Database Name

Username(for Shard Map Manager and Shards) と Password (for Shard Map Manager and Shards)

Shard Map Name

Shard Key Type

分割の設定と同じです。

Shardlet Key to Move

移動したい Shardlet の Shard Key を指定します。複数指定不可です。0 や 199 でもいいんですが、100 とか指定してみましょうか。どうなるでしょう。

Target Server Name

移動先の SQL Database Server 名を入れます。今回は移動元と同じで。

Target Database Name

移動先の SQL Database 名です。ShardDb1 を指定します

Batch Size

え、いるの!?ちょっと何のためにあるのかよく分かりませんでした。

移動の実行

実行して結果を見てみましょう。
移動対象の Shard Key が 0 や 199 ならどうなるかは想像が付くと思いますが、今回は 100 です。正解はこちら。

.\GetMappings.ps1 `
    -UserName 'SQL Database への接続ユーザー名' `
    -Password 'SQL Database への接続パスワード' `
    -ShardMapManagerServerName 'SQL Database Server の管理用 URL から "https://" を除いたもの'

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [0:100)

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb1]
Value         : [100:101)

Status        : Online
ShardLocation : [DataSource=g9ffnjbzyo.database.windows.net Database=ShardDb2]
Value         : [101:200)

ShardDb2 のマッピングが二つに分割されてしまいました。なるほどー。マッピングはあくまで連番である必要があるようです。まぁ Range ですからね、そりゃそうですね。

まとめ

という訳で二回に分けて Split-Merge Tool の使い方を見てきました。

結局このツール使ってどうよ?と言われれば、まぁ Web API も持っているので PowerShell スクリプトなどで叩けば十分使えそうです。Web UI の方は、、、ちょっと面倒なので開発中のテスト用途とかですかね。それもスクリプトでやりそうな気がしますが。。。

とはいえ、水平分散で最も面倒なうちの一つである分割/統合をある程度自動でやってくれるのは本当にありがたい話です。追々試していきたいですが、Shardlet の移動中の動きを見る限り、サービスをオンラインのままで移動も可能そうです。夢が広がります。