Adatbázisok horizontális felskálázása a szegmenstérkép-kezelővel

A következőre vonatkozik: Azure SQL Database

Az Adatbázisok azure SQL Database-en való egyszerű horizontális felskálázásához használjon szegmenstérkép-kezelőt. A szegmensleképezés-kezelő egy speciális adatbázis, amely globális leképezési információkat tart fenn a szegmenskészlet összes szegmenséről (adatbázisáról). A metaadatok lehetővé teszik, hogy az alkalmazás a skálázási kulcs értéke alapján csatlakozzon a megfelelő adatbázishoz. Emellett a készlet minden szegmense tartalmaz olyan térképeket, amelyek nyomon követik a helyi szegmensadatokat (más néven shardleteket).

Shard map management

A szilánktérkép-kezeléshez elengedhetetlen a térképek létrehozásának megértése. Ez az Elastic Database ügyfélkódtárában található ShardMapManager osztály (Java, .NET) használatával történik a szegmenstérképek kezeléséhez.

Szegmensleképezések és szegmensleképezések

Minden szegmenshez ki kell választania a létrehozni kívánt szegmenstérkép típusát. A választás az adatbázis architektúrájától függ:

  1. Önálló bérlő adatbázisonként
  2. Adatbázisonként több bérlő (két típus):
    1. Listaleképezés
    2. Tartományleképezés

Egybérlős modell esetén hozzon létre egy listaleképezési szegmenstérképet. Az egybérlős modell bérlőnként egy adatbázist rendel hozzá. Ez egy hatékony modell saaS-fejlesztők számára, mivel leegyszerűsíti a szegmenstérképek kezelését.

List mapping

A több-bérlős modell több bérlőt rendel egy adott adatbázishoz (és több adatbázis között is eloszthat bérlőcsoportokat). Ezt a modellt akkor használja, ha arra számít, hogy minden bérlőnek kis adatigénye van. Ebben a modellben bérlők tartományát rendelje hozzá egy adatbázishoz tartományleképezéssel.

Range mapping

Vagy több-bérlős adatbázismodellt is implementálhat egy listaleképezéssel , hogy több bérlőt rendeljen hozzá egy adott adatbázishoz. A DB1 például az 1. és az 5. bérlőazonosítóval kapcsolatos információk tárolására szolgál, a DB2 pedig a 7. és a 10. bérlő adatait tárolja.

Multiple tenants on single DB

A skálázási kulcsok támogatott típusai

A rugalmas méretezés a következő típusokat támogatja horizontális kulcsként:

.NET Java
egész szám egész szám
hosszú hosszú
guid uuid
bájt[] bájt[]
dátum/idő timestamp
időtartomány időtartam
datetimeoffset eltolásdatetime

Szilánktérképek listázása és tartománya

A szilánktérképek az egyes horizontális skálázási kulcsértékek listáival hozhatók létre, vagy horizontális skálázási kulcsértékek használatával is létrehozhatók.

Szegmenstérképek listázása

A szegmensek szegmenseket tartalmaznak, a szegmensek szegmensekre való leképezését pedig egy szegmenstérkép tartja fenn. A listaszilánk-leképezés az egyes kulcsértékek közötti társítás, amely azonosítja a szegmenseket és a szegmensként szolgáló adatbázisokat. A listaleképezések explicitek , és különböző kulcsértékek képezhetők le ugyanarra az adatbázisra. Az 1. kulcsérték például az A adatbázisra, a 3. és a 6. kulcsérték pedig a B adatbázisra lesz leképezve.

Kulcs Szegmens helye
1 Database_A
3 Database_B
4 Database_C
6 Database_B
... ...

Tartományszilánk-térképek

Egy tartomány szegmenstérképén a kulcstartományt egy pár [Alacsony érték, Magas érték) írja le, ahol az Alacsony érték a tartomány minimális kulcsa, a Magas érték pedig a tartománynál magasabb első érték.

A(z) [0, 100) például minden 0-nál nagyobb vagy egyenlő egész számot tartalmaz, és 100-nál kisebb egészeket is tartalmaz. Vegye figyelembe, hogy több tartomány is ugyanarra az adatbázisra mutathat, és a különálló tartományok támogatottak (például [100 200) és [400 600) egyaránt a C adatbázisra mutatnak az alábbi példában.)

Kulcs Szegmens helye
[1,50) Database_A
[50,100) Database_B
[100,200) Database_C
[400,600) Database_C
... ...

A fent látható táblák mindegyike egy ShardMap-objektum fogalmi példája. Minden sor egy egyszerűsített példa egy adott PointMapping objektumra (a lista szegmenstérképéhez) vagy RangeMapping objektumra (a tartomány szegmenstérképéhez).

Szilánkleképezés-kezelő

Az ügyfélkódtárban a szegmenstérkép-kezelő szegmenstérképek gyűjteménye. A ShardMapManager-példány által kezelt adatok három helyen vannak tárolva:

  1. Global Shard Map (GSM): Meg kell adnia egy adatbázist, amely az összes szegmensleképezéshez és -leképezéshez adattárként szolgál. A rendszer automatikusan speciális táblákat és tárolt eljárásokat hoz létre az információk kezeléséhez. Ez általában egy kis adatbázis, amely könnyen elérhető, és nem használható az alkalmazás egyéb igényeihez. A táblák egy __ShardManagement nevű speciális sémában találhatók.
  2. Helyi szegmenstérkép (LSM):: A szegmensként megadott összes adatbázist úgy módosítja, hogy több kis táblát és speciális tárolt eljárást tartalmazzon, amelyek az adott szegmensre vonatkozó szegmenstérkép-információkat tartalmaznak és kezelnek. Ezek az információk redundánsak a GSM-ben található információkkal, és lehetővé teszik az alkalmazás számára a gyorsítótárazott szegmenstérkép információinak érvényesítését anélkül, hogy terhelést helyeznek volna el a GSM-en; az alkalmazás az LSM használatával állapítja meg, hogy a gyorsítótárazott leképezés továbbra is érvényes-e. Az egyes szegmenseken az LSM-nek megfelelő táblák szintén a séma __ShardManagement.
  3. Alkalmazásgyorsítótár: A ShardMapManager objektumhoz hozzáférő alkalmazáspéldányok a leképezések helyi memóriabeli gyorsítótárát őrzik meg. A legutóbb lekért útválasztási adatokat tárolja.

ShardMapManager létrehozása

A ShardMapManager-objektumokat egy gyári (Java, .NET) minta alapján kell létrehozni. A ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) metódus a hitelesítő adatokat (beleértve a GSM-t tartalmazó kiszolgálónevet és adatbázisnevet) Csatlakozás ionString formájában veszi fel, és egy ShardMapManager-példányt ad vissza.

Megjegyzés: A ShardMapManager példányosítása alkalmazástartományonként csak egyszer lehetséges az alkalmazás inicializálási kódjában. A ShardMapManager további példányainak létrehozása ugyanabban az alkalmazástartományban megnöveli az alkalmazás memóriáját és processzorhasználatát. A ShardMapManager tetszőleges számú szegmenstérképet tartalmazhat. Bár egy szegmenstérkép sok alkalmazáshoz elegendő lehet, vannak olyan esetek, amikor különböző adatbáziskészleteket használnak különböző sémákhoz vagy egyedi célokra; ezekben az esetekben több szegmenstérkép is előnyösebb lehet.

Ebben a kódban egy alkalmazás megpróbál megnyitni egy meglévő ShardMapManagert a TryGetSqlShardMapManager (Java, .NET metódus) használatával. Ha a globális ShardMapManager (GSM) objektumai még nem léteznek az adatbázisban, az ügyfélkódtár a CreateSqlShardMapManager (Java, .NET) metódussal hozza létre őket.

// 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.
}

A .NET-verzióhoz használhatja a PowerShellt egy új szegmenstérkép-kezelő létrehozásához. Egy példa itt érhető el.

RangeShardMap vagy ListShardMap lekérése

A szegmenstérkép-kezelő létrehozása után a TryGetRangeShardMap (Java, .NET), a TryGetListShardMap (Java, .NET) vagy a GetShardMap (Java, .NET) metódussal szerezheti be a RangeShardMap (Java, .NET) vagy a ListShardMap (Java, .NET) metódust.

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

Szegmenstérkép-felügyeleti hitelesítő adatok

A szegmenstérképeket kezelő és kezelő alkalmazások eltérnek azoktól, amelyek a szegmenstérképeket használják a kapcsolatok irányításához.

A szegmenstérképek felügyeletéhez (szegmensek, szegmensleképezések, szegmensleképezések stb.) a ShardMapManagert olyan hitelesítő adatokkal kell példányosítania, amelyek olvasási/írási jogosultságokkal rendelkeznek mind a GSM-adatbázisban, mind a szegmensként szolgáló adatbázisokban. A hitelesítő adatoknak lehetővé kell tenni az írást a GSM és az LSM tábláihoz a szegmenstérkép adatainak megadásakor vagy módosításakor, valamint az LSM-táblák új szegmenseken való létrehozásához.

Lásd az Elastic Database ügyfélkódtár eléréséhez használt hitelesítő adatokat.

Csak az érintett metaadatok

A ShardMapManager-adatok feltöltéséhez vagy módosításához használt módszerek nem módosítják a szegmensekben tárolt felhasználói adatokat. Például az olyan metódusok, mint a CreateShard, a DeleteShard, az UpdateMapping stb. csak a szegmenstérkép metaadatait érintik. Nem távolítják el, nem adnak hozzá és nem módosítják a szegmensekben található felhasználói adatokat. Ehelyett ezeket a módszereket úgy tervezték, hogy különálló műveletekkel együtt használják a tényleges adatbázisok létrehozásához vagy eltávolításához, vagy hogy sorokat helyezzenek át az egyik szegmensből a másikba a szilánkos környezetek újraegyensúlyozásához. (A rugalmas adatbázis-eszközökben található felosztási egyesítési eszköz ezeket az API-kat használja a szegmensek közötti tényleges adatáthelyezés vezénylésével együtt.) Lásd: Skálázás a rugalmas adatbázis felosztási egyesítési eszközével.

Adatfüggő útválasztás

A szegmenstérkép-kezelőt olyan alkalmazásokban használják, amelyek adatbázis-kapcsolatokat igényelnek az alkalmazásspecifikus adatműveletek végrehajtásához. Ezeket a kapcsolatokat a megfelelő adatbázishoz kell társítani. Ezt adatfüggő útválasztásnak nevezzük. Ezekben az alkalmazásokban példányosítson egy szegmenstérkép-kezelő objektumot a gyárból olyan hitelesítő adatokkal, amelyek írásvédett hozzáféréssel rendelkeznek a GSM-adatbázisban. A későbbi kapcsolatokra vonatkozó egyedi kérések a megfelelő szegmensadatbázishoz való csatlakozáshoz szükséges hitelesítő adatokat szolgáltatják.

Vegye figyelembe, hogy ezek az alkalmazások (a csak olvasható hitelesítő adatokkal megnyitott ShardMapManager használatával) nem módosíthatják a térképeket vagy a leképezéseket. Ezekhez az igényekhez hozzon létre rendszergazdaspecifikus alkalmazásokat vagy PowerShell-szkripteket, amelyek magasabb jogosultságú hitelesítő adatokat biztosítanak a korábban tárgyaltaknak megfelelően. Lásd az Elastic Database ügyfélkódtár eléréséhez használt hitelesítő adatokat.

További információ: Adatfüggő útválasztás.

Szegmenstérkép módosítása

A szegmenstérképek különböző módokon módosíthatók. Az alábbi módszerek mindegyike módosítja a szegmenseket és azok leképezéseit leíró metaadatokat, de fizikailag nem módosítja a szegmenseken belüli adatokat, és nem is hozza létre vagy törli a tényleges adatbázisokat. Előfordulhat, hogy az alábbiakban ismertetett szegmenstérkép egyes műveleteit olyan felügyeleti műveletekkel kell összehangolni, amelyek fizikailag áthelyezik az adatokat, vagy amelyek szegmensként szolgáló adatbázisokat adnak hozzá és távolítanak el.

Ezek a metódusok a horizontális adatbázis-környezetben az adatok általános eloszlásának módosításához rendelkezésre álló építőelemekként működnek együtt.

  • Szegmensek hozzáadásához vagy eltávolításához használja a Szegmenskép (Java, .NET) osztály CreateShard (Java, .NET) és DeleteShard (Java, .NET) elemét.

    A cél szegmenst képviselő kiszolgálónak és adatbázisnak már léteznie kell ezeknek a műveleteknek a végrehajtásához. Ezek a metódusok nincsenek hatással magukra az adatbázisokra, csak a szegmenstérkép metaadataira.

  • A szegmensekre leképezett pontok vagy tartományok létrehozásához vagy eltávolításához használja a ListShardMap (Java, .NET) osztály CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) osztályának DeleteMapping (Java, .NET) és CreatePointMapping (Java, .NET) osztályát.

    Számos különböző pont vagy tartomány megfeleltethető ugyanahhoz a szegmenshez. Ezek a metódusok csak a metaadatokat érintik – nem befolyásolják a szegmensekben már meglévő adatokat. Ha az adatokat el kell távolítani az adatbázisból a DeleteMapping műveletekkel való konzisztensség érdekében, ezeket a műveleteket külön, de az alábbi módszerekkel együtt kell végrehajtania.

  • Meglévő tartományok két részre való felosztásához vagy a szomszédos tartományok egybe egyesítéséhez használja a SplitMapping (Java, .NET) és a MergeMappings (Java, .NET) parancsot .

    Vegye figyelembe, hogy a felosztási és egyesítési műveletek nem módosítják azt a szegmenst, amelyre a kulcsértékek le vannak képezve. A felosztások egy meglévő tartományt két részre bontanak, de mindkettőt ugyanarra a szegmensre képezték le. Az egyesítés két szomszédos tartományon működik, amelyek már ugyanahhoz a szegmenshez vannak leképezve, és egyetlen tartományba egyesíti őket. A pontok vagy tartományok szegmensek közötti mozgását az UpdateMapping és a tényleges adatáthelyezés együttes használatával kell koordinálni. A rugalmas adatbázis-eszközök részét képező felosztási/egyesítési szolgáltatással összehangolhatja a szegmenstérképek változásait az adatáthelyezéssel, amikor mozgásra van szükség.

  • Az egyes pontok vagy tartományok különböző szegmensekre való újratérképezéséhez (vagy áthelyezéséhez) használja az UpdateMapping (Java, .NET) elemet.

    Mivel előfordulhat, hogy az adatokat át kell helyezni az egyik szegmensből a másikba az UpdateMapping-műveletekkel való konzisztensség érdekében, ezt a mozgást külön kell végrehajtania, de a metódusok használatával együtt.

  • A leképezések online és offline állapotba helyezéséhez a MarkMappingOffline (Java, .NET) és a MarkMappingOnline (Java, .NET) használatával szabályozhatja a leképezések online állapotát.

    A szegmensleképezéseken végzett bizonyos műveletek csak akkor engedélyezettek, ha egy leképezés offline állapotban van, beleértve az UpdateMapping ésa DeleteMapping funkciót is. Ha egy leképezés offline állapotban van, a leképezésben szereplő kulcson alapuló adatfüggő kérés hibát ad vissza. Emellett, amikor egy tartomány először offline állapotba kerül, a rendszer automatikusan leáll az érintett szegmenshez való összes kapcsolattal, hogy megakadályozza a tartományokra irányuló lekérdezések inkonzisztens vagy hiányos eredményeit.

A leképezések nem módosítható objektumok a .NET-ben. A fenti összes metódus, amely módosítja a leképezéseket, érvényteleníti a kódban lévő hivatkozásokat is. A leképezés állapotát módosító műveletek sorozatának egyszerűbb végrehajtása érdekében a leképezést módosító összes metódus új leképezési hivatkozást ad vissza, így a műveletek láncoltá alakíthatók. Ha például törölni szeretne egy meglévő leképezést a 25-ös kulcsot tartalmazó shardmap sm-ben, a következőket hajthatja végre:

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

Szegmens hozzáadása

Az alkalmazásoknak gyakran új szegmenseket kell hozzáadniuk az új kulcsoktól vagy kulcstartományoktól elvárt adatok kezeléséhez egy már létező szegmenstérképhez. Előfordulhat például, hogy egy bérlőazonosítóval skálázott alkalmazásnak új szegmenst kell kiépítenie egy új bérlő számára, vagy havonta horizontálisan elosztott adatokhoz szükség lehet egy új szegmens kiépítésére az egyes új hónapok kezdete előtt.

Ha a kulcsértékek új tartománya még nem része egy meglévő leképezésnek, és nincs szükség adatáthelyezésre, egyszerűen hozzáadhatja az új szegmenst, és az új kulcsot vagy tartományt az adott szegmenshez társíthatja. Az új szegmensek hozzáadásáról további információt az Új szegmens hozzáadása című témakörben talál.

Az adatáthelyezést igénylő forgatókönyvek esetében azonban a szegmensek közötti adatáthelyezés és a szükséges szegmenstérkép-frissítések vezényléséhez a felosztási egyesítési eszközre van szükség. A felosztásos egyesítési eszköz használatával kapcsolatos részletekért tekintse meg a felosztásos egyesítés áttekintését

További információforrások

Még nem használ rugalmas adatbázis-eszközöket? Tekintse meg az első lépések útmutatót. Ha kérdése van, lépjen kapcsolatba velünk az SQL Database-hez készült Microsoft Q&A kérdésoldalon, és a funkciókérésekért, adjon hozzá új ötleteket, vagy szavazzon a meglévő ötletekre az SQL Database visszajelzési fórumában.