Lägga till en shard med hjälp av Elastic Database-verktyg

Gäller för:Azure SQL Database

Så här lägger du till en shard för ett nytt intervall eller en ny nyckel

Program behöver ofta lägga till nya shards för att hantera data som förväntas från nya nycklar eller nyckelintervall, för en fragmentkarta som redan finns. Till exempel kan ett program som är fragmenterat av klientorganisations-ID behöva skapa en ny shard för en ny klientorganisation, eller så kan data som partitioneras varje månad behöva en ny shard etablerad före början av varje ny månad.

Om det nya intervallet med nyckelvärden inte redan är en del av en befintlig mappning kan du lägga till den nya fragmentet och associera den nya nyckeln eller intervallet till fragmentet.

Exempel: lägga till en shard och dess intervall till en befintlig fragmentkarta

Det här exemplet använder TryGetShard (Java, .NET) klassen CreateShard (Java, .NET), CreateRangeMapping (Java, .NET-metoder och skapar en instans av klassen ShardLocation (Java, .NET). I exemplet nedan har en databas med namnet sample_shard_2 och alla nödvändiga schemaobjekt inuti den skapats för att innehålla intervallet [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 .NET-versionen kan du också använda PowerShell som ett alternativ för att skapa en ny Shard Map Manager. Ett exempel finns här.

Så här lägger du till en shard för en tom del av ett befintligt intervall

I vissa fall kanske du redan har mappat ett intervall till ett fragment och delvis fyllt det med data, men nu vill du att kommande data ska dirigeras till en annan shard. Du kan till exempel sharda efter dagintervall och redan har allokerat 50 dagar till en shard, men dag 24 vill du att framtida data ska landa i en annan shard. Verktyget för delad sammanfogning av elastisk databas kan utföra den här åtgärden, men om dataflytt inte är nödvändig (till exempel data för antalet dagar [25, 50), det vill säga dag 25 inklusive till 50 exklusiva, ännu inte finns) kan du utföra detta helt med hjälp av API:erna för Shard Map Management direkt.

Exempel: Dela upp ett intervall och tilldela den tomma delen till en nyligen tillagd shard

En databas med namnet "sample_shard_2" och alla nödvändiga schemaobjekt i den har skapats.

// 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));

Viktigt!

Använd endast den här tekniken om du är säker på att intervallet för den uppdaterade mappningen är tomt. Föregående metoder kontrollerar inte data för det intervall som flyttas, så det är bäst att inkludera kontroller i koden. Om det finns rader i intervallet som flyttas matchar inte den faktiska datafördelningen den uppdaterade fragmentkartan. Använd verktyget split-merge för att utföra åtgärden i stället i dessa fall.

Ytterligare resurser

Använder du inte elastiska databasverktyg än? Kolla in vår komma igång-guide. Om du har frågor kan du kontakta oss på microsofts Q&A-frågesida för SQL Database och för funktionsförfrågningar, lägga till nya idéer eller rösta på befintliga idéer i SQL Database-feedbackforumet.