Hinzufügen eines Shards mithilfe der Tools für elastische DatenbankenAdding a shard using Elastic Database tools

So fügen Sie einen Shard für einen neuen Bereich oder Schlüssel hinzuTo add a shard for a new range or key

Anwendungen müssen häufig neue Shards hinzufügen, um Daten zu verwalten, die von neuen Schlüsseln oder Schlüsselbereichen für eine Shardzuordnung erwartet werden, die bereits vorhanden ist.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. Eine Anwendung beispielsweise, bei der Sharding über die Mandanten-ID durchgeführt wird, muss unter Umständen einen neuen Shard für einen neuen Mandanten bereitstellen, oder Daten, bei denen das Sharding monatlich durchgeführt wird, benötigen möglicherweise einen neuen Shard, der vor dem Start eines jeweils neuen Monats bereitgestellt wird.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.

Wenn der neue Schlüsselwertbereich nicht bereits Teil einer vorhandenen Zuordnung (Mapping) ist, ist es einfach, den neuen Shard hinzuzufügen und den neuen Schlüssel oder Bereich mit dem Shard zu verknüpfen.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.

Beispiel: Hinzufügen eines Shards und seines Bereichs zu einer vorhandenen ShardzuordnungExample: adding a shard and its range to an existing shard map

In diesem Beispiel werden die Methoden TryGetShard (Java, .NET), CreateShard (Java, .NET) und CreateRangeMapping (Java, .NET) verwendet, und es wird eine Instanz der ShardLocation-Klasse (Java, .NET) erstellt.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. Im Beispiel unten wurden eine Datenbank namens sample_shard_2 mit allen erforderlichen darin enthaltenen Schemaobjekten so erstellt, dass sie den Bereich [300, 400) abdecken.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));

Für die .NET-Version können Sie auch PowerShell verwenden, um einen neuen Shardzuordnungs-Manager zu erstellen.For the .NET version, you can also use PowerShell as an alternative to create a new Shard Map Manager. Ein Beispiel ist hierverfügbar.An example is available here.

So fügen Sie einen Shard für einen leeren Teil eines vorhandenen Bereichs hinzuTo add a shard for an empty part of an existing range

In einigen Fällen haben Sie einem Shard vielleicht bereits einen Bereich zugeordnet und diesen teilweise mit Daten gefüllt. Jetzt möchten Sie aber weitere Daten an einen anderen Shard umleiten.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. Angenommen, Sie führen das Sharding nach einem Bereich von Tagen durch und haben einem Shard bereits 50 Tage zugeordnet. Am 24. Tag sollen zukünftige Daten jedoch an einen anderen Shard weitergeleitet werden.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. Das Split-Merge-Tool für elastische Datenbanken kann diesen Vorgang durchführen. Wenn jedoch keine Datenverschiebung erforderlich ist (weil noch keine Daten für den Bereich der Tage [25, 50), d.h. einschließlich Tag 25 bis ausschließlich Tag 50, vorliegen), können Sie den ganzen Vorgang direkt mithilfe der Verwaltungs-APIs für die Shardzuordnung durchführen.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.

Beispiel: Aufteilen eines Bereichs und Zuweisen des leeren Teils zu einem neu hinzugefügten ShardExample: splitting a range and assigning the empty portion to a newly added shard

Eine Datenbank namens „sample_shard_2“ sowie alle erforderlichen, darin enthaltenen Schemaobjekte wurden erstellt.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));

Wichtig: Verwenden Sie dieses Verfahren nur, wenn Sie sicher sind, dass der Bereich für die aktualisierte Zuordnung leer ist.Important: Use this technique only if you are certain that the range for the updated mapping is empty. Durch die oben genannten Methoden werden keine Daten für den verschobenen Bereich überprüft. Deshalb empfiehlt es sich, Prüfroutinen im Code zu implementieren.The preceding methods do not check data for the range being moved, so it is best to include checks in your code. Wenn der verschobene Bereich Zeilen enthält, stimmt die tatsächliche Datenverteilung nicht mit der aktualisierten Shard Map überein.If rows exist in the range being moved, the actual data distribution will not match the updated shard map. Verwenden Sie das Split-Merge-Tool, um den Vorgang durchzuführen.Use the split-merge tool to perform the operation instead in these cases.

Zusätzliche RessourcenAdditional resources

Verwenden Sie noch keine elastischen Datenbanktools?Not using elastic database tools yet? Sehen Sie sich unseren Leitfaden zu den ersten Schritten an.Check out our Getting Started Guide. Bei Fragen erreichen Sie uns im Forum für SQL-Datenbank, Featureanforderungen können Sie im Feedbackforum für SQL-Datenbank einreichen.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.