Horizontális elbontás az Azure DocumentDB-ben a skálázhatóság érdekében

Az Azure DocumentDB támogatja a horizontális skálázást az adatok és a forgalom horizontális elosztásához. A gyűjteményen belüli dokumentumok logikai szegmenseknek nevezett adattömbökre vannak osztva.

A felosztás minden gyűjtemény esetében egyénileg van definiálva a gyűjtemény dokumentumstruktúrájának kijelölt shard kulcsának használatával. Az adatok ezután adattömbökbe kerülnek, és mindegyik adattömb egy logikai partíciónak felel meg. A szegmenskulcs tulajdonság minden egyedi értékének dokumentumai ugyanabban a logikai szegmensben találhatók.

A szilánkos gyűjteménybe beszúrt összes dokumentum esetében a szegmenskulcs tulajdonság értéke kivonatolt a kijelölt logikai szegmens kiszámításához. A szolgáltatás teljes mértékben felügyeli a logikai tömbök elhelyezését és a fürtön belüli összes logikai tömb elosztását, ezzel mentesítve a felhasználót a kapcsolódó feladatoktól.

Logikai szeletek

Minden olyan dokumentum, amely ugyanazt az értéket tartalmazza a szegmenskulcshoz, ugyanahhoz a logikai szegmenshez tartozik.

Vegyük például az Alkalmazottak nevű gyűjteményt az alábbi dokumentumstruktúrával.

Ez a táblázat a szegmenskulcs értékeinek logikai partíciókra való leképezését mutatja be.

Dokumentumazonosító Töredékkulcs értéke Logikai töredék
"12345" "Steve Smith" 1. szegmens
"23456" Kovács Júlia 2. szilánk
"34567" "Steve Smith" 1. szegmens
"45678" "Michael Smith" 3. szegmens
"56789" Kovács Júlia 2. szilánk
  • A gyűjtemények logikai szegmenseinek száma nincs korlátozva. A gyűjtemények annyi logikai szegmenst tartalmazhatnak, mint az egyes dokumentumokban a szegmenskulcs tulajdonságának egyedi értékével rendelkező dokumentumok.

  • Egyetlen logikai szegmens méretének sincs korlátja.

  • Emellett a szolgáltatás nem korlátozza a tranzakciókat egy logikai szegmens hatókörére. Az Azure DocumentDB támogatja a több logikai szegmensre és a fürt több fizikai szegmensére vonatkozó olvasási és írási tranzakciókat.

Fizikai szegmensek

A fizikai szilánkok az adatok tartósításáért és az adatbázis-tranzakciók teljesítéséért felelős mögöttes gépek és lemezek. A logikai szegmensekkel ellentétben a szolgáltatás a fedél alatt kezeli a fizikai szegmenseket.

A fizikai szegmensek száma a fürt létrehozásakor van meghatározva, és növelhető, ha az adatbázis mérete idővel növekszik. Az önálló szegmensfürtök egyetlen fizikai szegmenst (csomópontot) használnak, amely teljes mértékben felelős a fürt tárolási és adatbázis-tranzakcióiért. A több szegmenses fürtök elosztják az adatokat és a tranzakciókötetet a fürt fizikai szegmensei között.

Logikai rekeszek leképezése fizikai rekeszekre

Új logikai szegmensek hozzáadásakor a fürt zökkenőmentesen frissíti a logikai és a fizikai szegmensek leképezését. Hasonlóképpen, a címtér hozzárendelése az egyes fizikai szegmensekhez módosul, amint új fizikai szegmensek kerülnek hozzáadásra a fürthöz, ezt követően pedig a logikai szegmensek újra kiegyensúlyozódnak a fürtön belül.

A logikai és fizikai részek leképezéséhez használt hash tartomány egyenletesen oszlik el a fürt fizikai részei között. Minden fizikai töredék egyenlő méretű vödröt birtokol a kivonattartomány egy részéből. Minden megírt dokumentum esetében a szegmenskulcs tulajdonság értéke kivonatolt, a kivonat értéke pedig meghatározza a dokumentumnak a mögöttes fizikai szegmenshez való leképezését. Belsőleg több logikai szegmens is egyetlen fizikai szegmensre van leképezve. Ezenkívül a logikai szegmensek soha nem osztódnak meg fizikai szegmensek között, és a logikai szegmensek összes dokumentuma csak egy fizikai szegmensre van leképezve.

Az előző példára épülő, két fizikai szegmenst tartalmazó fürt használatával ez a táblázat a dokumentumok fizikai szegmensekre való leképezését mutatja be.

Dokumentumazonosító Töredékkulcs értéke Logikai töredék Fizikai töredék
"12345" "Steve Smith" 1. szegmens Fizikai töredék 1
"23456" Kovács Júlia 2. szilánk Fizikai szegmens 2
"34567" "Steve Smith" 1. szegmens Fizikai töredék 1
"45678" "Michael Smith" 3. szegmens Fizikai töredék 1
"56789" Kovács Júlia 2. szilánk Fizikai szegmens 2

Fizikai szegmensek kapacitása

A fürt telepítésekor kiválasztott fürtréteg határozza meg egy fizikai szegmens processzor- és memóriakapacitását. Hasonlóképpen a tárolási termékváltozat határozza meg a fizikai szegmensek tárolási és IOPS-kapacitását. A nagyobb fürtszintek nagyobb számítási teljesítményt és nagyobb memóriát biztosítanak, míg a nagyobb tárolólemezek több tárhelyet és IOPS-t biztosítanak. Az olvasás-intenzív munkaterhelések nagyobb fürtszint előnyeit élvezik, míg az írás-intenzív munkaterhelések nagyobb tárolási SKU előnyeit élvezik. A fürtszint vertikálisan fel- és leskálázható a fürt létrehozása után az alkalmazás változó igényei alapján.

Több szegmenses fürtökben az egyes fizikai szegmensek kapacitása megegyezik. A fürtszint vagy a tárolási SKU felskálázása nem változtatja meg a logikai szeletek fizikai szeleteken való elhelyezését. A felskálázási művelet után a fizikai shardok száma változatlan marad, így elkerülhető a klaszter adatainak újraegyensúlyozása.

A fizikai szegmens számítási, memória-, tárolási és IOPS-kapacitása határozza meg a logikai szegmensekhez rendelkezésre álló erőforrásokat. Azok a szeletkulcsok, amelyek nem rendelkeznek egyenletes tárterület- és kérelemtérfogat-eloszlással, egyenetlen tárolás és átviteli sebesség fogyasztását okozhatják a fürtben. A forró partíciók a fizikai szegmensek egyenetlen kihasználtságát okozhatják, ami kiszámíthatatlan teljesítményt és átviteli sebességet eredményezhet. Így a széttagolt fürtök gondos tervezést igényelnek annak érdekében, hogy az alkalmazás követelményeinek idővel történő változásával a teljesítmény konzisztens maradjon.

Replikakészletek

Minden fizikai töredék replikák egy csoportjából áll, amelyeket replikakészletként is emlegetünk. Minden replika az adatbázismotor egy példányát üzemelteti. A replikakészletek tartóssá, magas rendelkezésre állásúvá és konzisztenssé teszik a fizikai szegmensen belüli adattárat. A fizikai szegmenst alkotó replikák öröklik a fizikai szegmens tárolási és számítási kapacitását. Az Azure DocumentDB automatikusan kezeli a replikakészleteket.

Ajánlott eljárások az adatok horizontális felosztásához

  • Az Azure DocumentDB-ben nincs szükség shardolásra, hacsak a kollekció tárolási és tranzakciós térfogata nem lépi túl egyetlen fizikai shard kapacitását. A szolgáltatás például shardonként 32 TB lemezt biztosít. Ha egy gyűjteményhez 32 TB-nál többre van szükség, akkor szeletelni kell.

  • Nem szükséges egy több fizikai shardot tartalmazó klaszter összes gyűjteményét shard-olni. Szeletelt és nem szeletelt gyűjtemények ugyanabban a fürtben együtt létezhetnek. A szolgáltatás optimálisan osztja el a fürtön belüli gyűjteményeket, hogy a fürt számítási és tárolási erőforrásait a lehető leg egyenletesen kihasználja.

  • A nehéz alkalmazások olvasásához a szegmenskulcsot a leggyakoribb lekérdezési minták alapján kell kiválasztani. A gyűjtemény leggyakrabban használt lekérdezésszűrőjét szilánkkulcsként kell kiválasztani az adatbázis-tranzakciók legnagyobb százalékának optimalizálásához a keresés egyetlen fizikai szegmensre való honosításával.

  • A nagy írási terhelésű alkalmazások esetében, ahol az írási teljesítmény fontosabb az olvasásnál, egy szegmenskulcsot kell választani az adatok fizikai szegmensek közötti egyenletes elosztásához. A legnagyobb számosságú partíció kulcsok lehetővé teszik a lehető legegyenletesebb eloszlást.

  • Az optimális teljesítmény érdekében a logikai szegmensek tárolási méretének 4 TB-nál kisebbnek kell lennie.

  • Az optimális teljesítmény érdekében a logikai szegmenseket egyenletesen el kell osztani a tárolásban és a kérések volumenét a klaszter fizikai szegmensei között.

Gyűjtemény horizontális felosztása

Vegye figyelembe a következő dokumentumot a "cosmicworks" adatbázisban és az "employee" gyűjteményben

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7
}

Az alábbi minta a cosmicworks adatbázisban lévő alkalmazotti gyűjteményt a firstName mező alapján szilánkokra bontja.

use cosmicworks;
sh.shardCollection("cosmicworks.employee", {"firstName": "hashed"})

A gyűjtemény egy rendszergazdai paranccsal is skálázható:

use cosmicworks;
db.adminCommand({
  "shardCollection": "cosmicworks.employee",
  "key": {"firstName": "hashed"}
})

Bár nem ideális, hogy a shard kulcsot módosítsuk, miután a gyűjtemény tárterületének mérete jelentősen megnőtt, a reshardCollection paranccsal módosíthatja a shard kulcsot.

use cosmicworks;
sh.reshardCollection("cosmicworks.employee", {"lastName": "hashed"})

A gyűjtemény egy rendszergazdai paranccsal is újraszilárdulhat:

use cosmicworks;
db.adminCommand({
  "reshardCollection": "cosmicworks.employee",
  "key": {"lastName": "hashed"}
})

A bevált módszer szerint indexet kell létrehozni a shard kulcs tulajdonságon.

use cosmicworks;
db.runCommand({
  createIndexes: "employee",
  indexes: [{"key":{"firstName":1}, "name":"firstName_1", "enableLargeIndexKeys": true}],
  blocking: true
})

Következő lépések