Databases uitschalen met shard-toewijzingsbeheer

Van toepassing op: Azure SQL Database

Gebruik een shard-toewijzingsbeheer om eenvoudig databases uit te schalen in Azure SQL Database. Shard-toewijzingsbeheer is een speciale database die globale toewijzingsgegevens over alle shards (databases) in een shardset onderhoudt. Met de metagegevens kan een toepassing verbinding maken met de juiste database op basis van de waarde van de sharding-sleutel. Bovendien bevat elke shard in de set kaarten waarmee de lokale shardgegevens (ook wel shardlets genoemd) worden bijgehouden.

Shard map management

Inzicht in hoe deze kaarten worden samengesteld, is essentieel voor shard-toewijzingsbeheer. Dit wordt gedaan met behulp van de ShardMapManager-klasse (Java, .NET), gevonden in de Elastic Database-clientbibliotheek voor het beheren van shard-toewijzingen.

Shard-toewijzingen en shardtoewijzingen

Voor elke shard moet u het type shardtoewijzing selecteren dat u wilt maken. De keuze is afhankelijk van de databasearchitectuur:

  1. Eén tenant per database
  2. Meerdere tenants per database (twee typen):
    1. Lijsttoewijzing
    2. Bereiktoewijzing

Voor een model met één tenant maakt u een shard-toewijzing met een lijsttoewijzing . Met het model met één tenant wordt één database per tenant toegewezen. Dit is een effectief model voor SaaS-ontwikkelaars omdat het shard-kaartbeheer vereenvoudigt.

List mapping

Het model met meerdere tenants wijst verschillende tenants toe aan een afzonderlijke database (en u kunt groepen tenants verdelen over meerdere databases). Gebruik dit model wanneer u verwacht dat elke tenant kleine gegevensbehoeften heeft. Wijs in dit model een reeks tenants toe aan een database met behulp van bereiktoewijzing.

Range mapping

U kunt ook een databasemodel met meerdere tenants implementeren met behulp van een lijsttoewijzing om meerdere tenants toe te wijzen aan een afzonderlijke database. DB1 wordt bijvoorbeeld gebruikt voor het opslaan van informatie over tenant-id 1 en 5, en DB2 slaat gegevens op voor tenant 7 en tenant 10.

Multiple tenants on single DB

Ondersteunde typen voor shardingsleutels

Elastisch schalen ondersteunt de volgende typen als shardingsleutels:

.NET Java
geheel getal geheel getal
long long
guid uuid
byte[] byte[]
datetime timestamp
tijdsbestek duur
datetimeoffset offsetdatetime

Shard-kaarten voor lijsten en bereiken

Shard-toewijzingen kunnen worden samengesteld met behulp van lijsten met afzonderlijke sharding-sleutelwaarden of ze kunnen worden samengesteld met behulp van bereiken van sharding-sleutelwaarden.

Shard-toewijzingen weergeven

Shards bevatten shardlets en de toewijzing van shardlets aan shards wordt onderhouden door een shard-toewijzing. Een lijst-shard-toewijzing is een koppeling tussen de afzonderlijke sleutelwaarden waarmee de shardlets en de databases worden geïdentificeerd die als shards fungeren. Lijsttoewijzingen zijn expliciet en verschillende sleutelwaarden kunnen worden toegewezen aan dezelfde database. Sleutelwaarde 1 wordt bijvoorbeeld toegewezen aan Database A en sleutelwaarden 3 en 6 worden beide toegewezen aan Database B.

Key Shardlocatie
1 Database_A
3 Database_B
4 Database_C
6 Database_B
... ...

Bereik-shard-kaarten

In een bereikshardtoewijzing wordt het sleutelbereik beschreven door een paar [Lage waarde, Hoge waarde) waarbij de lage waarde de minimale sleutel in het bereik is en de hoge waarde de eerste waarde is die hoger is dan het bereik.

[0, 100) bevat bijvoorbeeld alle gehele getallen groter dan of gelijk aan 0 en kleiner dan 100. Houd er rekening mee dat meerdere bereiken naar dezelfde database kunnen verwijzen en niet-aaneengesloten bereiken worden ondersteund (bijvoorbeeld [100.200) en [400.600) beide verwijzen naar Database C in het volgende voorbeeld.)

Key Shardlocatie
[1,50) Database_A
[50,100) Database_B
[100,200) Database_C
[400,600) Database_C
... ...

Elk van de bovenstaande tabellen is een conceptueel voorbeeld van een ShardMap-object . Elke rij is een vereenvoudigd voorbeeld van een afzonderlijke puntmapping (voor de lijst-shard-kaart) of RangeMapping (voor het bereikshardtoewijzingsobject).

Shard-toewijzingsbeheer

In de clientbibliotheek is shard-toewijzingsbeheer een verzameling shard-toewijzingen. De gegevens die worden beheerd door een ShardMapManager-exemplaar , worden op drie plaatsen bewaard:

  1. Global Shard Map (GSM):u geeft een database op die moet fungeren als opslagplaats voor alle shard-toewijzingen en -toewijzingen. Speciale tabellen en opgeslagen procedures worden automatisch gemaakt om de informatie te beheren. Dit is doorgaans een kleine database en licht toegankelijk en mag niet worden gebruikt voor andere behoeften van de toepassing. De tabellen bevinden zich in een speciaal schema met de naam __ShardManagement.
  2. Lokale Shard-toewijzing (LSM): elke database die u opgeeft als een shard, wordt gewijzigd in verschillende kleine tabellen en speciale opgeslagen procedures die shardtoewijzingsgegevens bevatten en beheren die specifiek zijn voor die shard. Deze informatie is overbodig met de informatie in de GSM en stelt de toepassing in staat om in de cache opgeslagen shard-kaartgegevens te valideren zonder enige belasting op de GSM te plaatsen; de toepassing gebruikt de LSM om te bepalen of een toewijzing in de cache nog geldig is. De tabellen die overeenkomen met de LSM op elke shard, bevinden zich ook in het schema __ShardManagement.
  3. Toepassingscache: elk toepassingsexemplaren die toegang hebben tot een ShardMapManager-object , onderhoudt een lokale cache in het geheugen van de toewijzingen. Er worden routeringsgegevens opgeslagen die onlangs zijn opgehaald.

Een ShardMapManager maken

Een ShardMapManager-object wordt samengesteld met behulp van een factory-patroon (Java, .NET). De methode ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) gebruikt referenties (inclusief de servernaam en databasenaam die de GSM bevat) in de vorm van een Verbinding maken ionString en retourneert een exemplaar van een ShardMapManager.

Let op: de ShardMapManager mag slechts eenmaal per app-domein worden geïnstantieerd binnen de initialisatiecode voor een toepassing. Het maken van extra exemplaren van ShardMapManager in hetzelfde app-domein resulteert in meer geheugen en CPU-gebruik van de toepassing. Een ShardMapManager kan een willekeurig aantal shard-kaarten bevatten. Hoewel één shard-toewijzing mogelijk voldoende is voor veel toepassingen, zijn er situaties waarin verschillende sets databases worden gebruikt voor een ander schema of voor unieke doeleinden; in die gevallen kunnen meerdere shard-kaarten de voorkeur hebben.

In deze code probeert een toepassing een bestaande ShardMapManager te openen met de TryGetSqlShardMapManager (Java, .NET-methode ). Als objecten die een Global ShardMapManager (GSM) vertegenwoordigen nog niet in de database bestaan, worden deze gemaakt met behulp van de methode CreateSqlShardMapManager (Java, .NET).

// Try to get a reference to the Shard Map Manager in the shardMapManager database.
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager = null;
boolean shardMapManagerExists = ShardMapManagerFactory.tryGetSqlShardMapManager(shardMapManagerConnectionString,ShardMapManagerLoadPolicy.Lazy, refShardMapManager);
shardMapManager = refShardMapManager.argValue;

if (shardMapManagerExists) {
    ConsoleUtils.writeInfo("Shard Map %s already exists", shardMapManager);
}
else {
    // The Shard Map Manager does not exist, so create it
    shardMapManager = ShardMapManagerFactory.createSqlShardMapManager(shardMapManagerConnectionString);
    ConsoleUtils.writeInfo("Created Shard Map %s", shardMapManager);
}
// Try to get a reference to the Shard Map Manager via the Shard Map Manager database.  
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager;
bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(
                                        connectionString,
                                        ShardMapManagerLoadPolicy.Lazy,
                                        out shardMapManager);

if (shardMapManagerExists)
{
    Console.WriteLine("Shard Map Manager already exists");
}
else
{
    // Create the Shard Map Manager.
    ShardMapManagerFactory.CreateSqlShardMapManager(connectionString);
    Console.WriteLine("Created SqlShardMapManager");

    shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(
            connectionString,
            ShardMapManagerLoadPolicy.Lazy);

// The connectionString contains server name, database name, and admin credentials for privileges on both the GSM and the shards themselves.
}

Voor de .NET-versie kunt u PowerShell gebruiken om een nieuw Shard-toewijzingsbeheer te maken. Hier is een voorbeeld beschikbaar.

Een RangeShardMap of ListShardMap ophalen

Nadat u een shard-toewijzingsbeheer hebt gemaakt, kunt u de RangeShardMap (Java, .NET) of ListShardMap (Java, .NET) ophalen met behulp van de TryGetRangeShardMap (Java, .NET), de TryGetListShardMap (Java, .NET) of de methode GetShardMap (Java, .NET).

// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
static <T> RangeShardMap<T> createOrGetRangeShardMap(ShardMapManager shardMapManager,
            String shardMapName,
            ShardKeyType keyType) {
    // Try to get a reference to the Shard Map.
    ReferenceObjectHelper<RangeShardMap<T>> refRangeShardMap = new ReferenceObjectHelper<>(null);
    boolean isGetSuccess = shardMapManager.tryGetRangeShardMap(shardMapName, keyType, refRangeShardMap);
    RangeShardMap<T> shardMap = refRangeShardMap.argValue;

    if (isGetSuccess && shardMap != null) {
        ConsoleUtils.writeInfo("Shard Map %1$s already exists", shardMap.getName());
    }
    else {
        // The Shard Map does not exist, so create it
        try {
            shardMap = shardMapManager.createRangeShardMap(shardMapName, keyType);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        ConsoleUtils.writeInfo("Created Shard Map %1$s", shardMap.getName());
    }

    return shardMap;
}
// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
public static RangeShardMap<T> CreateOrGetRangeShardMap<T>(ShardMapManager shardMapManager, string shardMapName)
{
    // Try to get a reference to the Shard Map.
    RangeShardMap<T> shardMap;
    bool shardMapExists = shardMapManager.TryGetRangeShardMap(shardMapName, out shardMap);

    if (shardMapExists)
    {
        ConsoleUtils.WriteInfo("Shard Map {0} already exists", shardMap.Name);
    }
    else
    {
        // The Shard Map does not exist, so create it
        shardMap = shardMapManager.CreateRangeShardMap<T>(shardMapName);
        ConsoleUtils.WriteInfo("Created Shard Map {0}", shardMap.Name);
    }

    return shardMap;
}

Shard-toewijzingsbeheerreferenties

Toepassingen die shard-kaarten beheren en bewerken, verschillen van toepassingen die gebruikmaken van de shard-toewijzingen om verbindingen te routeren.

Als u shard-toewijzingen wilt beheren (shards, shard-toewijzingen, shardtoewijzingen, enzovoort) moet u de ShardMapManager instantiëren met referenties met lees-/schrijfbevoegdheden voor zowel de GSM-database als op elke database die als een shard fungeert. De referenties moeten schrijfbewerkingen voor de tabellen in zowel de GSM als de LSM toestaan als shard-toewijzingsgegevens worden ingevoerd of gewijzigd, evenals voor het maken van LSM-tabellen op nieuwe shards.

Raadpleeg referenties die worden gebruikt voor toegang tot de elastic database-clientbibliotheek.

Alleen beïnvloede metagegevens

Methoden die worden gebruikt voor het vullen of wijzigen van de ShardMapManager-gegevens , wijzigen niet de gebruikersgegevens die zijn opgeslagen in de shards zelf. Methoden zoals CreateShard, DeleteShard, UpdateMapping, enzovoort zijn bijvoorbeeld alleen van invloed op de metagegevens van de shard-toewijzing. Ze verwijderen, toevoegen of wijzigen geen gebruikersgegevens in de shards. In plaats daarvan zijn deze methoden ontworpen om te worden gebruikt in combinatie met afzonderlijke bewerkingen die u uitvoert om werkelijke databases te maken of te verwijderen, of die rijen van de ene shard naar de andere verplaatsen om een shard-omgeving opnieuw te verdelen. (Het hulpprogramma voor splitsen samenvoegen dat deel uitmaakt van de hulpprogramma's voor elastische databases maakt gebruik van deze API's, samen met het organiseren van de werkelijke gegevensverplaatsing tussen shards.) Zie Schalen met het hulpmiddel splitsen en samenvoegen van elastische databases.

Gegevensafhankelijke routering

Het shard-toewijzingsbeheer wordt gebruikt in toepassingen waarvoor databaseverbindingen nodig zijn om de app-specifieke gegevensbewerkingen uit te voeren. Deze verbindingen moeten zijn gekoppeld aan de juiste database. Dit wordt gegevensafhankelijke routering genoemd. Voor deze toepassingen instantieert u een shard-toewijzingsbeheerobject vanuit de fabriek met referenties die alleen-lezentoegang hebben op de GSM-database. Afzonderlijke aanvragen voor latere verbindingen leveren referenties op die nodig zijn om verbinding te maken met de juiste sharddatabase.

Houd er rekening mee dat deze toepassingen (met behulp van ShardMapManager die zijn geopend met alleen-lezenreferenties) geen wijzigingen kunnen aanbrengen in de toewijzingen of toewijzingen. Voor deze behoeften maakt u beheerspecifieke toepassingen of PowerShell-scripts die referenties met een hogere bevoegdheid leveren, zoals eerder is besproken. Raadpleeg referenties die worden gebruikt voor toegang tot de elastic database-clientbibliotheek.

Zie Gegevensafhankelijke routering voor meer informatie.

Een shard-toewijzing wijzigen

Een shard-kaart kan op verschillende manieren worden gewijzigd. Alle volgende methoden wijzigen de metagegevens die de shards en de bijbehorende toewijzingen beschrijven, maar ze wijzigen geen gegevens in de shards, noch maken of verwijderen de werkelijke databases. Sommige van de bewerkingen op de hieronder beschreven shardtoewijzing moeten mogelijk worden gecoördineerd met beheeracties die gegevens fysiek verplaatsen of databases toevoegen en verwijderen die als shards fungeren.

Deze methoden werken samen als de bouwstenen die beschikbaar zijn voor het wijzigen van de algehele distributie van gegevens in uw shard-databaseomgeving.

  • Shards toevoegen of verwijderen: gebruik CreateShard (Java, .NET) en DeleteShard (Java, .NET) van de klasse shardmap (Java, .NET).

    De server en database die de doelshard vertegenwoordigen, moeten al bestaan om deze bewerkingen uit te voeren. Deze methoden hebben geen invloed op de databases zelf, alleen op metagegevens in de shard-toewijzing.

  • Punten of bereiken maken of verwijderen die zijn toegewezen aan de shards: gebruik CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) van de klasse RangeShardMapping (Java, .NET) en CreatePointMapping (Java, .NET) van de klasse ListShardMap (Java, .NET).

    Veel verschillende punten of bereiken kunnen worden toegewezen aan dezelfde shard. Deze methoden zijn alleen van invloed op metagegevens. Ze hebben geen invloed op gegevens die al aanwezig zijn in shards. Als gegevens uit de database moeten worden verwijderd om consistent te zijn met DeleteMapping-bewerkingen , voert u deze bewerkingen afzonderlijk uit, maar in combinatie met deze methoden.

  • Gebruik SplitMapping (Java, .NET) en MergeMappings (Java, .NET) en MergeMappings (Java, .NET).

    Houd er rekening mee dat splits- en samenvoegbewerkingen de shard waarnaar sleutelwaarden worden toegewezen, niet wijzigen. Een splitsing breekt een bestaand bereik in twee delen, maar laat beide ongewijzigd aan dezelfde shard. Een samenvoeging werkt op twee aangrenzende bereiken die al zijn toegewezen aan dezelfde shard, waarbij ze worden samengevoegd tot één bereik. De verplaatsing van punten of bereiken tussen shards moet worden gecoördineerd met Behulp van UpdateMapping in combinatie met de werkelijke gegevensverplaatsing . U kunt de splits-/samenvoegservice gebruiken die deel uitmaakt van hulpprogramma's voor elastische databases om wijzigingen in de shard-toewijzing te coördineren met gegevensverplaatsing wanneer verplaatsing nodig is.

  • Afzonderlijke punten of bereiken opnieuw toewijzen (of verplaatsen) naar verschillende shards: gebruik UpdateMapping (Java, .NET).

    Omdat gegevens mogelijk van de ene shard naar de andere moeten worden verplaatst om consistent te zijn met UpdateMapping-bewerkingen , moet u die verplaatsing afzonderlijk uitvoeren, maar in combinatie met het gebruik van deze methoden.

  • Als u toewijzingen online en offline wilt zetten: gebruik MarkMappingOffline (Java, .NET) en MarkMappingOnline (Java, .NET) om de onlinestatus van een toewijzing te beheren.

    Bepaalde bewerkingen op shardtoewijzingen zijn alleen toegestaan wanneer een toewijzing een offlinestatus heeft, waaronder UpdateMapping en DeleteMapping. Wanneer een toewijzing offline is, retourneert een gegevensafhankelijke aanvraag op basis van een sleutel in die toewijzing een fout. Wanneer een bereik voor het eerst offline wordt gehaald, worden alle verbindingen met de betreffende shard automatisch gedood om inconsistente of onvolledige resultaten te voorkomen voor query's die zijn gericht op het wijzigen van bereiken.

Toewijzingen zijn onveranderbare objecten in .NET. Alle bovenstaande methoden waarmee toewijzingen worden gewijzigd, maken ook ongeldige verwijzingen naar deze in uw code. Om het gemakkelijker te maken om reeksen bewerkingen uit te voeren die de status van een toewijzing wijzigen, retourneren alle methoden die een toewijzing wijzigen een nieuwe toewijzingsverwijzing, zodat bewerkingen kunnen worden gekoppeld. Als u bijvoorbeeld een bestaande toewijzing wilt verwijderen in shardmap sm die de sleutel 25 bevat, kunt u het volgende uitvoeren:

    sm.DeleteMapping(sm.MarkMappingOffline(sm.GetMappingForKey(25)));

Een shard toevoegen

Toepassingen moeten vaak nieuwe shards toevoegen om gegevens te verwerken die worden verwacht uit nieuwe sleutels of sleutelbereiken, voor een shard-toewijzing die al bestaat. Een toepassing die is geshard door tenant-id, moet bijvoorbeeld mogelijk een nieuwe shard inrichten voor een nieuwe tenant, of er is een nieuwe shard nodig die maandelijks is ingericht voordat elke nieuwe maand wordt gestart.

Als het nieuwe bereik met sleutelwaarden nog niet deel uitmaakt van een bestaande toewijzing en er geen gegevensverplaatsing nodig is, is het eenvoudig om de nieuwe shard toe te voegen en de nieuwe sleutel of het nieuwe bereik aan die shard te koppelen. Zie Een nieuwe shard toevoegen voor meer informatie over het toevoegen van nieuwe shards.

Voor scenario's waarvoor gegevensverplaatsing is vereist, is het hulpprogramma voor splitsen en samenvoegen echter nodig om de gegevensverplaatsing tussen shards in combinatie met de benodigde shardtoewijzingsupdates in te delen. Zie Overzicht van split-merge voor meer informatie over het gebruik van het hulpmiddel splitsen en samenvoegen

Aanvullende bronnen

Gebruikt u nog geen hulpprogramma's voor elastische databases? Bekijk de handleiding Aan de slag. Neem voor vragen contact met ons op op de microsoft Q&A-vragenpagina voor SQL Database en voor functieaanvragen, voeg nieuwe ideeën toe of stem op bestaande ideeën in het feedbackforum van SQL Database.