Skalowanie baz danych w poziom za pomocą menedżera mapi fragmentów
Dotyczy:Azure SQL Database
Aby łatwo skalować bazy danych w poziomie w usłudze Azure SQL Database, użyj menedżera map fragmentów. Menedżer map fragmentów to specjalna baza danych, która przechowuje globalne informacje o mapowaniu wszystkich fragmentów (baz danych) w zestawie fragmentów. Metadane umożliwiają aplikacji łączenie się z poprawną bazą danych na podstawie wartości klucza fragmentowania. Ponadto każdy fragment w zestawie zawiera mapy, które śledzą lokalne dane fragmentów (nazywane fragmentami).
Zrozumienie sposobu konstruowania tych map jest niezbędne do zarządzania mapami fragmentów. Odbywa się to przy użyciu klasy ShardMapManager (Java, .NET) znajdującej się w bibliotece klienta elastic database w celu zarządzania mapami fragmentów.
Mapy fragmentów i mapowania fragmentów
Dla każdego fragmentu należy wybrać typ mapy fragmentów do utworzenia. Wybór zależy od architektury bazy danych:
- Jeden najemca na bazę danych
- Wiele dzierżawców na bazę danych (dwa typy)
- Mapowanie listy
- Mapowanie zakresu
W przypadku modelu z jedną dzierżawą utwórz mapę fragmentów list-mapping. Model jednolokatorski przypisuje każdemu lokatorowi własną bazę danych. Jest to skuteczny model dla deweloperów SaaS, ponieważ upraszcza zarządzanie mapami fragmentów.
Model wielonajemca przypisuje kilku najemców do pojedynczej bazy danych (i można rozdzielać grupy najemców w wielu bazach danych). Użyj tego modelu, gdy oczekujesz, że każdy najemca będzie miał niewielkie potrzeby dotyczące danych. W tym modelu przypisz zakres dzierżaw do bazy danych za pomocą mapowania zakresowego.
Możesz też zaimplementować model wielodzierżawowej bazy danych przy użyciu mapowania listy w celu przypisania wielu najemców do pojedynczej bazy danych. Na przykład baza danych DB1 służy do przechowywania informacji o identyfikatorze dzierżawy 1 i 5, a baza danych DB2 przechowuje dane dla dzierżawy 7 i dzierżawy 10.
Obsługiwane typy kluczy fragmentowania
Elastyczna skala obsługuje następujące typy jako klucze fragmentowania:
.NET | Java |
---|---|
liczba całkowita | liczba całkowita |
długi | długi |
Identyfikator GUID | uuid |
byte[] | byte[] |
data i czas | znacznik czasu |
zakres czasu | czas trwania |
datetimeoffset | offsetdatetime |
Mapy list i zakresów fragmentów
Mapy fragmentów można tworzyć przy użyciu list poszczególnych wartości klucza fragmentowania lub można je tworzyć przy użyciu zakresów wartości klucza fragmentowania.
Mapy fragmentów listy
Fragmenty zawierają fragmenty podrzędne, a mapowanie fragmentów podrzędnych do fragmentów jest obsługiwane przez mapę fragmentów. Mapa listy fragmentów to skojarzenie między poszczególnymi wartościami kluczy, które identyfikują shardlety, a bazami danych, które pełnią funkcję fragmentów. Mapowania list są jawne i różne wartości kluczy można mapować na tę samą bazę danych. Na przykład wartość klucza 1 mapuje na bazę danych A, a wartości klucza 3 i 6 mapuje na bazę danych B.
Klucz | Lokalizacja fragmentu |
---|---|
1 | Database_A |
3 | Baza_danych_B |
4 | Database_C |
6 | Database_B |
... | ... |
Mapy fragmentów zakresu
Na mapie fragmentów zakresu zakres kluczy jest opisywany przez parę [Niska wartość, Wartość wysoka), gdzie wartość niska jest kluczem minimalnym w zakresie, a wartość wysoka jest pierwszą wartością wyższą niż zakres.
Na przykład [0, 100) zawiera wszystkie liczby całkowite większe lub równe 0 i mniejsze niż 100. Należy pamiętać, że wiele zakresów może wskazywać na tę samą konkretną bazę danych i że obsługiwane są również rozłączne zakresy (przykładowo, [100, 200) oraz [400, 600) wskazują na bazę danych C w poniższym przykładzie).
Klucz | Lokalizacja fragmentu |
---|---|
[1,50) | Baza danych_A |
[50,100) | Baza danych_B |
[100,200) | Database_C |
[400,600) | Baza_danych_C |
... | ... |
Każda z powyższych tabel jest przykładem koncepcyjnym obiektu ShardMap . Każdy wiersz jest uproszczonym przykładem pojedynczego obiektu PointMapping (dla mapy fragmentów listy) lub RangeMapping (dla mapy fragmentów zakresu).
Menedżer map segmentów
W bibliotece klienta, menedżer map fragmentów to zbiór map fragmentów. Dane zarządzane przez instancję ShardMapManager są przechowywane w trzech miejscach:
- Globalna mapa fragmentów (GSM): należy określić bazę danych, która będzie służyć jako repozytorium dla wszystkich map i mapowań fragmentów. Specjalne tabele i procedury składowane są tworzone automatycznie w celu zarządzania informacjami. Jest to zazwyczaj mała baza danych, do której rzadko się sięga, i nie powinna być używana do innych celów aplikacji. Tabele znajdują się w specjalnym schemacie o nazwie __ShardManagement.
- Lokalna mapa fragmentów (LSM): Każda baza danych, którą określasz jako fragment, jest modyfikowana, aby zawierać kilka małych tabel oraz specjalne procedury składowane, które zawierają i zarządzają informacjami mapy fragmentów specyficznymi dla tego fragmentu. Te informacje są redundantne wobec informacji w GSM i umożliwiają aplikacji weryfikację buforowanych informacji o mapie fragmentów bez nakładania żadnego obciążenia na GSM; aplikacja używa LSM do określenia, czy buforowane mapowanie jest nadal ważne. Tabele odpowiadające LSM dla każdego fragmentu znajdują się również w schemacie __ShardManagement.
- Pamięć podręczna aplikacji: każde wystąpienie aplikacji uzyskujące dostęp do obiektu ShardMapManager przechowuje lokalną pamięć podręczną mapowań w pamięci. Przechowuje informacje o trasach, które zostały ostatnio pobrane.
Konstruowanie elementu ShardMapManager
Obiekt ShardMapManager jest konstruowany przy użyciu wzorca fabryki (Java, .NET). Metoda ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) przyjmuje poświadczenia (w tym nazwę serwera i nazwę bazy danych przechowującą gsm) w postaci elementu ConnectionString i zwraca wystąpienie elementu ShardMapManager.
Uwaga: Element ShardMapManager powinien zostać utworzone tylko raz na domenę aplikacji w kodzie inicjowania aplikacji. Utworzenie dodatkowych wystąpień narzędzia ShardMapManager w tej samej domenie aplikacji powoduje zwiększenie wykorzystania pamięci i procesora CPU aplikacji. Element ShardMapManager może zawierać dowolną liczbę map fragmentów. Chociaż pojedyncza mapa fragmentów może być wystarczająca dla wielu aplikacji, czasami różne zestawy baz danych są używane do różnych schematów lub do unikatowych celów; w takich przypadkach preferowane może być wiele map fragmentów.
W tym kodzie aplikacja próbuje otworzyć istniejący ShardMapManager za pomocą metody TryGetSqlShardMapManager (Java, .NET). Jeśli obiekty reprezentujące Global ShardMapManager (GSM) jeszcze nie istnieją w bazie danych, biblioteka kliencka tworzy je przy użyciu 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.
}
W przypadku wersji platformy .NET możesz użyć programu PowerShell do utworzenia nowego Menedżera map fragmentów.
Pobierz RangeShardMap lub ListShardMap
Po utworzeniu menedżera mapy fragmentów, można pobrać RangeShardMap (Java, .NET) lub ListShardMap (Java, .NET) przy użyciu metody TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) lub 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;
}
Poświadczenia administracyjne mapy fragmentów
Aplikacje, które zarządzają mapami fragmentów i manipulują nimi, różnią się od tych, które używają map fragmentów do kierowania połączeń.
Aby administrować mapami fragmentów (dodawać lub zmieniać fragmenty, mapy fragmentów, mapowania fragmentów itp.) należy utworzyć instancję ShardMapManager przy użyciu poświadczeń z uprawnieniami do odczytu i zapisu zarówno w bazie danych GSM, jak i w każdej bazie danych działającej jako fragment. Poświadczenia muszą zezwalać na zapisy w tabelach zarówno w GSM, jak i LSM, ponieważ informacje o mapie fragmentów są wprowadzane lub zmieniane, a także na tworzenie tabel LSM na nowych fragmentach.
Zobacz Poświadczenia używane do uzyskiwania dostępu do biblioteki klienta elastycznej bazy danych.
Dotyczy to tylko metadanych
Metody używane do wypełniania lub zmieniania danych ShardMapManager nie zmieniają danych użytkownika przechowywanych w samych fragmentach. Na przykład metody, takie jak CreateShard, DeleteShard, UpdateMapping itp., mają wpływ tylko na metadane mapy fragmentów. Nie usuwają, dodawają ani nie zmieniają danych użytkownika zawartych w fragmentach. Zamiast tego te metody są przeznaczone do użycia w połączeniu z oddzielnymi operacjami wykonywanymi w celu utworzenia lub usunięcia rzeczywistych baz danych albo przenoszenia wierszy z jednego fragmentu do drugiego w celu ponownego zrównoważenia środowiska podzielonego na fragmenty. (Narzędzie dzielenie-scalanie dołączone do narzędzi elastycznej bazy danych korzysta z tych interfejsów API, koordynując rzeczywiste przenoszenie danych między fragmentami). Zobacz Skalowanie przy użyciu narzędzia do dzielenia i scalania elastycznej bazy danych.
Routing zależny od danych
Menedżer map odłamków jest używany w aplikacjach, które wymagają połączeń z bazą danych w celu przeprowadzania operacji na danych specyficznych dla aplikacji. Te połączenia muszą być skojarzone z poprawną bazą danych. Jest to nazywane routingiem zależnym od danych. W przypadku tych aplikacji utwórz wystąpienie obiektu menedżera map fragmentów z fabryki przy użyciu poświadczeń, które mają dostęp tylko do odczytu w bazie danych GSM. Pojedyncze żądania dostarczają poświadczenia niezbędne do późniejszego nawiązania połączenia z odpowiednią bazą danych shardu.
Należy pamiętać, że te aplikacje (przy użyciu narzędzia ShardMapManager otwarte z poświadczeniami tylko do odczytu) nie mogą wprowadzać zmian w mapach lub mapowaniach. W przypadku tych potrzeb utwórz aplikacje specyficzne dla administratora lub skrypty programu PowerShell, które dostarczają poświadczenia uprzywilejowane zgodnie z wcześniejszym opisem. Zobacz Poświadczenia używane do uzyskiwania dostępu do biblioteki klienta elastycznej bazy danych.
Aby uzyskać więcej informacji, zobacz Routing zależny od danych.
Modyfikowanie mapy fragmentów
Mapa fragmentów może być zmieniana na różne sposoby. Wszystkie poniższe metody modyfikują metadane opisujące fragmenty i ich mapowania, ale nie modyfikują fizycznie danych w fragmentach ani nie tworzą ani nie usuwają rzeczywistych baz danych. Niektóre operacje na mapie fragmentów opisanej poniżej mogą wymagać koordynacji z akcjami administracyjnymi, które fizycznie przenoszą dane lub dodają i usuwają bazy danych obsługujące jako fragmenty.
Te metody współpracują ze sobą jako bloki konstrukcyjne dostępne do modyfikowania ogólnej dystrybucji danych w środowisku bazy danych podzielonych na fragmenty.
Aby dodać lub usunąć fragmenty: użyj klasy CreateShard (Java, .NET) i DeleteShard (Java, .NET) z klasy shardmap (Java, .NET).
Serwer i baza danych reprezentująca docelowy fragment muszą już istnieć, aby te operacje były wykonywane. Te metody nie mają żadnego wpływu na same bazy danych, tylko na metadane na mapie fragmentów.
Aby utworzyć lub usunąć punkty lub zakresy mapowane na fragmenty: użyj metod CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) klasy RangeShardMapping (Java, .NET) oraz CreatePointMapping (Java, .NET) klasy ListShardMap (Java, .NET).
Wiele różnych punktów lub zakresów można przypisać do tego samego fragmentu. Te metody mają wpływ tylko na metadane — nie mają wpływu na żadne dane, które mogą być już obecne w fragmentach. Jeśli dane muszą zostać usunięte z bazy danych w celu zapewnienia spójności z operacjami DeleteMapping , należy wykonać te operacje oddzielnie, ale w połączeniu z użyciem tych metod.
Aby podzielić istniejące zakresy na dwa lub scalić sąsiadujące zakresy na jeden: użyj funkcji SplitMapping (Java, .NET) i MergeMappings (Java, .NET).
Należy pamiętać, że operacje dzielenia i scalania nie zmieniają fragmentu, na który są mapowane wartości kluczy. Podział dzieli istniejący zakres na dwie części, ale pozostawia obie jako przypisane do tego samego fragmentu. Scalanie działa w oparciu o dwa sąsiednie zakresy, które są już przypisane do tego samego fragmentu, łącząc je w jeden zakres. Ruch punktów lub zakresów między fragmentami musi być skoordynowany przy użyciu funkcji UpdateMapping w połączeniu z rzeczywistym przenoszeniem danych. Możesz użyć usługi Split/Merge , która jest częścią narzędzi elastycznej bazy danych, aby koordynować zmiany mapy fragmentów z przenoszeniem danych, gdy jest to konieczne.
Aby ponownie mapować (lub przenosić) poszczególne punkty lub zakresy do różnych fragmentów: użyj funkcji UpdateMapping (Java, .NET).
Ponieważ dane mogą być przenoszone z jednego fragmentu do innego w celu zapewnienia spójności z operacjami UpdateMapping , należy wykonać ten ruch oddzielnie, ale w połączeniu z użyciem tych metod.
Aby przełączać mapowania w trybie online i offline: użyj MarkMappingOffline (Java, .NET) i MarkMappingOnline (Java, .NET), aby kontrolować stan online mapowania.
Niektóre operacje na mapowaniach fragmentów są dozwolone tylko wtedy, gdy mapowanie jest w stanie offline , w tym UpdateMapping i DeleteMapping. Gdy mapowanie jest w trybie offline, żądanie zależne od danych na podstawie klucza uwzględnionego w tym mapowaniu zwraca błąd. Ponadto, gdy zakres jest po raz pierwszy przełączany do trybu offline, wszystkie połączenia z dotkniętym fragmentem są automatycznie zrywane, aby zapobiec niespójnym lub niekompletnym wynikom zapytań kierowanych do zmienianych zakresów.
Mapowania są niezmiennymi obiektami na platformie .NET. Wszystkie powyższe metody, które zmieniają mapowania, również unieważniają wszystkie odwołania do nich w kodzie. Aby ułatwić wykonywanie sekwencji operacji, które zmieniają stan mapowania, wszystkie metody, które zmieniają mapowanie, zwracają nową referencję mapowania, dzięki czemu operacje mogą być zlinkowane. Aby na przykład usunąć istniejące mapowanie w mapie fragmentów sm zawierającej klucz 25, można wykonać następujące czynności:
sm.DeleteMapping(sm.MarkMappingOffline(sm.GetMappingForKey(25)));
Dodawanie fragmentu
Aplikacje często muszą dodawać nowe fragmenty do obsługi danych oczekiwanych z nowych kluczy lub zakresów kluczy dla mapy fragmentów, która już istnieje. Na przykład aplikacja podzielona na fragmenty według identyfikatora najemcy może wymagać utworzenia nowego fragmentu dla nowego najemcy, lub dane podzielone na fragmenty co miesiąc mogą wymagać utworzenia nowego fragmentu przed rozpoczęciem każdego nowego miesiąca.
Jeśli nowy zakres wartości klucza nie jest już częścią istniejącego mapowania i nie jest konieczne przenoszenie danych, wystarczy dodać nowy fragment i skojarzyć nowy klucz lub zakres z tym fragmentem. Aby uzyskać szczegółowe informacje na temat dodawania nowych fragmentów, zobacz Dodawanie nowego fragmentu.
W scenariuszach wymagających przenoszenia danych potrzebne jest jednak narzędzie do dzielenia i scalania, aby orkiestracja przenoszenia danych między fragmentami mogła odbywać się w połączeniu z niezbędnymi aktualizacjami mapy fragmentów. Aby uzyskać szczegółowe informacje na temat korzystania z narzędzia split-merge, zobacz Overview of split-merge
Powiązana zawartość
Jeszcze nie korzystasz z narzędzi elastycznych baz danych? Zapoznaj się z naszym przewodnikiem Wprowadzenie. W przypadku pytań skontaktuj się z nami na stronie pytań i odpowiedzi dotyczących usługi SQL Database oraz w przypadku żądań funkcji, dodaj nowe pomysły lub zagłosuj na istniejące pomysły na forum opinii usługi SQL Database.