Sdílet prostřednictvím


Horizontální dělení pro horizontální škálovatelnost ve službě Azure Cosmos DB pro virtuální jádro MongoDB

Virtuální jádro Azure Cosmos DB pro MongoDB podporuje horizontální dělení za účelem horizontální distribuce dat a provozu. Dokumenty v kolekci jsou rozdělené na bloky označované jako logické horizontální oddíly.

Horizontální dělení je definováno jednotlivě pro každou kolekci pomocí určeného klíče horizontálního oddílu ze struktury dokumentu kolekce. Data se pak rozdělí do bloků dat s jednotlivými bloky odpovídajícími logickému oddílu. Dokumenty pro každou jedinečnou hodnotu vlastnosti klíče horizontálního oddílu se nacházejí ve stejném logickém horizontálním oddílu.

Pro každý dokument vložený do horizontálně dělené kolekce je hodnota vlastnosti klíče horizontálního oddílu hashována pro výpočet určeného logického horizontálního oddílu. Onus umístění logického horizontálního oddílu a distribuce všech logických horizontálních oddílů v clusteru jsou abstraktovány od uživatele a plně spravované službou.

Logické horizontální oddíly

Všechny dokumenty obsahující stejnou hodnotu klíče horizontálního oddílu patří do stejného logického horizontálního oddílu.

Představme si například kolekci s názvem Zaměstnanci s následující strukturou dokumentů.

Tato tabulka ukazuje mapování hodnot klíčů horizontálních oddílů na logické oddíly.

ID dokumentu Hodnota klíče horizontálního oddílu Logický horizontální oddíl
"12345" "Steve Smith" Shard 1
"23456" "Jane Doe" Shard 2
"34567" "Steve Smith" Shard 1
"45678" "Michael Smith" Shard 3
"56789" "Jane Doe" Shard 2
  • Počet logických horizontálních oddílů pro kolekci není nijak omezen. Kolekce může mít tolik logických horizontálních oddílů jako dokumenty s jedinečnou hodnotou vlastnosti klíče horizontálního dělení v každém dokumentu.

  • Velikost jednoho logického horizontálního oddílu není nijak omezena.

  • Kromě toho služba neomezuje transakce na rozsah logického horizontálního oddílu. Služba založená na virtuálních jádrech pro Azure Cosmos DB pro MongoDB podporuje transakce čtení a zápisu, které platí pro více logických horizontálních oddílů a napříč několika fyzickými horizontálními oddíly v clusteru.

Fyzické horizontální oddíly

Fyzické horizontální oddíly jsou základní počítače a disky zodpovědné za uchování dat a plnění databázových transakcí. Na rozdíl od logických horizontálních oddílů spravuje služba fyzické horizontální oddíly pod kryty.

Počet fyzických horizontálních oddílů se definuje při vytvoření clusteru. Clustery s jedním horizontálním oddílem mají jeden fyzický horizontální oddíl, který je zcela zodpovědný za transakce úložiště a databáze clusteru. Clustery s více horizontálními oddíly distribuují data a objem transakcí mezi fyzické horizontální oddíly v clusteru.

Mapování logických horizontálních oddílů na fyzické horizontální oddíly

Když se přidají nové logické horizontální oddíly, cluster bez problémů aktualizuje mapování logických na fyzické horizontální oddíly. Podobně se přiřazení adresního prostoru ke každému fyzickému horizontálnímu oddílu změní, protože se do clusteru přidají nové fyzické horizontální oddíly, po kterých se logické horizontální oddíly znovu vyrovnávají v rámci clusteru.

Rozsah hodnot hash používaný k mapování logických a fyzických horizontálních oddílů se rovnoměrně distribuuje mezi fyzické horizontální oddíly v clusteru. Každý fyzický horizontální oddíl vlastní rovnoměrně velký kbelík rozsahu hash. Pro každý dokument, který je zapsán, hodnota vlastnosti klíče horizontálního oddílu je hashována a hodnota hash určuje mapování dokumentu na podkladové fyzické horizontální oddíly. Interně se několik logických horizontálních oddílů mapuje na jeden fyzický horizontální oddíl. Logické horizontální oddíly se navíc nikdy nerozdělují mezi fyzické horizontální oddíly a všechny dokumenty logického horizontálního oddílu se mapují pouze na jeden fyzický horizontální oddíl.

Na základě předchozího příkladu pomocí clusteru se dvěma fyzickými horizontálními oddíly ukazuje tato tabulka ukázkové mapování dokumentů na fyzické horizontální oddíly.

ID dokumentu Hodnota klíče horizontálního oddílu Logický horizontální oddíl Fyzický horizontální oddíl
"12345" "Steve Smith" Shard 1 Fyzický horizontální oddíl 1
"23456" "Jane Doe" Shard 2 Fyzický horizontální oddíl 2
"34567" "Steve Smith" Shard 1 Fyzický horizontální oddíl 1
"45678" "Michael Smith" Shard 3 Fyzický horizontální oddíl 1
"56789" "Jane Doe" Shard 2 Fyzický horizontální oddíl 2

Kapacita fyzických horizontálních oddílů

Úroveň clusteru vybraná při zřízení clusteru určuje kapacitu procesoru a paměti fyzického horizontálního oddílu. Podobně skladová položka úložiště určuje kapacitu úložiště a IOPS fyzického horizontálního oddílu. Větší úrovně clusteru poskytují větší výpočetní výkon a větší paměť, zatímco větší disky úložiště poskytují větší úložiště a IOPS. Čtení náročných úloh přináší výhody z větší úrovně clusteru, zatímco úlohy s velkými nároky na zápis mají výhodu větší skladové položky úložiště. Po vytvoření clusteru na základě měnících se potřeb aplikace je možné vertikálně navýšit a snížit kapacitu vrstvy clusteru.

V clusteru s více horizontálními oddíly je kapacita každého fyzického horizontálního oddílu stejná. Vertikální navýšení kapacity vrstvy clusteru nebo skladové položky úložiště nezmění umístění logických horizontálních oddílů na fyzické horizontální oddíly. Po operaci vertikálního navýšení kapacity zůstane počet fyzických horizontálních oddílů stejný, takže nebude nutné znovu vyrovnát data v clusteru.

Výpočetní prostředky, paměť, úložiště a IOPS fyzického horizontálního oddílu určují prostředky dostupné pro logické horizontální oddíly. Klíče horizontálních oddílů, které nemají rovnoměrnou distribuci úložiště a svazků požadavků, můžou způsobit nerovnoměrnou spotřebu úložiště a propustnosti v rámci clusteru. Horké oddíly můžou způsobit nerovnoměrné využití fyzických horizontálních oddílů, což vede k nepředvídatelné propustnosti a výkonu. Proto horizontální clustery vyžadují pečlivé plánování předem, aby se zajistilo, že výkon zůstane konzistentní, protože se požadavky aplikace v průběhu času mění.

Sady replik

Každý fyzický horizontální oddíl se skládá ze sady replik, označovaných také jako sada replik. Každá replika hostuje instanci databázového stroje. Sada replik umožňuje úložiště dat v rámci fyzického horizontálního oddílu odolné, vysoce dostupné a konzistentní. Každá replika, která tvoří fyzický horizontální oddíl, dědí úložiště a výpočetní kapacitu fyzického horizontálního oddílu. Virtuální jádro Azure Cosmos DB pro MongoDB automaticky spravuje sady replik.

Osvědčené postupy pro horizontální dělení dat

  • Horizontální dělení ve službě Azure Cosmos DB pro virtuální jádro MongoDB se nevyžaduje, pokud úložiště a svazky transakcí kolekce nesmí překročit kapacitu jednoho fyzického horizontálního oddílu. Služba například poskytuje 32 TB disků na horizontální oddíl. Pokud kolekce vyžaduje více než 32 TB, měla by se horizontálně dělit.

  • Není nutné shardovat každou kolekci v clusteru s několika fyzickými horizontálními oddíly. Horizontálně dělené a neshardované kolekce mohou existovat ve stejném clusteru. Služba optimálně distribuuje kolekce v rámci clusteru, aby rovnoměrně využívala výpočetní prostředky a prostředky úložiště clusteru co nejvíce rovnoměrně.

  • U aplikací náročných na čtení musí být klíč horizontálního oddílu vybrán na základě nejčastějších vzorů dotazů. Nejčastěji používaný filtr dotazů pro kolekci by se měl vybrat jako klíč horizontálního dělení, aby se optimalizovalo nejvyšší procento databázových transakcí lokalizací vyhledávání do jednoho fyzického horizontálního oddílu.

  • U aplikací náročných na zápis, které upřednostňují výkon zápisu před čtením, by se měl zvolit klíč horizontálního dělení, který rovnoměrně distribuuje data mezi fyzické horizontální oddíly. Klíče horizontálních oddílů s nejvyšší kardinalitou poskytují nejlepší příležitost k rovnoměrné distribuci co nejrovnoměrněji.

  • Pro zajištění optimálního výkonu by velikost úložiště logického horizontálního oddílu měla být menší než 4 TB.

  • Pro zajištění optimálního výkonu by logické horizontální oddíly měly být rovnoměrně distribuovány v úložišti a vyžadovat svazek napříč fyzickými horizontálními oddíly clusteru.

Jak horizontálně dělit kolekci

Vezměte v úvahu následující dokument v databázi "kosmické práce" a v kolekci "employee"

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

Následující ukázka sharduje kolekci zaměstnanců v rámci databáze vesmírných objektů na vlastnost firstName.

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

Kolekci je také možné horizontálně dělit pomocí příkazu správce:

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

I když není ideální změnit klíč horizontálního oddílu po výrazném nárůstu kolekce ve svazku úložiště, lze k úpravě klíče horizontálního oddílu použít příkaz reshardCollection.

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

Kolekci je také možné horizontálně horizontálně dělit pomocí příkazu správce:

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

Osvědčeným postupem je vytvoření indexu ve vlastnosti klíče horizontálního oddílu.

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

Další kroky