Dělení a horizontální škálování ve službě Azure Cosmos DB

PLATÍ PRO: SQL API rozhraní API Cassandra rozhraní Gremlin API rozhraní API pro tabulky rozhraní API služby Azure Cosmos DB pro MongoDB

Azure Cosmos DB používá dělení na škálování jednotlivých kontejnerů v databázi, aby splňovala požadavky vaší aplikace na výkon. Při dělení jsou položky v kontejneru rozdělené na různé podmnožina označované jako logické oddíly. Logické oddíly se vytvářejí na základě hodnoty klíče oddílu , který je přidružený ke každé položce v kontejneru. Všechny položky v logickém oddílu mají stejnou hodnotu klíče oddílu.

Kontejner například obsahuje položky. Každá položka má jedinečnou hodnotu vlastnosti UserID . Pokud UserID slouží jako klíč oddílu pro položky v kontejneru a pro kontejner existuje 1 000 jedinečných UserID hodnot, pro kontejner se vytvoří 1 000 logických oddílů.

Kromě klíče oddílu, který určuje logický oddíl položky, má každá položka v kontejneru ID položky (jedinečné v rámci logického oddílu). Kombinace klíče oddílu a ID položky vytvoří index položky, který jedinečně identifikuje položku. Volba klíče oddílu je důležité rozhodnutí, které ovlivní výkon vaší aplikace.

Tento článek vysvětluje vztah mezi logickými a fyzickými oddíly. Popisuje také osvědčené postupy pro dělení a poskytuje podrobný přehled o tom, jak horizontální škálování funguje ve službě Azure Cosmos DB. Tyto interní podrobnosti není nutné pochopit, abyste vybrali klíč oddílu, ale probrali jsme je, abyste měli přehled o tom, jak Azure Cosmos DB funguje.

Logické oddíly

Logický oddíl se skládá ze sady položek, které mají stejný klíč oddílu. Například v kontejneru, který obsahuje data o výživě potravin, všechny položky obsahují foodGroup vlastnost. Jako klíč oddílu pro kontejner můžete použít foodGroup . Skupiny položek, které mají specifické hodnoty pro foodGroup, například Beef Products, Baked Productsa Sausages and Luncheon Meats, tvoří odlišné logické oddíly.

Logický oddíl také definuje obor databázových transakcí. Položky v rámci logického oddílu můžete aktualizovat pomocí transakce s izolací snímků. Při přidání nových položek do kontejneru se nové logické oddíly transparentně vytvoří systémem. Při odstranění podkladových dat se nemusíte starat o odstranění logického oddílu.

Počet logických oddílů v kontejneru není omezený. Každý logický oddíl může ukládat až 20 GB dat. Dobré možnosti klíče oddílu mají širokou škálu možných hodnot. Například v kontejneru, kde všechny položky obsahují foodGroup vlastnost, můžou se data v logickém Beef Products oddílu zvětšit až o 20 GB. Výběr klíče oddílu s širokou škálou možných hodnot zajistí, že kontejner dokáže škálovat.

Upozornění služby Azure Monitor můžete použít k monitorování, pokud velikost logického oddílu blíží 20 GB.

Fyzické oddíly

Kontejner se škáluje distribucí dat a propustnosti napříč fyzickými oddíly. Interně se jeden nebo více logických oddílů mapuje na jeden fyzický oddíl. Menší kontejnery mají obvykle mnoho logických oddílů, ale vyžadují jenom jeden fyzický oddíl. Na rozdíl od logických oddílů jsou fyzické oddíly interní implementací systému a jsou zcela spravované službou Azure Cosmos DB.

Počet fyzických oddílů v kontejneru závisí na následujících:

  • Zřízené množství propustnosti (každý jednotlivý fyzický oddíl může poskytovat propustnost až 10 000 jednotek žádostí za sekundu). Limit 10 000 RU/s pro fyzické oddíly znamená, že logické oddíly mají také limit 10 000 RU/s, protože každý logický oddíl je mapován pouze na jeden fyzický oddíl.

  • Celkové úložiště dat (každý jednotlivý fyzický oddíl může ukládat až 50 GB dat).

Poznámka

Fyzické oddíly představují interní implementaci systému a jsou zcela spravovány službou Azure Cosmos DB. Při vývoji řešení se nezaměřte na fyzické oddíly, protože je nemůžete ovládat. Místo toho se zaměřte na klíče oddílů. Pokud zvolíte klíč oddílu, který rovnoměrně distribuuje spotřebu propustnosti napříč logickými oddíly, zajistíte vyvážení spotřeby propustnosti napříč fyzickými oddíly.

Celkový počet fyzických oddílů v kontejneru není omezený. Vzhledem k tomu, že vaše zřízená propustnost nebo velikost dat roste, Azure Cosmos DB automaticky vytvoří nové fyzické oddíly rozdělením existujících oddílů. Rozdělení fyzických oddílů nemá vliv na dostupnost vaší aplikace. Po rozdělení fyzického oddílu budou všechna data v rámci jednoho logického oddílu stále uložena ve stejném fyzickém oddílu. Rozdělení fyzického oddílu jednoduše vytvoří nové mapování logických oddílů na fyzické oddíly.

Propustnost zřízená pro kontejner je rovnoměrně rozdělena mezi fyzické oddíly. Návrh klíče oddílu, který nedistribuuje požadavky rovnoměrně, může způsobit příliš mnoho požadavků směrovaných na malou podmnožinu oddílů, které se stanou "horkými". Horké oddíly vedou k neefektivnímu využití zřízené propustnosti, což může vést k omezování rychlosti a vyšším nákladům.

Fyzické oddíly kontejneru uvidíte v Storage částiokna Metriky Azure Portal:

Viewing number of physical partitions

Na výše uvedeném snímku obrazovky má /foodGroup kontejner jako klíč oddílu. Každý ze tří pruhů v grafu představuje fyzický oddíl. Rozsah klíčů oddílu na obrázku je stejný jako fyzický oddíl. Vybraný fyzický oddíl obsahuje 3 nejvýraznější logické oddíly velikosti: Beef Products, Vegetable and Vegetable Productsa Soups, Sauces, and Gravies.

Pokud zřídíte propustnost 18 000 jednotek žádostí za sekundu (RU/s), může každý ze tří fyzických oddílů využívat celkovou zřízenou propustnost 1/3. V rámci vybraného fyzického oddílu mohou logické klíče Beef Productsoddílu a Vegetable and Vegetable ProductsSoups, Sauces, and Gravies souhrnně využívat zřízených RU/s fyzického oddílu 6 000. Vzhledem k tomu, že zřízená propustnost je rovnoměrně rozdělená mezi fyzické oddíly kontejneru, je důležité zvolit klíč oddílu, který rovnoměrně distribuuje spotřebu propustnosti výběrem správného logického klíče oddílu.

Správa logických oddílů

Azure Cosmos DB transparentně a automaticky spravuje umístění logických oddílů do fyzických oddílů, aby efektivně splňovala škálovatelnost a požadavky na výkon kontejneru. Vzhledem k tomu, že se zvýší požadavky na propustnost a úložiště aplikace, Azure Cosmos DB přesune logické oddíly, aby se zatížení automaticky rozložilo do většího počtu fyzických oddílů. Další informace o fyzických oddílech

Azure Cosmos DB používá dělení na základě hodnot hash k rozložení logických oddílů mezi fyzické oddíly. Azure Cosmos DB hashuje hodnotu klíče oddílu položky. Výsledek s hodnotou hash určuje fyzický oddíl. Pak Azure Cosmos DB přidělí klíč prostoru hodnot hash klíčů oddílů rovnoměrně napříč fyzickými oddíly.

Transakce (v uložených procedurách nebo triggerech) jsou povoleny pouze u položek v jednom logickém oddílu.

Sady replik

Každý fyzický 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 vytvoří data uložená v rámci fyzického oddílu odolná, vysoce dostupná a konzistentní. Každá replika, která tvoří fyzický oddíl, dědí kvótu úložiště oddílu. Všechny repliky fyzického oddílu společně podporují propustnost přidělenou fyzickému oddílu. Azure Cosmos DB automaticky spravuje sady replik.

Menší kontejnery obvykle vyžadují pouze jeden fyzický oddíl, ale budou mít alespoň 4 repliky.

Následující obrázek ukazuje, jak se logické oddíly mapují na fyzické oddíly distribuované globálně. Sada oddílů na obrázku odkazuje na skupinu fyzických oddílů, které spravují stejné logické klíče oddílů v několika oblastech:

An image that demonstrates Azure Cosmos DB partitioning

Výběr klíče oddílu

Klíč oddílu má dvě komponenty: cestu klíče oddílu a hodnotu klíče oddílu. Pokud například jako klíč oddílu { "userId" : "Andrew", "worksFor": "Microsoft" } zvolíte "userId", jedná se o dvě součásti klíče oddílu:

  • Cesta klíče oddílu (například:/userId) Cesta klíče oddílu přijímá alfanumerické znaky a podtržítka (_). Vnořené objekty můžete použít také pomocí standardního zápisu cesty(/).

  • Hodnota klíče oddílu (Například: "Andrew"). Hodnota klíče oddílu může být řetězcové nebo číselné typy.

Informace o limitech propustnosti, úložiště a délky klíče oddílu najdete v článku o kvótách služby Azure Cosmos DB.

Výběr klíče oddílu je jednoduchá, ale důležitá volba návrhu v Azure Cosmos DB. Jakmile vyberete klíč oddílu, není možné ho změnit na místě. Pokud potřebujete změnit klíč oddílu, měli byste data přesunout do nového kontejneru s novým požadovaným klíčem oddílu.

Pro všechny kontejnery by měl klíč oddílu:

  • Být vlastnost, která má hodnotu, která se nezmění. Pokud je vlastnost vaším klíčem oddílu, nemůžete aktualizovat hodnotu této vlastnosti.

  • Má vysokou kardinalitu. Jinými slovy, vlastnost by měla mít širokou škálu možných hodnot.

  • Rovnoměrně rozprostřete spotřebu jednotek požadavků (RU) a úložiště dat napříč všemi logickými oddíly. Tím se zajistí i spotřeba RU a distribuce úložiště napříč vašimi fyzickými oddíly.

Pokud potřebujete transakce ACID s více položkami v Azure Cosmos DB, budete muset použít uložené procedury nebo triggery. Všechny uložené procedury a triggery založené na JavaScriptu jsou vymezeny na jeden logický oddíl.

Klíče oddílů pro kontejnery náročné na čtení

U většiny kontejnerů je potřeba při výběru klíče oddílu zvážit všechna výše uvedená kritéria. U velkých kontejnerů náročných na čtení ale můžete chtít zvolit klíč oddílu, který se v dotazech často zobrazuje jako filtr. Dotazy lze efektivně směrovat pouze na relevantní fyzické oddíly zahrnutím klíče oddílu do predikátu filtru.

Pokud je většina požadavků vaší úlohy dotazy a většina dotazů má filtr rovnosti na stejné vlastnosti, může být tato vlastnost dobrou volbou klíče oddílu. Pokud například často spouštíte dotaz, na který se filtruje UserIDUserID , výběr jako klíč oddílu by snížil počet dotazů napříč oddíly.

Pokud je ale kontejner malý, pravděpodobně nemáte dostatek fyzických oddílů, abyste se museli starat o dopad na výkon dotazů napříč oddíly. Většina malých kontejnerů v Azure Cosmos DB vyžaduje pouze jeden nebo dva fyzické oddíly.

Pokud se váš kontejner může zvětšit na více než několik fyzických oddílů, měli byste se ujistit, že vyberete klíč oddílu, který minimalizuje dotazy napříč oddíly. Kontejner bude vyžadovat více než několik fyzických oddílů, pokud platí některý z následujících oddílů:

  • Váš kontejner bude mít zřízených více než 30 000 RU.

  • Kontejner bude uchovávat více než 100 GB dat.

Použití ID položky jako klíče oddílu

Pokud má váš kontejner vlastnost, která má širokou škálu možných hodnot, je pravděpodobně skvělou volbou klíče oddílu. Jedním z možných příkladů takové vlastnosti je ID položky. U malých kontejnerů náročných na čtení nebo kontejnerů s velkými velikostmi je ID položky přirozeně skvělou volbou pro klíč oddílu.

ID položky systémové vlastnosti existuje v každé položce v kontejneru. Možná máte další vlastnosti, které představují logické ID vaší položky. V mnoha případech jsou to také skvělé možnosti klíče oddílu ze stejných důvodů jako ID položky.

ID položky je skvělou volbou klíče oddílu z následujících důvodů:

  • Existuje široká škála možných hodnot (jedno jedinečné ID položky na položku).
  • Vzhledem k tomu, že pro každou položku existuje jedinečné ID položky , má ID položky skvělou úlohu při rovnoměrné vyvážení spotřeby RU a úložiště dat.
  • Efektivní čtení bodů můžete snadno provést, protože klíč oddílu položky vždy znáte, pokud znáte JEHO ID položky.

Při výběru ID položky jako klíče oddílu je potřeba vzít v úvahu některé věci:

  • Pokud je ID položky klíčem oddílu, stane se jedinečným identifikátorem v celém kontejneru. Nebudete moct mít položky, které mají duplicitní ID položky.
  • Pokud máte kontejner náročný na čtení, který má hodně fyzických oddílů, dotazy budou efektivnější, pokud mají filtr rovnosti s ID položky.
  • Uložené procedury ani triggery nemůžete spouštět v několika logických oddílech.

Další kroky