Aggiunta di una partizione utilizzando gli strumenti di database elasticiAdding a shard using Elastic Database tools

Per aggiungere una partizione per un nuovo intervallo o una nuova chiaveTo add a shard for a new range or key

Per una mappa partizioni già esistente, le applicazioni devono spesso aggiungere nuove partizioni per gestire i dati previsti dalle nuove chiavi o dai nuovi intervalli di chiavi.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. Ad esempio, è possibile che un'applicazione partizionata dall'ID tenant debba eseguire il provisioning di una nuova partizione per un nuovo tenant, oppure è possibile che i dati partizionati ogni mese richiedano il provisioning di una nuova partizione prima dell'inizio di ogni nuovo mese.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.

Se il nuovo intervallo di valori di chiave non è già incluso in una mappa esistente, l'aggiunta della nuova partizione e l'associazione della nuova chiave o del nuovo intervallo alla partizione risulteranno semplici.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.

Esempio: aggiungere una partizione e il relativo intervallo a una mappa partizioni esistenteExample: adding a shard and its range to an existing shard map

Questo esempio usa i metodi (Java, .NET) CreateShard (Java, .NET), CreateRangeMapping (Java, .NET) e crea un'istanza della classe 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. Nell'esempio seguente un database denominato sample_shard_2 e tutti gli oggetti di schema necessari in esso contenuti sono stati creati per contenere l'intervallo [300, 400).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)); 

Per la versione .NET, è anche possibile usare PowerShell come alternativa per creare un nuovo gestore delle mappe partizioni.For the .NET version, you can also use PowerShell as an alternative to create a new Shard Map Manager. Un esempio è disponibile qui.An example is available here.

Per aggiungere una partizione per una parte vuota di un intervallo esistenteTo add a shard for an empty part of an existing range

In alcuni casi è possibile che pur avendo già eseguito il mapping di un intervallo con una partizione e avere inserito parzialmente i dati, si desideri che i dati futuri vengano indirizzati a una partizione diversa.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. Si consideri ad esempio uno scenario in cui è stato eseguito il partizionamento per intervallo di giorni e sono stati già allocati 50 giorni a una partizione, ma a partire dal giorno 24 si desidera che i dati futuri vengano indirizzati a una partizione diversa.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. Lo strumento di suddivisione-unione dei database elastici può eseguire questa operazione, ma se non è necessario lo spostamento di dati (ad esempio, i dati per l'intervallo di giorni [25, 50], ossia dal giorno 25 incluso al giorno 50 escluso, non esistono ancora) è possibile eseguire l'intera operazione usando direttamente le API di gestione delle mappe partizioni.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.

Esempio: suddividere un intervallo e assegnare la parte vuota a una partizione appena aggiuntaExample: splitting a range and assigning the empty portion to a newly added shard

È stato creato un database denominato "sample_shard_2" contenente tutti gli oggetti di schema necessari.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)); 

Importante: usare questa tecnica solo se si è certi che l'intervallo per il mapping aggiornato sia vuoto.Important: Use this technique only if you are certain that the range for the updated mapping is empty. Poiché i metodi precedenti non controllano i dati dell'intervallo da spostare, è consigliabile includere i controlli nel codice.The preceding methods do not check data for the range being moved, so it is best to include checks in your code. Se esistono righe nell'intervallo da spostare, la distribuzione dei dati effettivi non corrisponderà alla mappa partizioni aggiornata.If rows exist in the range being moved, the actual data distribution will not match the updated shard map. In questi casi utilizzare invece lo strumento di suddivisione-unione per eseguire l'operazione.Use the split-merge tool to perform the operation instead in these cases.

Risorse aggiuntiveAdditional resources

Se non si usano gli strumenti di database elastici,Not using elastic database tools yet? vedere la Guida introduttiva.Check out our Getting Started Guide. Se ci sono domande, è possibile visitare il forum sul database SQL mentre è possibile inserire le richieste di nuove funzionalità nel forum relativo a commenti e suggerimenti sul database SQL.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.