Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:Azure SQL Database-
Gebruik een shard map manager om eenvoudig databases uit te schalen in Azure SQL Database. De shardmapbeheerder is een speciale database die globale mappinginformatie 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 die de lokale shardgegevens bijhouden (ook wel shardletsgenoemd).
Inzicht in hoe deze kaarten worden samengesteld, is essentieel voor shard mappingbeheer. Dit wordt gedaan met behulp van de klasse ShardMapManager (Java, .NET), die wordt gevonden in de schaalbare clouddatabases bouwen om shard-kaarten te beheren.
Belangrijk
Elastische query in de shardmapbeheermodus (horizontale partitionering), met behulp van EXTERNAL DATA SOURCE type SHARD_MAP_MANAGER, bereikt het einde van de ondersteuning op 31 maart 2027. Na deze datum blijven bestaande workloads functioneren, maar krijgen ze geen ondersteuning meer en is het maken van nieuwe externe gegevensbronnen van het type SHARD_MAP_MANAGER niet meer mogelijk. Zie de migratiehandleiding van de modus van de Elastic Query Shard Map Manager.
Shardkaarten en shardtoewijzingen
Voor elke shard moet je het type shardmap selecteren dat je wilt maken. De keuze is afhankelijk van de databasearchitectuur:
- Eén tenant per database
- Meerdere tenants per database (twee soorten):
- Lijstkoppeling
- Bereikafstemming
Maak voor een model met één tenant een lijst-toewijzing- en shard-kaart. 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.
Het multitenant-model wijst verschillende tenants toe aan een afzonderlijke database (en u kunt groepen tenants over meerdere databases verdelen). Gebruik dit model wanneer u verwacht dat elke tenant kleine gegevensbehoeften heeft. Wijs in dit model een groep tenants aan een database toe met behulp van bereiktoewijzing.
U kunt ook een multitenant-databasemodel 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.
Ondersteunde typen voor shardingsleutels
Elastic Scale ondersteunt de volgende typen als shardingsleutels:
| .NET | Java |
|---|---|
| geheel getal | geheel getal |
| lang | lang |
| Guid | UUID (Universally Unique Identifier) |
| byte[] | byte[] |
| datum/tijd | tijdstempel |
| tijdspanne | duur |
| datumtijdverschuiving | offsetdatetime |
Kaarten voor lijst- en bereikshards
Shard-toewijzingen kunnen worden samengesteld met behulp van lijsten met afzonderlijke sharding-sleutelwaarden, ofwel door middel van bereiken van sharding-sleutelwaarden.
Shard-mappen weergeven
Shards bevatten shardlets en een shardmap onderhoudt de toewijzing van shardlets aan shards. Een lijstsplijtingskaart is een koppeling tussen de individuele sleutelwaarden die de shardlets identificeren en de databases die als shards dienen. lijsttoewijzingen zijn expliciet, en verschillende sleutelwaarden kunnen naar dezelfde database worden toegewezen. Sleutelwaarde 1 wordt bijvoorbeeld toegewezen aan Database A en sleutelwaarden 3 en 6 worden beide toegewezen aan Database B.
| Sleutel | Shard-locatie |
|---|---|
| 1 | Database_A |
| 3 | Database_B |
| 4 | Database_C |
| 6 | Database_B |
| ... | ... |
Bereik shard kaarten
In een bereik-scherfkaartwordt het sleutelbereik beschreven door een paar [Lage Waarde, Hoge Waarde) waar de Lage Waarde de minimale sleutel in het bereik is en de Hoge Waarde de eerste waarde hoger is dan het bereik.
[0, 100) bevat bijvoorbeeld alle gehele getallen groter dan of gelijk aan 0 en kleiner dan 100. Meerdere bereiken kunnen naar dezelfde database verwijzen en niet-aaneengesloten bereiken worden ondersteund (bijvoorbeeld [100,200) en [400,600), waarbij beide naar Database C verwijzen in het volgende voorbeeld.)
| Sleutel | Shard-locatie |
|---|---|
| [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 individueel PointMapping (voor de lijst-shardmap) of RangeMapping (voor de bereik-shardmap) object.
Shard-kaartbeheerder
In de clientbibliotheek is de shardmapmanager een verzameling shardmaps. De gegevens die worden beheerd door een ShardMapManager exemplaar, worden op drie plaatsen bewaard:
-
Global Shard Map (GSM): u geeft een database op die moet fungeren als opslagplaats voor alle shard-kaarten 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. -
LSM (Local Shard Map): elke database die u als een shard opgeeft, wordt gewijzigd om verschillende kleine tabellen en speciale opgeslagen procedures te bevatten die shard-mapgegevens 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. -
Toepassingscache: Elke toepassingsexemplaar die toegang heeft tot een
ShardMapManagerobject, onderhoudt een lokale in-memory cache 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 ShardMapManagerFactory.GetSqlShardMapManager methode (Java, .NET) gebruikt referenties (inclusief de servernaam en databasenaam die de GSM bevat) in de vorm van een ConnectionString en retourneert een exemplaar van een ShardMapManager.
Opmerking
Het ShardMapManager moet slechts eenmaal per app-domein worden geïnstantieerd binnen de initialisatiecode voor een toepassing. Het maken van extra exemplaren in ShardMapManager hetzelfde app-domein resulteert in een verhoogd geheugen- en CPU-gebruik van de toepassing. Een ShardMapManager kan een willekeurig aantal shard-kaarten bevatten. Hoewel één shard-kaart mogelijk voldoende is voor veel toepassingen, zijn er situaties waarin verschillende sets databases worden gebruikt voor verschillende schema's of voor unieke doeleinden; in die gevallen zijn meerdere shard-kaarten vaak te verkiezen.
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 CreateSqlShardMapManager methode (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 nieuwe Shard Map Manager te maken.
Verkrijg een RangeShardMap of ListShardMap
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;
}
Credentials voor shardmapbeheer
Toepassingen die shard-kaarten beheren en bewerken, verschillen van toepassingen die gebruikmaken van de shard-toewijzingen om verbindingen te routeren.
Als u shardmappen wilt beheren (shards toevoegen of wijzigen, shard-mappen, shard-toewijzingen, enzovoort), moet u de ShardMapManager instantiëren met referenties die lees- en schrijfbevoegdheden hebben op zowel de GSM-database als op elke database die als een shard fungeert. De gegevens moeten schrijfrechten toestaan voor de tabellen in zowel de GSM als de LSM wanneer shard-toewijzingsgegevens worden ingevoerd of gewijzigd, en ook voor het aanmaken van LSM-tabellen op nieuwe shards.
Zie 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, UpdateMappingenzovoort 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 Gegevens verplaatsen tussen uitgeschaalde clouddatabases.
Gegevensafhankelijke routering
Het shard map-manager wordt gebruikt door toepassingen die databaseverbindingen vereisen om de app-specifieke dataverwerkingen uit te voeren. Deze verbindingen moeten zijn gekoppeld aan de juiste database. Dit staat bekend als gegevensafhankelijke routering. 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.
Deze toepassingen (die ShardMapManager geopend worden met alleen-lezen-inloggegevens) kunnen geen wijzigingen aanbrengen in de kaarten of toewijzingen. Voor deze behoeften maakt u beheerspecifieke toepassingen of PowerShell-scripts die referenties met een hogere bevoegdheid leveren, zoals eerder is besproken. Zie Referenties die worden gebruikt voor toegang tot de Elastic Database-clientbibliotheek.
Zie Gegevensafhankelijke routering gebruiken om een query naar een geschikte database te routeren voor meer informatie.
Een shard-kaart 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 volgende bewerkingen op de shard-map moeten mogelijk worden gecoördineerd met administratieve acties die gegevens fysiek verplaatsen of databases toevoegen of verwijderen die dienen als shards.
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) enDeleteShard(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 de metadata in de shard map.
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) enCreatePointMapping(Java, .NET) van de klasse ListShardMap (Java, .NET).Veel verschillende punten of reeksen kunnen naar dezelfde shard worden toegewezen. Deze methoden zijn alleen van invloed op metagegevens. Ze hebben geen invloed op gegevens die mogelijk al aanwezig zijn in shards. Als gegevens uit de database moeten worden verwijderd om consistent te zijn met
DeleteMappingbewerkingen, voert u deze bewerkingen afzonderlijk uit, maar in combinatie met deze methoden.Als u bestaande bereiken wilt splitsen in twee bereiken of aangrenzende bereiken wilt samenvoegen in één bereik: gebruiken
SplitMapping(Java, .NET) enMergeMappings(Java, .NET).Splits- en samenvoegbewerkingen wijzigen niet de shard waaraan sleutelwaarden zijn toegewezen. Een splitsing verdeelt een bestaand bereik in twee delen, maar laat beide aan dezelfde shard toegewezen. Een samenvoeging is van toepassing op twee aangrenzende reeksen die al zijn toegewezen aan dezelfde shard, en voegt ze samen tot één reeks. De verplaatsing van punten of bereiken tussen shards moet worden gecoördineerd door
UpdateMappingte gebruiken samen met daadwerkelijke gegevensverplaatsing. U kunt de service Splitsen/samenvoegen gebruiken die deel uitmaakt van de hulpprogramma's voor elastische databases om wijzigingen in shard-toewijzingen 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
UpdateMappingbewerkingen, moet u die verplaatsing afzonderlijk uitvoeren, maar in combinatie met het gebruik van deze methoden.Om toewijzingen online en offline te maken: gebruik
MarkMappingOffline(Java, .NET) enMarkMappingOnline(Java, .NET) om de onlinestatus van een toewijzing te beheren.Bepaalde bewerkingen op shardtoewijzingen zijn alleen toegestaan wanneer een toewijzing een offlinestatus heeft, inclusief
UpdateMappingenDeleteMapping. 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.
Mappings zijn onveranderbare objecten in .NET. Alle bovenstaande methoden die toewijzingen veranderen, maken ook verwijzingen naar deze in uw code ongeldig. 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 fragment toevoegen
Toepassingen moeten vaak nieuwe shards toevoegen om gegevens te verwerken die worden verwacht uit nieuwe sleutels of sleutelbereiken, binnen een al bestaande shard kaart. Een toepassing die is opgedeeld op basis van tenant-id moet waarschijnlijk een nieuwe shard inrichten voor een nieuwe tenant, of gegevens die maandelijks worden opgedeeld, moeten waarschijnlijk een nieuwe shard inrichten voordat elke nieuwe maand begint.
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 shard toevoegen met elastic database-hulpprogramma's voor meer informatie over het toevoegen van nieuwe shards.
Voor scenario's waarvoor gegevensverplaatsing vereist is, is het echter nodig het hulpprogramma voor splitsen en samenvoegen te gebruiken om de gegevensverplaatsing tussen shards te coördineren, in combinatie met de benodigde updates van de shard-kaart. Zie Gegevens verplaatsen tussen uitgeschaalde clouddatabases voor meer informatie over het gebruik van het hulpprogramma voor splitsen en samenvoegen
Verwante inhoud
Gebruikt u nog geen hulpprogramma's voor elastische databases? Bekijk onze Aan de slag-handleiding. 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 SQL Database-feedbackforum.