Horizontální navýšení kapacity databází pomocí správce mapování horizontálních oddílů
Platí pro: Azure SQL Database
K snadnému horizontálnímu navýšení kapacity databází ve službě Azure SQL Database použijte správce map horizontálních oddílů. Správce mapování horizontálních oddílů je speciální databáze, která udržuje globální mapové informace o všech horizontálních oddílech (databázích) v sadě horizontálních oddílů. Metadata umožňují aplikaci připojit se ke správné databázi na základě hodnoty klíče horizontálního dělení. Kromě toho každý horizontální oddíl v sadě obsahuje mapy, které sledují místní data horizontálních oddílů (označovaná jako shardlety).
Pochopení způsobu vytváření těchto map je nezbytné pro správu mapování horizontálních oddílů. To se provádí pomocí třídy ShardMapManager (Java, .NET), která se nachází v klientské knihovně elastické databáze ke správě map horizontálních oddílů.
Mapy horizontálních oddílů a mapování horizontálních oddílů
U každého horizontálního oddílu musíte vybrat typ mapy horizontálních oddílů, který chcete vytvořit. Volba závisí na architektuře databáze:
- Jeden tenant na databázi
- Více tenantů na databázi (dva typy):
- Mapování seznamu
- Mapování rozsahu
Pro model s jedním tenantem vytvořte mapování horizontálních oddílů seznamu . Model s jedním tenantem přiřazuje jednu databázi na tenanta. Jedná se o efektivní model pro vývojáře SaaS, protože zjednodušuje správu map horizontálních oddílů.
Model s více tenanty přiřazuje jednotlivým databázím několik tenantů (a můžete distribuovat skupiny tenantů napříč několika databázemi). Tento model použijte, pokud očekáváte, že každý tenant bude potřebovat malá data. V tomto modelu přiřaďte k databázi rozsah tenantů pomocí mapování rozsahu.
Nebo můžete implementovat model databáze s více tenanty pomocí mapování seznamu pro přiřazení více tenantů k jednotlivým databázím. Db1 se například používá k ukládání informací o ID tenanta 1 a 5 a DB2 ukládá data pro tenanta 7 a tenanta 10.
Podporované typy klíčů horizontálního dělení
Elastic Scale podporuje následující typy jako klíče horizontálního dělení:
.NET | Java |
---|---|
integer | integer |
long | long |
guid | Uuid |
byte[] | byte[] |
datetime | časové razítko |
timespan | doba trvání |
datetimeoffset | offsetdatetime |
Mapy horizontálních oddílů seznamu a rozsahu
Mapy horizontálních oddílů je možné vytvořit pomocí seznamů jednotlivých hodnot klíče horizontálního dělení nebo je lze vytvořit pomocí rozsahů hodnot klíče horizontálního dělení.
Seznam map horizontálních oddílů
Horizontální oddíly obsahují shardlety a mapování shardletů na horizontální oddíly se udržuje pomocí mapy horizontálních oddílů. Mapa horizontálních oddílů seznamu je přidružení mezi hodnotami jednotlivých klíčů, které identifikují shardlety a databáze, které slouží jako horizontální oddíly. Mapování seznamů jsou explicitní a různé klíčové hodnoty lze mapovat na stejnou databázi. Například hodnota klíče 1 se mapuje na databázi A a hodnoty klíče 3 a 6 se mapuje na databázi B.
Klíč | Umístění horizontálního oddílu |
---|---|
0 | Database_A |
3 | Database_B |
4 | Database_C |
6 | Database_B |
... | ... |
Mapy horizontálních oddílů rozsahu
V mapě horizontálních oddílů rozsahu je rozsah klíčů popsán dvojicí [Nízká hodnota, Vysoká hodnota), kde je minimální hodnotou v rozsahu klíč a vysoká hodnota je první hodnota vyšší než oblast.
Například [0, 100) obsahuje všechna celá čísla větší nebo rovna 0 a menší než 100. Všimněte si, že více oblastí může odkazovat na stejnou databázi a jsou podporovány nesouvislé oblasti (například [100 200) a [400 600) oba odkazy na databázi C v následujícím příkladu.)
Klíč | Umístění horizontálního oddílu |
---|---|
[1,50) | Database_A |
[50,100) | Database_B |
[100,200) | Database_C |
[400,600) | Database_C |
... | ... |
Každá z výše uvedených tabulek představuje koncepční příklad objektu ShardMap . Každý řádek představuje zjednodušený příklad jednotlivého objektu PointMapping (pro mapování horizontálních oddílů seznamu) nebo RangeMapping (pro objekt mapování horizontálních oddílů rozsahu).
Správce mapování horizontálních oddílů
Správce mapování horizontálních oddílů je v klientské knihovně kolekcí map horizontálních oddílů. Data spravovaná instancí ShardMapManager se uchovávají na třech místech:
- Globální mapa horizontálních oddílů (GSM):: Zadáte databázi, která bude sloužit jako úložiště pro všechny jeho mapy horizontálních oddílů a mapování. Pro správu informací se automaticky vytvoří speciální tabulky a uložené procedury. Obvykle se jedná o malou databázi a mírně se k ní přistupuje a nemělo by se používat pro jiné potřeby aplikace. Tabulky jsou ve speciálním schématu s názvem __ShardManagement.
- Mapa místních horizontálních oddílů (LSM):: Každá databáze, kterou určíte jako horizontální oddíl, se upraví tak, aby obsahovala několik malých tabulek a speciální uložené procedury, které obsahují a spravují informace mapy horizontálních oddílů specifické pro tento horizontální oddíl. Tyto informace jsou redundantní s informacemi v GSM a umožňují aplikaci ověřit informace mapy horizontálních oddílů v mezipaměti bez jakéhokoli zatížení GSM; aplikace pomocí LSM určí, jestli je mapování v mezipaměti stále platné. Tabulky odpovídající LSM v jednotlivých horizontálních oddílech jsou také ve schématu __ShardManagement.
- Mezipaměť aplikací: Každá instance aplikace, která přistupuje k objektu ShardMapManager , udržuje místní mezipaměť v paměti mapování. Ukládá informace o směrování, které byly nedávno načteny.
Vytvoření objektu ShardMapManager
Objekt ShardMapManager je vytvořen pomocí vzoru továrny (Java, .NET). Metoda ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) přebírá přihlašovací údaje (včetně názvu serveru a názvu databáze držícího GSM) ve formě ConnectionString a vrací instanci ShardMapManager.
Poznámka: Objekt ShardMapManager by se měl vytvořit pouze jednou pro každou doménu aplikace v rámci inicializačního kódu aplikace. Vytvoření dalších instancí ShardMapManager ve stejné doméně aplikace vede ke zvýšení využití paměti a procesoru aplikace. ShardMapManager může obsahovat libovolný počet map horizontálních oddílů. I když jedna mapa horizontálních oddílů může stačit pro mnoho aplikací, existují časy, kdy se různé sady databází používají pro různá schémata nebo pro jedinečné účely; v takových případech může být vhodnější více map horizontálních oddílů.
V tomto kódu se aplikace pokusí otevřít existující ShardMapManager pomocí TryGetSqlShardMapManager (Java, metoda .NET . Pokud objekty představující globální ShardMapManager (GSM) ještě neexistují uvnitř databáze, klientská knihovna je vytvoří pomocí metody 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.
}
Pro verzi .NET můžete pomocí PowerShellu vytvořit nový Správce mapování horizontálních oddílů.
Získání RangeShardMap nebo ListShardMap
Po vytvoření správce mapování horizontálních oddílů můžete získat RangeShardMap (Java, .NET) nebo ListShardMap (Java, .NET) pomocí metody TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) nebo Metody 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;
}
Přihlašovací údaje pro správu mapování horizontálních oddílů
Aplikace, které spravují mapy horizontálních oddílů a manipulují s nimi, se liší od aplikací, které ke směrování připojení používají mapy horizontálních oddílů.
Ke správě map horizontálních oddílů (přidání nebo změna horizontálních oddílů, map horizontálních oddílů, mapování horizontálních oddílů atd.) musíte vytvořit instanci ShardMapManager pomocí přihlašovacích údajů, které mají oprávnění ke čtení a zápisu pro databázi GSM i pro každou databázi, která slouží jako horizontální oddíl. Přihlašovací údaje musí umožňovat zápisy do tabulek v GSM i LSM, protože se zadávají nebo mění informace o mapách horizontálních oddílů a také pro vytváření tabulek LSM v nových horizontálních oddílech.
Viz Přihlašovací údaje používané pro přístup k klientské knihovně elastické databáze.
Ovlivněná pouze metadata
Metody používané k naplnění nebo změně dat ShardMapManager nemění uživatelská data uložená v samotných horizontálních oddílech. Například metody, jako jsou CreateShard, DeleteShard, UpdateMapping atd. ovlivňují pouze metadata mapování horizontálních oddílů. Neodeberou, nepřidají ani nemění uživatelská data obsažená v horizontálních oddílech. Místo toho jsou tyto metody navrženy tak, aby se používaly ve spojení s samostatnými operacemi, které provedete při vytváření nebo odebírání skutečných databází, nebo které přesouvají řádky z jednoho horizontálního oddílu do druhého, aby bylo možné znovu vyvážit horizontálně dělené prostředí. (Nástroj rozdělené sloučení , který je součástí nástrojů elastické databáze, využívá tato rozhraní API spolu s orchestrací skutečného přesunu dat mezi horizontálními oddíly.) Viz Škálování pomocí nástroje Elastic Database split-merge.
Směrování závislé na datech
Správce mapování horizontálních oddílů se používá v aplikacích, které k provádění datových operací specifických pro danou aplikaci vyžadují připojení k databázi. Tato připojení musí být přidružená ke správné databázi. To se označuje jako směrování závislé na datech. Pro tyto aplikace vytvořte instanci objektu správce mapování horizontálních oddílů z továrny pomocí přihlašovacích údajů, které mají přístup jen pro čtení v databázi GSM. Jednotlivé požadavky na pozdější připojení poskytují přihlašovací údaje potřebné pro připojení k příslušné databázi horizontálních oddílů.
Všimněte si, že tyto aplikace (pomocí ShardMapManager otevřené s přihlašovacími údaji jen pro čtení) nemohou provádět změny map nebo mapování. Pro tyto potřeby vytvořte aplikace specifické pro správu nebo skripty PowerShellu, které poskytují přihlašovací údaje s vyššími oprávněními, jak je popsáno výše. Viz Přihlašovací údaje používané pro přístup k klientské knihovně elastické databáze.
Další informace naleznete v tématu Směrování závislé na datech.
Úprava mapy horizontálních oddílů
Mapu horizontálních oddílů je možné změnit různými způsoby. Všechny následující metody upravují metadata popisující horizontální oddíly a jejich mapování, ale neupravují fyzicky data v rámci horizontálních oddílů, ani nevytvoří ani neodstraní skutečné databáze. Některé operace na mapě horizontálních oddílů popsané níže mohou být potřeba koordinovat s akcemi správy, které fyzicky přesouvají data nebo přidávají a odebírat databáze sloužící jako horizontální oddíly.
Tyto metody spolupracují jako stavební bloky, které jsou k dispozici pro úpravu celkové distribuce dat v prostředí horizontálně dělené databáze.
Přidání nebo odebrání horizontálních oddílů: použijte CreateShard (Java, .NET) a DeleteShard (Java, .NET) třídy shardmap (Java, .NET).
Server a databáze představující cílový horizontální oddíl už musí existovat, aby se tyto operace spustily. Tyto metody nemají žádný vliv na samotné databáze, pouze na metadata v mapě horizontálních oddílů.
K vytvoření nebo odebrání bodů nebo oblastí mapovaných na horizontální oddíly: použijte CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) třídy RangeShardMapping (Java, .NET) a CreatePointMapping (Java, .NET) třídy ListShardMap (Java, .NET).
Mnoho různých bodů nebo oblastí je možné mapovat na stejný horizontální oddíl. Tyto metody ovlivňují pouze metadata – neovlivňují žádná data, která již mohou být v horizontálních oddílech. Pokud je potřeba data z databáze odebrat, aby byla konzistentní s operacemi DeleteMapping , provedete tyto operace samostatně, ale ve spojení s těmito metodami.
Pokud chcete rozdělit existující rozsahy do dvou nebo sloučit sousední oblasti do jedné: použijte SplitMapping (Java, .NET) a MergeMappings (Java, .NET).
Operace rozdělení a sloučení nemění horizontální oddíl, na který se mapují hodnoty klíče. Rozdělení rozdělí existující oblast na dvě části, ale obě ponechá namapované na stejný horizontální oddíl. Sloučení funguje se dvěma sousedními oblastmi, které jsou už namapované na stejný horizontální oddíl, a slučuje je do jedné oblasti. Přesun bodů nebo rozsahů mezi horizontálními oddíly je potřeba koordinovat pomocí updateMappingu ve spojení se skutečným přesunem dat. Službu Split/Merge, která je součástí nástrojů elastické databáze, můžete použít ke koordinaci změn mapování horizontálních oddílů s přesunem dat v případě potřeby přesunu.
Pokud chcete znovu namapovat (nebo přesunout) jednotlivé body nebo rozsahy do různých horizontálních oddílů: použijte UpdateMapping (Java, .NET).
Vzhledem k tomu, že data může být potřeba přesunout z jednoho horizontálního oddílu do jiného, aby byla konzistentní s operacemi UpdateMapping , musíte tento přesun provést samostatně, ale ve spojení s těmito metodami.
K online a offline mapování: K řízení online stavu mapování použijte MarkMappingOffline (Java, .NET) a MarkMappingOnline (Java, .NET).
Některé operace s mapováním horizontálních oddílů jsou povoleny pouze v případě, že je mapování v offline stavu, včetně updateMappingu a odstraněníMappingu. Když je mapování offline, požadavek závislý na datech založený na klíči, který je součástí mapování, vrátí chybu. Kromě toho se při prvním přechádnutí rozsahu do offline režimu ukončí všechna připojení k ovlivněným horizontálním oddílům, aby se zabránilo nekonzistentním nebo neúplným výsledkům pro dotazy směrované proti změně rozsahů.
Mapování jsou neměnné objekty v .NET. Všechny výše uvedené metody, které mění mapování, také zneplatní všechny odkazy na ně v kódu. Aby bylo snazší provádět posloupnosti operací, které mění stav mapování, vrátí všechny metody, které změní mapování, nový odkaz na mapování, aby mohly být operace zřetězený. Pokud chcete například odstranit existující mapování v objektu shardmap s klíčem 25, můžete provést následující:
sm.DeleteMapping(sm.MarkMappingOffline(sm.GetMappingForKey(25)));
Přidání horizontálního oddílu
Aplikace často potřebují přidat nové horizontální oddíly pro zpracování dat, která se očekávají z nových klíčů nebo rozsahů klíčů, pro mapu horizontálních oddílů, která již existuje. Například aplikace horizontálně dělené podle ID tenanta může potřebovat zřídit nový horizontální oddíl pro nového tenanta nebo data horizontálně dělené měsíčně můžou potřebovat nové horizontální oddíly zřízené před začátkem každého nového měsíce.
Pokud nový rozsah hodnot klíče ještě není součástí existujícího mapování a není potřeba přesun dat, je jednoduché přidat nový horizontální oddíl a přidružit nový klíč nebo rozsah k ho horizontálnímu oddílu. Podrobnosti o přidávání nových horizontálních oddílů najdete v tématu Přidání nového horizontálního oddílu.
V případě scénářů, které vyžadují přesun dat, je však potřeba nástroj pro rozdělení sloučení k orchestraci přesunu dat mezi horizontálními oddíly v kombinaci s potřebnými aktualizacemi mapování horizontálních oddílů. Podrobnosti o použití nástroje split-merge naleznete v tématu Přehled rozdělení-sloučení
Související obsah
Ještě nepoužíváte nástroje elastické databáze? Podívejte se na naši příručku Začínáme. Pokud máte dotazy, kontaktujte nás na stránce otázek Microsoft Q&A pro SLUŽBU SQL Database a žádosti o funkce, přidejte nové nápady nebo hlasujte pro stávající nápady ve fóru pro zpětnou vazbu ke službě SQL Database.