Elastic Database ツールを使用してシャードを追加するAdding a shard using Elastic Database tools

新しい範囲またはキー用のシャードを追加するにはTo add a shard for a new range or key

多くの場合、アプリケーションは、既に存在しているシャード マップに対し、新しいキーまたはキー範囲から予想されるデータを処理するために新しいシャードを追加する必要があります。Applications often need to add new shards to handle data that is expected from new keys or key ranges, for a shard map that already exists. たとえば、テナント ID によってシャード化されるアプリケーションの場合、新しいテナントに対して新しいシャードをプロビジョニングすることが必要になる場合があります。また、毎月シャード化されるデータの場合、新しい月が始まる前に新しいシャードをプロビジョニングすることが必要になる場合があります。For example, an application sharded by Tenant ID may need to provision a new shard for a new tenant, or data sharded monthly may need a new shard provisioned before the start of each new month.

キー値の新しい範囲が既存のマッピングにまだ含まれていない場合、新しいシャードを追加し、そのシャードに新しいキーまたは範囲を関連付けるのは簡単です。If the new range of key values is not already part of an existing mapping, it is simple to add the new shard and associate the new key or range to that shard.

例: シャードとその範囲を既存のシャード マップに追加するExample: adding a shard and its range to an existing shard map

このサンプルでは、TryGetShard (Java.NET)、CreateShard (Java.NET)、CreateRangeMapping (Java.NET) の各メソッドを使用し、ShardLocation (Java.NET) クラスのインスタンスを作成します。This sample uses the TryGetShard (Java, .NET) the CreateShard (Java, .NET), CreateRangeMapping (Java, .NET methods, and creates an instance of the ShardLocation (Java, .NET) class. 次の例では、範囲 [300, 400) を保持する、sample_shard_2 という名前のデータベースと、その中の必要なすべてのスキーマ オブジェクトが作成されています。In the sample below, a database named sample_shard_2 and all necessary schema objects inside of it have been created to hold range [300, 400).

// sm is a RangeShardMap object.
// Add a new shard to hold the range being added.
Shard shard2 = null;

if (!sm.TryGetShard(new ShardLocation(shardServer, "sample_shard_2"),out shard2))
{
    shard2 = sm.CreateShard(new ShardLocation(shardServer, "sample_shard_2"));  
}

// Create the mapping and associate it with the new shard
sm.CreateRangeMapping(new RangeMappingCreationInfo<long>
                            (new Range<long>(300, 400), shard2, MappingStatus.Online));

.NET バージョンの場合、代わりに PowerShell を使用して新しいシャード マップ マネージャーを作成することもできます。For the .NET version, you can also use PowerShell as an alternative to create a new Shard Map Manager. こちらの例を利用できます。An example is available here.

既存の範囲の空き部分用のシャードを追加するにはTo add a shard for an empty part of an existing range

状況によっては、シャードに対する範囲のマッピングを既に実行し、部分的にデータが入力されている場合がありますが、以降のデータを別のシャードに宛てることができます。In some circumstances, you may have already mapped a range to a shard and partially filled it with data, but you now want upcoming data to be directed to a different shard. たとえば、日単位で範囲のシャーディングを実行し、既に 50 日がシャードに割り当てられているが、24 日目に今後のデータを別のシャードに保存できます。For example, you shard by day range and have already allocated 50 days to a shard, but on day 24, you want future data to land in a different shard. Elastic Database の分割/マージ ツールでこの操作を実行できますが、データ移動が不要な場合 (たとえば [25、50) 日の範囲のデータはまだ存在していません。これは 25 日の分を含み 50 日の分を除くデータです) は、シャード マップ管理 API を直接使用することで操作全体を実行できます。The elastic database split-merge tool can perform this operation, but if data movement is not necessary (for example, data for the range of days [25, 50), that is, day 25 inclusive to 50 exclusive, does not yet exist) you can perform this entirely using the Shard Map Management APIs directly.

例: 範囲の分割と新しく追加したシャードへの空き部分の割り当てExample: splitting a range and assigning the empty portion to a newly added shard

"sample_shard_2" という名前のデータベースと、その中のすべての必要なスキーマ オブジェクトが作成されています。A database named “sample_shard_2” and all necessary schema objects inside of it have been created.

// sm is a RangeShardMap object.
// Add a new shard to hold the range we will move
Shard shard2 = null;

if (!sm.TryGetShard(new ShardLocation(shardServer, "sample_shard_2"),out shard2))
{
    shard2 = sm.CreateShard(new ShardLocation(shardServer,"sample_shard_2"));  
}

// Split the Range holding Key 25
sm.SplitMapping(sm.GetMappingForKey(25), 25);

// Map new range holding [25-50) to different shard:
// first take existing mapping offline
sm.MarkMappingOffline(sm.GetMappingForKey(25));

// now map while offline to a different shard and take online
RangeMappingUpdate upd = new RangeMappingUpdate();
upd.Shard = shard2;
sm.MarkMappingOnline(sm.UpdateMapping(sm.GetMappingForKey(25), upd));

重要:この手法は、更新されるマッピング用の範囲が空であることが確実である場合のみ使用します。Important: Use this technique only if you are certain that the range for the updated mapping is empty. 上記の方法では、移動される範囲のデータはチェックされないので、コードにチェックを含めることをお勧めします。The preceding methods do not check data for the range being moved, so it is best to include checks in your code. 移動される範囲内に行が存在する場合、実際のデータ分布は更新されたシャード マップと一致しなくなります。If rows exist in the range being moved, the actual data distribution will not match the updated shard map. このような場合は、 分割/マージ ツール を代わりに使用して操作を行ってください。Use the split-merge tool to perform the operation instead in these cases.

その他のリソースAdditional resources

まだ弾力性データベース ツールを使用していない場合は、Not using elastic database tools yet? ファースト ステップ ガイドを参照してください。Check out our Getting Started Guide. 質問がある場合は、SQL Database のフォーラムに投稿してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムにお寄せください。For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.