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 に変更して開いて下さい。
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 を分割してみましょう。とりあえずはきれいに半分にすることにします。
分割の設定
設定項目は以下の通りです。
上から順に説明すると、
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 は以下のクエリで確認できます。
今回は 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]
こんな感じのログが出力されます。
暫く放置しておいたら、徐々に進捗していきますのでのんびり待ちます。
分割や統合の履歴は OperationId
というのもので管理されているようです。
これの詳細は、Split-Merge Tool 用 DB の RequestStatus
テーブルで管理されています。
(前回の「ツール用の SQL Database, Storage, Cloud Service を作成」で作った DB です)
分割が完了したら、状況を確認してみます。
.\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 Key
と Target Range High Key
、もしくは Source Range High Key
と Target 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 の移動中の動きを見る限り、サービスをオンラインのままで移動も可能そうです。夢が広がります。